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.

bentolor
źródło
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 .

ibizaman
źródło
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
user2718704
źródło
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.

mart1n
źródło
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.

Joe
źródło
Dzięki - zbliża się to do tego, czego szukałem.
bentolor