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.