git dodawać, zatwierdzać i wypychać polecenia w jednym?

220

Czy jest jakiś sposób na użycie tych trzech poleceń w jednym?

git add .
git commit -a -m "commit" (do not need commit message either)
git push

Czasami zmieniam tylko jedną literę, wypełnienie CSS lub coś takiego. Mimo to muszę napisać wszystkie trzy polecenia, aby wprowadzić zmiany. Istnieje wiele projektów, w których jestem tylko jednym popychaczem, więc to polecenie byłoby niesamowite!

Giedymina
źródło
10
Czy próbowałeś napisać skrypt powłoki?
Paul
W moim kodzie jest wiele zmian, kiedy zmieniasz tylko dopełnienie w css, jedną literę itp. Zatwierdzanie wiadomości i wszystkie te polecenia dodają dużo pracy. Nie próbowałem skryptu powłoki. Jak można to zrobić? Dzięki!
Gediminas
2
„(nie trzeba też zatwierdzać wiadomości)” images.wikia.com/dragonball/images/a/a7/Facepalm_227785.jpg
Ajedi32
2
jeśli robisz zatwierdzenie dla każdej pojedynczej instancji zmiany, robisz to źle. wykonaj polecenie po zakończeniu funkcji lub rozwiązaniu problemu (może to być pojedyncza zmiana)
Mark

Odpowiedzi:

236

Kompilowanie odpowiedzi @ Gavina:

Uczynienie lazygit funkcją zamiast aliasu pozwala przekazać argument. Dodałem następujące pliki do mojego .bashrc (lub .bash_profile, jeśli Mac):

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Pozwala to na dostarczenie komunikatu zatwierdzenia, takiego jak

lazygit "My commit msg"

Możesz oczywiście pogłębić tę kwestię, akceptując jeszcze więcej argumentów, takich jak to, które zdalne miejsce do przepchnięcia lub która gałąź.

btse
źródło
11
Ponowne uruchomienie nie jest potrzebne, po prostu zrób „source .bashrc”
Sambit Tripathy
25
przydałby się $*zamiast $1zapisywania, wpisując cytaty:lazygit My commit msg
Kai Carver
16
@KaiCarver Ładna myśl, ale osobiście mi się nie podoba. Zapobiega to używaniu wielu argumentów, a także jest sprzeczne z normalną konwencją pojedynczego ciągu arg z ciągami spakowanymi w cudzysłowy. W tym momencie jest to dla mnie druga natura (i zakładam, że wielu programistów). Pomijanie cytatów jest brudne.
btse
6
lazygit, najlepsze imię w historii!
user1447414 18.04.16
4
@bsese mnie bycia osobą dyplomatyczną + jest piątek. Oto funkcja korzystająca z sugestii @KaiCarver: function dirtygit() { git add . git commit -a -m "$*" git push }
OnklMaps,
84

W końcu dodałem alias do mojego .gitconfigpliku:

[alias]
    cmp = "!f() { git add -A && git commit -m \"$@\" && git push; }; f"

Stosowanie: git cmp "Long commit message goes here"

Dodaje wszystkie pliki, następnie używa komentarza do wiadomości zatwierdzenia i wypycha go do źródła.

Myślę, że to lepsze rozwiązanie, ponieważ masz kontrolę nad tym, czym jest komunikat zatwierdzenia.

Alias ​​można również zdefiniować z wiersza poleceń, co dodaje go do .gitconfig:

git config --global alias.cmp '!f() { git add -A && git commit -m "$@" && git push; }; f'
szaleństwo
źródło
6
Właśnie tego szukałem! Działa idealnie, dzięki! Nie mogłem znaleźć pełnego odwołania do składni ani szczegółowej listy poleceń. Co !f() { ... }; fdokładnie robi? Więcej wyjaśnień tej linii sprawi, że odpowiedź będzie jeszcze lepsza.
Dmitriy Gamolin
1
@DmitriyDemir Definiuje funkcję f, a następnie wywołuje ją.
Oliver,
Działa naprawdę dobrze. Dodałem git pullna początku, aby zmniejszyć fuzje.
Burhan
1
@Oliver Dlaczego jest w cudzysłowach? Dlaczego jest wykrzyknik? Czy f na końcu wywołuje funkcję? Co to jest „$ @”?
Philip Rego
@PililRego Wrong Oliver: p
Oliver
53

Chociaż zgadzam się z Wayne Wernerem w jego wątpliwościach, jest to technicznie opcja:

git config alias.acp '! git commit -a -m "commit" && git push'

Który określa uruchamiany alias commiti push. Użyj go jako git acp. Należy pamiętać, że takie aliasy „powłoki” są zawsze uruchamiane z katalogu głównego repozytorium git.

Inną opcją może być napisanie haka po zatwierdzeniu, który wykonuje wypychanie.

Aha, nawiasem mówiąc, rzeczywiście można przekazywać argumenty do aliasów powłoki. Jeśli chcesz przekazać niestandardową wiadomość zatwierdzenia, zamiast tego użyj:

git config alias.acp '! acp() { git commit -a -m "$1" && git push ; } ; acp'

(Oczywiście, teraz, trzeba będzie dać commit wiadomość: git acp "My message goes here!")

Tilman Vogel
źródło
@wlz Właśnie próbowałem i działa dobrze. Zauważ, że cały ciąg znajduje się w pojedynczych cudzysłowach. gitautomatycznie dodawano ucieczki (zaznaczone za pomocą git config -e)
Tilman Vogel,
Przepraszam, masz rację :). Bezpośrednio edytuję plik .gitconfig. „Uciekł już za pomocą \”.
wlz
2
Dlaczego nie jest to zaakceptowana odpowiedź? Robi to, o co poproszono. +1.
lucid_dreamer
1
W systemie Windows musiałem uciec od podwójnych cudzysłowów około 1 USD, aby uruchomić program PowerShell (używając ... \ "$ 1 \" ...)
DReimer
35

Myślę, że możesz źle zrozumieć przepływ pracy, dla którego został zaprojektowany git. (Aby wyjaśnić / poprawić, co miałem na myśli w komentarzu, nie potrzebujesz tego git add ., ponieważ commit -azwykle służy temu samemu celowi - dodawanie wszelkich zmian, które nie zostały jeszcze wprowadzone, jeśli pliki zostały już dodane)

Zazwyczaj robisz coś takiego:

# make some changes
$ git commit -a -m "Changed something"
# make some more changes
$ git commit -a -m "Changed something else"

myj, płucz, powtarzaj, dopóki nie skończysz funkcji X, nie osiągniesz punktu zatrzymania lub po prostu chcesz, aby inni widzieli, co zrobiłeś. To robisz

$ git push

Git nie jest SVN - ale wygląda na to, że próbujesz go użyć jako takiego. Można znaleźć niektóre z zasobów na końcu artykułu tutaj aby się przydać.

Wayne Werner
źródło
6
+1 za wyjaśnienie dotyczące przepływu pracy. Jednak git add .i git commit -a to nie to samo
Gabriele Petronella,
5
Dzięki za wyjaśnienie, ale GIT nie upadnie, jeśli wydane zostanie takie polecenie dla tych, którzy wiedzą, co robią ...
Gediminas
4
@Lucas: Doświadczeni programiści powiedzą ci, że ludzie, którzy proszą o automatyczne polecenie wypychania, nie wiedzą, co robią. Istnieje powód 3-etapowego sprawdzania kodu (jeśli korzystasz z gałęzi funkcji, 4-etapowy).
slebetman
1
@slebetman: Nie wyjaśniłem tego poprawnie. W przypadku aplikacji na Facebooku każdą zmianę należy wdrożyć na serwerze na żywo, nawet w celu programowania. Tak więc skonfigurowaliśmy haczyki do zatwierdzania, aby to zrobić. Dokonujesz zmiany, zatwierdzasz ją i widzisz zmianę w swojej aplikacji. Z git muszę dodać, ustawić, a następnie przesunąć, aby zobaczyć jedną zmianę. Czy to nie wygląda na przesadę?
SenG
1
Tak, ale nie musisz również zobowiązać się do testowania kodu. Powinieneś napisać kod, przetestować go, a następnie zatwierdzić i wypchnąć. Legendarne użycie lokalnych poleceń git w celu zapewnienia pewnego rodzaju funkcji „cofania” wielu plików jest używane bardziej w legendzie niż w rzeczywistości, z mojego doświadczenia.
Joe Strout
35

Używam tego w moim .bash_profile

gitpush() {
    git add .
    git commit -m "$*"
    git push
}
alias gp=gitpush

Wykonuje się jak

gp A really long commit message

Nie zapomnij uruchomić source ~/.bash_profilepo zapisaniu aliasu.

Rajender Joshi
źródło
1
Naprawdę to lubię. ... i dlatego adoptowałem go do mojego własnego ~ / .bash_profile;) dzięki .. +1
AO_ 18.04.17
28

Możesz użyć skryptu bash, ustawić alias, aby uruchomić dowolne polecenie lub grupę poleceń

git commit -am "your message" && git push 
vuhung3990
źródło
2
Jeśli chcesz odpowiedzieć na to pytanie, dodaj więcej komentarzy na temat jego działania. Odpowiedzi, które są po prostu zrzutem kodu, na ogół nie są dobrze odbierane. Zobacz jak odpowiedzieć .
Heretic Monkey
Myślę, że to powinna być poprawna odpowiedź. Ponieważ odpowiada na pytanie tak zwięźle, jak to możliwe. Wystarczy wpisać go w terminalu i działa! Jeśli nie chcesz dodawać aliasu, alternatywą byłoby po prostu utworzenie rozwinięcia textExpander i uruchomienie go za pomocą kombinacji klawiszy.
eonista
19

Ustaw jako alias w bash:

$ alias lazygit="git add .; git commit -a -m '...'; git push;";

Nazwać:

$ lazygit

(Aby ten alias stał się trwały, musisz dołączyć go do pliku .bashrc lub .bash_profile)

Gavin
źródło
Musisz dodać ten alias do .bashrc lub .bash_profile, aby stał się trwały
Gavin
Myślę, że ta strona może pomóc w wyjaśnieniu: serverfault.com/questions/3743/…
Gavin
17

Najprostszym rozwiązaniem byłoby:

git commit -a -m "commit" && git push

git add jest już zawarty w parametrze-commit, ale jeśli chcesz, możesz połączyć je wszystkie:

git add . && git commit -a -m "commit" && git push
michal.jakubeczy
źródło
10

W systemie Linux / Mac ta bardzo praktyczna opcja powinna również działać

git commit -am "IssueNumberIAmWorkingOn --hit Enter key
> A detail here --Enter
> Another detail here --Enter
> Third line here" && git push --last Enter and it will be there

Jeśli pracujesz nad nowym oddziałem utworzonym lokalnie, zmień git pushelement za pomocągit push -u origin branch_name

Jeśli chcesz edytować komunikat zatwierdzenia w edytorze systemu, to

git commit -a && git push 

otworzy edytor i po zapisaniu wiadomości również ją wypchnie.

Mcvkr
źródło
8

Możesz spróbować gitu .

Po raz pierwszy (węzeł js musi zostać zainstalowany):

npm install -g git-upload

Po tym:

gitu COMMIT_MSG

Aby wydać te trzy polecenia jednocześnie.

Dobrą rzeczą jest to, że nie musisz się martwić podczas ponownej instalacji systemu lub gdy chcesz to zrobić na różnych komputerach i nie jest wymagana modyfikacja pliku. Działa to również na różnych platformach (nie tylko Linux i Mac, ale także Windows w wierszu poleceń, jak cmdi powershell), tylko że musisz zainstalować npmi nodejs( gitoczywiście).

Frytki
źródło
6

Jeśli plik jest już śledzony, nie trzeba go uruchamiać git add , możesz po prostu napisaćgit commit -am 'your message'

Jeśli nie chcesz pisać wiadomości zatwierdzenia, możesz rozważyć zrobienie czegoś takiego

git commit --allow-empty-message -am ''

Peter Foti
źródło
4

Ten wynik - spróbuj tego: Proste polecenie skryptu dla git add, git commit i git push

Otwórz CMD w systemie Windows i wklej tę odpowiedź

git commit -m "your message" . && git push origin master

Ten przykład mojego zrzutu ekranu: https://i.stack.imgur.com/2IZDe.jpg

Anang Hanafi
źródło
3

Jak wspomniano w tej odpowiedzi, możesz utworzyć alias git i przypisać do niego zestaw poleceń. W takim przypadku byłoby to:

git config --global alias.add-com-push '!git add . && git commit -a -m "commit" && git push'

i używaj go z

git add-com-push
Cristianzamar
źródło
1
To nie dodaje niczego do żadnej z poprzednich odpowiedzi.
BanksySan
Przepraszam, masz rację. Myślę, że nie zauważyłem, że odpowiedź Tilmana Vogla była taka sama jak moja .. Czy powinienem ją usunąć?
cristianzamar,
3

Napisz mały skrypt o nazwie gitpush.sh z poniższymi wierszami i dodaj go do swojego katalogu ~.

echo $1
git add .
git commit -m "$1"
git push

Teraz dodaj alias do ~ / .bashrc jak poniżej:

alias gitpush='~/gitpush'

Teraz z dowolnego repozytorium git po prostu napisz „wiadomość” gitpush.

Vaneet Kataria
źródło
2

Używam pliku wsadowego:

@ECHO OFF
SET /p comment=Comment:
git add *
git commit -a -m "%comment%"
git push
Márcio Souza Júnior
źródło
probs byłby łatwiejszy, gdybyś zaakceptował argumenty z wiersza poleceń. po prostu używam „lezygit MESSAGE” itp. jest całkiem fajny!
John Hon
1

Występują pewne problemy z powyższymi skryptami:

shift „usuwa” parametr $ 1, w przeciwnym razie „push” przeczyta go i „źle zrozumie”.

Moja wskazówka:

git config --global alias.acpp '! git add -A && branchatu = "$ (git symbolic-ref HEAD 2> / dev / null)" && branchatu = $ {branchatu ## refs / heads /} && git commit - m "$ 1" && shift && git pull -u origin $ branchatu && git push -u origin $ branchatu '

Rubens
źródło
1

Jeśli chcesz, aby svn zachowywał się w git commit, użyj tego w aliasach git w .gitconfig

commit = "!f() { git commit \"$@\" && git push; };f"

Rik van der Heijden
źródło
1

Jeśli używasz skorupy ryby (budując odpowiedź btse):

Zapisz ten plik w pliku „~ / .config / fish / functions” jako „quickgit.fish”. Utwórz katalog, jeśli nie istnieje. '--git-dir = $ PWD / .git' Zapewnia, że ​​uruchamiamy polecenia git przeciwko projektowi git, w którym wywołaliśmy funkcję

function quickgit # This is the function name and command we call
    git --git-dir=$PWD/.git add . # Stage all unstaged files
    git --git-dir=$PWD/.git commit -a -m $argv # Commit files with the given argument as the commit message
    git --git-dir=$PWD/.git push # Push to remote
end

Zrestartuj terminal, przejdź do projektu, dokonaj zmian, a teraz możesz wywołać „przykładową wiadomość typu quickgit” „”. Zmiany będą teraz dodawane, zatwierdzane i wypychane :).

Można również znaleźć jako Gist tutaj: https://gist.github.com/Abushawish/3440a6087c212bd67ce1e93f8d283a69

Abushawish
źródło
1

Jest już wiele dobrych rozwiązań, ale oto rozwiązanie, które uważam za bardziej eleganckie w sposobie, w jaki chcę pracować:

Umieszczam skrypt na swojej ścieżce o nazwie „git-put”, który zawiera:

#!/bin/bash
git commit "$@" && git push -u

To pozwala mi uruchomić:

git put -am „moja wiadomość zatwierdzenia”

.. aby dodać wszystkie pliki, zatwierdzić je i wypchnąć.

(Dodałem również „-u”, ponieważ lubię to robić, mimo że nie jest to związane z tym problemem. Zapewnia to, że gałąź upstream jest zawsze skonfigurowana do ściągania.)

Podoba mi się to podejście, ponieważ pozwala także na użycie polecenia „git put” bez dodawania wszystkich plików (pomiń „-a”) lub z innymi opcjami, które chciałbym przekazać, aby zatwierdzić. Również „put” to krótki film „push” i „commit”

chichot
źródło
1

Jeśli używasz VSCode, możesz pobrać to rozszerzenie, które pozwoli ci to zrobić za pomocą jednego prostego skrótu klawiaturowego.

Alfred
źródło
1

Jeśli używasz komputera Mac:

  1. Uruchom Terminal Wpisz „cd ~ /”, aby przejść do katalogu domowego

  2. Wpisz „touch .bash_profile”, aby utworzyć nowy plik.

  3. Edytuj .bash_profile za pomocą swojego ulubionego edytora (lub możesz po prostu wpisać „open -e .bash_profile”, aby otworzyć go w TextEdit).

  4. Skopiuj i wklej poniżej do pliku:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Następnie zrestartuj terminal i po prostu dodaj, zatwierdź i wciśnij jedną prostą komendę, przykład:

lazygit "This is my commit message"
AdilOoze
źródło
1

Dla użytkowników MAC VSC najlepsza konfiguracja to:

1) naciśnij „shift + cmd + P” i wpisz:

Shell Command: install 'code' command in PATH

Naciśnij klawisz ENTER (spowoduje to zainstalowanie polecenia kodu, aby łatwo uzyskać dostęp do pliku bash_profile)

2) możesz teraz uruchomić: code ~/.bash_profileaby otworzyć pusty bash_profile

3) wprowadź tam nową funkcję:

function lazygit() {
    git add .
    git commit -m "$*"
    git push
}

4) teraz uruchom ponownie VSC

5) wprowadź zmianę, zapisz ją i wpisz, lazygit messageaby uruchomić trzy polecenia jednocześnie

AGrush
źródło
1

Dla użytkowników systemu macOS:

  1. Otwórz Terminal lub iTerm2 terminala lub inną, którego używasz.

  2. Przejdź do folderu profilu użytkownika za pomocą polecenia ~/. Jest to domyślny folder dla .bash_profilepliku:

Przykład folderu użytkownika

  1. Wpisz nano .bash_profileTo polecenie otworzy .bash_profiledokument (lub utworzy go, jeśli jeszcze nie istnieje) w najłatwiejszym w użyciu edytorze tekstu dla terminala - nano.

  2. Teraz możesz dokonać prostej zmiany w pliku. Wklej te wiersze kodu, aby zmienić monit w terminalu:

function lazygit() {
    git add .
    git commit -a -m "$1"
    git push
}

Nano edycja tekstu

  1. Teraz zapisz zmiany, pisząc ctrl + oi naciskając Return, aby zapisać. Następnie wyjdź nano, pisząc ctrl + x.

  2. Teraz musimy aktywować twoje zmiany. Wpisz source .bash_profile(lub . ~/.bash_profile) i obserwuj swoją szybką zmianę.

  3. W iTerm2 Preferences/Profiles/General/Commandustaw na Login Shelli Send text at startna source ~/.bash_profile. Nie musisz więc robić tego ręcznie po każdym restarcie systemu macOS. Preferencje iTerm 2

Poświadczenia: https://natelandau.com/my-mac-osx-bash_profile

rusakovic
źródło
0

Zrobiłem ten skrypt .sh dla polecenia

#!/bin/sh
cd LOCALDIRECTORYNAME/  
git config --global user.email "YOURMAILADDRESS"
git config --global user.name "YOURUSERNAME"
git init
git status
git add -A && git commit -m "MASSAGEFORCOMMITS"
git push origin master
acs
źródło
0

Ponieważ pytanie nie określa, która powłoka, oto wersja eshell oparta na wcześniejszych odpowiedziach. To znajduje się w pliku aliasu eshell, który może znajdować się w ~ / .emacs.d / eshell / alias Dodałem pierwszą część z https://github.com/rupa/z/, która pozwala ci szybko cd do katalogu , dzięki czemu można go uruchomić bez względu na bieżący katalog.

alias census z cens; git add .; git commit -m "fast"; git push
בנימן הגלילי
źródło
0

Dodaj ~/.bash_profiledo dodawania, zatwierdzania i wypychania za pomocą jednego polecenia:

function g() { git commit -a -m "$*"; git push; }

Stosowanie:

g your commit message
g your commit message 'message'

Nie są potrzebne cudzysłowy, chociaż nie można używać średników ani nawiasów w komunikatach zatwierdzania (dozwolone są pojedyncze cudzysłowy). Jeśli chcesz któreś z nich, po prostu wstaw w cudzysłowie podwójny cudzysłów, np .:

g "your commit message; (message)"

Aby utworzyć komentarz w swojej wiadomości:

g "your commit message:
> your note"

Istnieje również funkcja dodawania i zatwierdzania w podobny sposób:

function c() { git add --all; git commit -m "$*"; }

Działa dokładnie tak samo jak ta gfunkcja i ma te same ograniczenia. Po prostu czamiast tego. Na przykład

c your commit message

Możesz także dodać alias do wypychania do pilota:

alias p='git push'

Stosowanie:

p

Że ilości do 2 liter, ci pużywasz podczas pracy z repozytorium git. Lub możesz użyć gzamiast tego, aby zrobić to wszystko za pomocą tylko jednej litery.

Pełna lista aliasów i funkcji: https://gist.github.com/matt360/0c5765d6f0579a5aa74641bc47ae50ac

Ciasto marchewkowe
źródło
0

Opierając się na lazygitodpowiedzi, poniższe rozwiązanie dodaje kontrolę użytkownika, aby zweryfikować zmiany przed wypchnięciem. W przypadku anulowania cofnie polecenia. A wszystko to stanie się wtedy i tylko wtedy, gdy nastąpią zmiany w lokalnym repozytorium.

### SAFER LAZY GIT
function lazygit() {
  git add .
  if git commit -a -m "$1"; then
    read -r -p "Are you sure you want to push these changes? [y/N]} " response
    case "$response" in
      [yY][eE][sS]|[yY])
        git push
        ;;
      *)
        git reset HEAD~1 --soft
        echo "Reverted changes."
        ;;
    esac
  fi
}
Matthew Cordaro
źródło
0

Jest to idealne rozwiązanie do grupowania poleceń.

Polecenia grupowania

{lista; } Umieszczenie listy poleceń między nawiasami klamrowymi powoduje, że lista jest wykonywana w bieżącym kontekście powłoki. Nie jest tworzona podpowłoka. Wymagana jest następująca lista średników (lub znaków nowej linii).

legit(){ git add --all; git commit -m "$1"; git push origin master; }
legit 'your commit message here'
Gothburz
źródło
1
To nie zadziała, jeśli komunikat zatwierdzenia ma spacje między nimi
Rohit
0

Lubię uruchomić następujące:

git commit -am "message";git push
etoksyna
źródło
Myślę, że ;należy zastąpić &&w poleceniu, ponieważ później wykona git pushpolecenie tylko wtedy, gdy nie ma błędu w poprzednich poleceniach.
Tom
0

Okazało się, że ten yolo alias jest niesamowity, nawet jeśli jestem leniwy, aby przesłać losowy komentarz do zatwierdzenia. Działa naprawdę dobrze po wyjęciu z pudełka, więc po prostu to robię, git yoloa wszystkie moje zmiany są wypychane automatycznie.

jamescampbell
źródło