2011-11-04 11 views
5

(Uwaga, ja nie szukam odpowiedzi git rebase -i)Jak mogę "ponownie otworzyć" zatwierdzenie git?

W mercurial, mogę „wznowienie” commit importując go do mojego plastra kolejki:

hg qimport tip 

popełnić jest „otwarty” w tym sensie, że to jest tak, jak przed popełnieniem tego, mogę odwrócić, zrobić hg diff, hg status, itp. Jak to zrobić w git?

(wszystko znalazłem w internecie sugeruje git rebase -i a następnie wybierz zmienił, ale to co innego, bo popełnić nie jest „otwarty” w ten sam sposób).

+0

Inną opcją jest pozostawienie zatwierdzenia tam, zmiana kilku innych rzeczy, a następnie użycie ich do * zmiany * zatwierdzenia ('git commit --amend'). – Cascabel

Odpowiedz

16

Wystarczy przesunąć kursor głowa do góry bez dokonywania jakichkolwiek zmian w kopii roboczej:

git reset --soft HEAD^ 

reset przesuwa wskaźnik, a opcja miękkie określa, że ​​nie należy zmieniać dowolnych plików. Wartość domyślna jest mieszana, co spowoduje zresetowanie indeksu, a twarda opcja spowoduje usunięcie zmian od czasu zatwierdzenia w kopii roboczej.

HEAD jest "magicznym" wskaźnikiem git, który zawsze wskazuje bieżący ref (tzn. Rodzic kopii roboczej). Karetka (^) wskazuje rodzica. Możesz użyć tego wielokrotnie, np. HEAD ^^ odnosi się do rodzica ostatniego zatwierdzenia.

+0

Świetna odpowiedź, dzięki! Czy mógłbyś zanotować, że straciłeś wiadomość o zatwierdzeniu, tak jak zrobił to @wulong? –

+0

Jeśli rzeczywiście chcesz go używać wielokrotnie, 'HEAD ^^^^^' jest tym samym, co 'HEAD ~ 5'. (A dokładniej, 'HEAD' jest symbolicznym ref, wskazującym na aktualnie wyewidencjonowaną gałąź, która wskazuje na aktualnie wyewidencjonowany commit, lub bezpośrednio na commit, jeśli jesteś w stanie oddzielenia HEAD, bez oddziału sprawdzonego out.) – Cascabel

+3

@PaulBiggar: Uniknięcie utraty wiadomości o zatwierdzeniu jest doskonałym powodem do zmiany zamiast resetowania. Jeśli zresetujesz, możesz mimo to odzyskać pośrednio komunikat zatwierdzenia. 'HEAD @ {1}' odnosi się do wcześniej sprawdzonego zatwierdzenia, które (jeśli nie zrobiłeś nic więcej) będzie pre-resetować commit. Możesz użyć 'git commit -c HEAD @ {1}', aby użyć swojego komunikatu commit jako miejsca początkowego. (Jeśli od tego czasu przesuwałeś HEAD, możesz użyć 'git reflog', aby znaleźć commit dalej z powrotem w reflogach.) – Cascabel

2

Zakładając, że nie masz jeszcze przekazane do zdalnego repozytorium, git reset --soft HEAD^ "ponownie otworzy" twoje ostatnie zatwierdzenie kosztem utraty komunikatu zatwierdzenia.

2

Ten sam wynik można uzyskać za pomocą git commit --amend.

Zobacz comparison chart między Hg & Git.