git: przerwij zatwierdzanie w środku wpisywania wiadomości


137

Jestem w trakcie zobowiązania. Napisałem wiadomość o zatwierdzeniu w vimie. Przypomniałem sobie, że muszę coś zmienić. Zdaję sobie sprawę, że istnieją inne możliwości osiągnięcia tego, co chcę, ale chcę wiedzieć, czy istnieje sposób na przerwanie zatwierdzenia, ale nadal zapisuje komunikat o zatwierdzeniu, który wpisałem do tej pory.

Odpowiedzi:


86

Tak. Napisz wiadomość o zatwierdzeniu do innego pliku ( :w /some/other/path.txt). Następnie zamknij edytor bez zapisywania ( :q!). Jeśli wcześniej zapisałeś plik w oryginalnej ścieżce, usuń wszystko i najpierw napisz pusty plik (pusty komunikat o zatwierdzeniu spowoduje przerwanie zatwierdzenia).

Teraz, gdy będziesz gotowy do zatwierdzenia „na poważnie”, użyj pliku wiadomości zapisanego w alternatywnej ścieżce.

Alternatywnie, skopiuj wiadomość o zatwierdzeniu do jednego z buforów vima.

Warto zauważyć, że naprawdę nie musisz tego robić : commit --amendpozwala zmienić zatwierdzenie po jego wykonaniu, więc prostym rozwiązaniem jest utworzenie zatwierdzenia z tym, co masz, a następnie naprawienie go przed naciśnięciem. Możesz nawet zakończyć zatwierdzenie w stanie zepsutym reset HEAD~(resetuje cię do stanu, w jakim znajdowała się twoja kopia robocza przed zatwierdzeniem), naprawić kopię roboczą, a następnie commit -a -c HEAD@{1}użyć starego komunikatu o zatwierdzeniu.


7
Uwaga: wyjdź z Vima używając ": q!" nie przerwie zatwierdzenia, jeśli pojawi się automatycznie wypełniony komunikat o konflikcie scalania. Zamiast tego zatwierdzanie będzie kontynuowane, a komunikat nie wyświetli listy plików, w których wystąpił konflikt.
stephenbez

write the empty file (an empty commit message will abort the commit)część działała jak urok, dzięki!
Саша Давиденко

190

Jeśli edytor może zakończyć pracę z kodem błędu - Git przerwie zatwierdzanie. Używając VIM, wpisz

:cq

aby wyjść z niezerowym kodem błędu i przerwać zatwierdzanie.


5
To fajna sztuczka do przerwania a, commit --amendponieważ w przeciwnym razie musiałbyś usunąć istniejący komunikat o zatwierdzeniu i :wq.
Alex Jasmin

2
Niezła sztuczka! Jednak pytanie brzmiało, jak zapisać komunikat dotyczący zmiany, a nie go usunąć.
Elijah Lynn

więc jak svn udaje się to zrobić? na co to wygląda oprócz kodu wyjścia?
Chaim Geretz

1
świetnie, gdy robisz interaktywną rebase, czyli zgniatanie zatwierdzeń
hellatan

uratował mi życie, kiedy zrobiłem git commit --amendzamiast git rebase --continuepodczas rebase.
Weishi Zeng

68

Jeśli otworzyłeś Vima, aby napisać wiadomość o zatwierdzeniu, po prostu usuń linie, które nie zaczynają się od #, a git przerwie twoje zatwierdzenie

Aborting commit due to empty commit message.

11
Jest to szczególnie przydatne, gdy chcesz przerwać polecenie git - popraw.
edsko

1
Pytanie brzmiało, jak przerwać zatwierdzenie, ale zapisać komunikat o zatwierdzeniu. Usunięcie wierszy, które nie zaczynają się od # skutecznie usuwa komunikat o zatwierdzeniu, a nie zapisuje komunikat o zatwierdzeniu. Nie jestem pewien, jak to ma tak wiele pozytywnych głosów.
Elijah Lynn

2
ggdGusunie całą treść wiadomości, a następnym razem, gdy uruchomisz vim, możesz po prostu Pwyciąć poprzednio tekst.
oromoiluig

działa przy użyciu nano, ctrl + k wszystkich linii, a następnie zapisze i wyjdzie
przerwie

9

Chociaż możesz przerwać zatwierdzanie, innym podejściem jest późniejsza zmiana zatwierdzenia. Po prostu zatwierdź swoją obecną pracę, wprowadź dowolne dodatkowe zmiany, które chcesz git add, a następnie uruchom git commit --amend. Zostaniesz przeniesiony z powrotem do edytora wiadomości o zatwierdzeniu, a kiedy zapiszesz, zatwierdzenie zostanie poprawione tak, aby zawierało dodatkowe zmiany i nowy komunikat o zatwierdzeniu.


7

Tak, to możliwe. Aby zatwierdzić, Twój edytor MUSI zapisać komunikat o zatwierdzeniu do pliku.git/COMMIT_EDITMSG i wyjść z kodem statusu 0.

Więc jeśli używasz VI / VIM, możesz wykonać następujące czynności ...

  1. Napisz wiadomość o zatwierdzeniu.
  2. Zapisz wiadomość o zatwierdzeniu za pomocą :w(domyślnie zapisze to bieżącą zawartość .git/COMMIT_EDITMSG)
  3. Zamknij edytor z błędem :cq
  4. ... rób to, co musisz zrobić ... nawet dodaj / usuń pliki do obszaru przemieszczania.
  5. Kontynuuj edycję istniejącej wiadomości o zatwierdzeniu za pomocą git commit -eF .git/COMMIT_MESSAGE

-F /path/to/fileWypełni edytor z danej treści z / ścieżka / do / pliku. Jednak domyślnie spowoduje to natychmiastowe wykonanie zatwierdzenia, chyba że dodatkowo dostarczysz -eflagę do edycji .


to działa, ale jest mniej korzystne, ponieważ 1) zakłada, że ​​CWD to miejsce, w którym znajduje się folder .git 2) Używam drzew roboczych git , aw przypadku drzew roboczych git, plik .git jest w rzeczywistości plikiem wskazującym, gdzie jest prawdziwy folder.
Alexander Bird

@AlexanderBird to nieprawda ... kiedy chcesz odebrać stary komunikat o zatwierdzeniu w kroku 5), musisz po prostu określić ścieżkę względną (powiedzmy, że jesteś w /foo/bar/katalogu, względna względem katalogu głównego projektu), np.git commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek

@AlexanderBird fajny, jeszcze nie zauważyłem z funkcją wielu działających drzew w git. Dzięki za podpowiedź! Uważam, że jedynym minusem jest to, że musiałbyś mieć w głowie ogólny przegląd, co uniemożliwia skupienie się na rzeczywistym kodzie. I tylko po to, żeby odebrać wiadomość o zatwierdzeniu na "gdzie skończyłem" jest trochę ciężka :)
Rudolf Tucek

1
@AlexanderBird to zamiast :wrobić :sav committmpigit commit -eF committmp
Hashbrown

0

Zwykle dokonuję zatwierdzeń w IntelliJramach dostarczonych terminali. Niestety moje zatwierdzenia są ręczne:

git commit -m'my message' // etc

więc myślę, że jedyną rzeczą, którą można bezpiecznie zrobić, jest po prostu zamknięcie okna terminala! Po prostu zaznacz swój tekst, jeśli chcesz go zapisać, a następnie skopiuj, a następnie zamknij okno terminala.


-2

@bdonlan odpowiedź jest dobra na to pytanie, ale wskażę sytuację, w której możesz potrzebować lepszego rozwiązania.

Powiedzmy, że chcesz dodać zmiany do ostatniego zatwierdzenia. Więc postępuj zgodnie z sugestią @bdolan:

git add files
git commit --amend

Wyobraź sobie, że podczas pisania nowej wiadomości żałujesz, że dodajesz te pliki do tego zatwierdzenia. Problem polega na tym, że utknąłeś z już zapisanym komunikatem o zatwierdzeniu i wyjście z edytora (z zapisaniem lub bez) doda te zmiany do ostatniego zatwierdzenia. Powrót do punktu, w którym byłeś przed tymi czynnościami, wymaga podzielenia ostatniego zatwierdzenia - założę się, że chcesz tego uniknąć.

Sztuczka polega na tym, aby zapisać i wyjść z edytora, gdy ma on tylko wiersze zaczynające się #lub nie ma ich wcale. Po wyjściu zostaniesz powitany komunikatem:

Aborting commit due to empty commit message.

I w ogóle nie zmieniłeś ostatniego zatwierdzenia.


Jeśli rozumiem, że to, co mówisz, jest problemem, to masz rację; jak pokazano tutaj: git commit; vim ....; git commit --amend; git reset HEAD@{1}. To znaczy: jeśli chcę „cofnąć” poprawkę, nie muszę rozdzielać poprzedniego zatwierdzenia. obiekt zatwierdzenia, który był HEAD przed poprawką, jest zapisywany jako HEAD@{1}. Ponadto zetta już zasugerowała usunięcie wszystkich linii nie będących komentarzami.
Alexander Bird
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.