Git: Jak ponownie używać / zachowywać komunikaty o zatwierdzeniach po „git reset”?


104

Jako użytkownik Gita regularnie spotykam się z sytuacją, w której muszę przerobić jedno lub więcej zatwierdzeń w sposób, który nie pasuje do --amendlub rebase -iz zatwierdzeniami poprawek. Zwykle zrobiłbym coś takiego

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Traktuję rozsądnie skomponowane komunikaty o zmianach całkiem poważnie. Zazwyczaj zawierają większy tekst z odniesieniami i uzasadnieniem zmiany. Do tej pory jestem bardzo zły na długi proces, aby odzyskać moje stare popełnić wiadomość za pomocą sortowania git reflog, git loga następnie skopiować i wkleić proces.

Czy jest lepszy sposób na rozwiązanie tego problemu? A jak by to było, gdyby moje składało się z więcej niż jednego zatwierdzenia?

Edycja: Po krótkim zastanowieniu myślę, że to, czego szukam, to funkcjonalność podobna do git stash dla komunikatów o zmianach, w których zatwierdzenia poprawek / zmian nie są odpowiednie.


2
Gdyby wszystko, co zrobiłeś, to git reset head~1, czy twój stary komunikat dotyczący zmiany nie byłby po prostu drugim wpisem w reflog?

Tak - ale jak mógłbym ponownie wykorzystać wiadomość bez kopiowania i wklejania (co zazwyczaj wymaga ręcznego
cofnięcia wcięcia

Teraz po prostu gitkotwórz. W ten sposób nie będziesz musiał nawet używać reflogu. Alternatywnie, użyj, rev-parse <branch>aby uzyskać hash przed zresetowaniem i użyj odpowiedzi od ibizaman.
cst1992

Odpowiedzi:


144

Po git resetjednym linijce może to zrobić:

git commit --reuse-message=HEAD@{1}

lub jeszcze krócej:

git commit -C HEAD@{1}

Możesz użyć innych opcji podanych przez @ user2718704 .


6
Krótszy:git commit -C@@{1}
Phu Ngo,

2
To fantastyczne użycie refloga
David Mann,

24
Po zresetowaniu ustawiany jest ORIG_HEAD. Uważam, że git commit --reuse-message=ORIG_HEADjest to najbardziej jasne.
Scott Jacobsen

45

Podczas uruchamiania polecenia „git commit” musisz sprawdzić następujące opcje,

Do ponownego wykorzystania,

--reuse-message=<commit>

Aby edytować przy ponownym użyciu,

--reedit-message=<commit>

Aby zmienić autora,

--reset-author

1
Oznaczono to jako nowe rozwiązanie, ponieważ dostarczyło najbardziej wyczerpującej odpowiedzi. Chociaż to rozwiązanie nadal nie rozwiązuje w pełni moich problemów z „odzyskiwaniem”.
bentolor

9

Po co resetować, jeśli możesz hakować, naprawiać, hakować i po prostu biegać git commit --amend --no-edit; w ten sposób zachowując oryginalny komunikat o zatwierdzeniu.

Aby to działało dla wielu zatwierdzeń, po prostu utwórz tymczasowe zatwierdzenie z najnowszymi zmianami, a następnie użyj interaktywnej rebase, aby zmiażdżyć poprzednie zatwierdzenie (zawierające dobry komunikat o zatwierdzeniu) z nowym tymczasowym, zachowując komunikat o zatwierdzeniu ze starego zatwierdzenia.


2
Podczas wykonywania interaktywnej rebase możesz nawet użyć fixupinstrukcji, aby zadeklarować, że późniejsze zatwierdzenie ma na celu naprawienie poprzedniego zatwierdzenia i automatycznie użyje komunikatu o zatwierdzeniu z oryginału, odrzucając komunikat z zatwierdzenia poprawkowego.
qqx

Na przykład, jeśli chcę ponownie scalić żądania ściągnięcia zaktualizowane na siłę. Lub jeśli zatwierdzenie nie jest ostatnim i nie można go łatwo naprawić w oparciu o HEAD i łatwiej jest je powtórzyć.
bentolor

@BenTebulin Cóż, interaktywna rebase pozwala modyfikować dowolne zatwierdzenie w zakresie określonych zatwierdzeń. To nie jest wyłącznie zatwierdzenie HEAD, które musi zostać zmodyfikowane.
mart1n

@ mart1n Dzięki za wyróżnienie edycji w rebase -i. Nigdy nie użyłem go w tym kontekście. W pozostałych przypadkach, takich jak ponowne połączenie, druga odpowiedź jest bardziej odpowiednia dla mojego pytania, więc oznaczyłem ją jako odpowiedź.
bentolor

Intellij ma zakresy, które działają tylko na plikach, które nie zostały jeszcze zatwierdzone. Przydatne jest zresetowanie plików do niezatwierdzonych, aby na przykład intellij mógł zostać poinstruowany, aby lintować pliki, a następnie ponownie zatwierdzić te pliki z tym samym komunikatem. poprawka nie zadziała z powodu ograniczeń zakresu Intellij.
David Mann,

5

Możesz rozważyć git commit --reset-author -c <commit>ponowne użycie komunikatu o zmianach przy edycji i bieżącym czasie.


Dzięki - zbliża się to do tego, czego szukałem.
bentolor
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.