2010-12-21 13 views
15

edytowany plik i tak:Jak mogę cofnąć moje ostatnie dodanie/zatwierdzenie git?

git add file.py 
git commit -m 'fixed bug' 

I następnie edytować inny plik i przeprowadzono drobne poprawki błędów. Nie chcę dwóch commitów, jeden po drugim, pokazujących "naprawę błędów". Chcę jeden commit z "poprawkami błędów".

Jak mogę cofnąć ostatnie dodanie/zatwierdzenie i zmienić pierwszy komunikat zatwierdzenia?

Szukałem na git reset, git revert, git undo poleceń ale ja nie chcę zepsuć mojego repo z przypuszczeniem

EDIT: Okazało się, jak to zrobić: http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

Odpowiedz

26

jeśli już popełnione swoją drugą zmianę, zresetować go najpierw:

git reset HEAD^ 

teraz twój HEAD jest na pierwszym popełnienia, a zawartość lokalnych plików jest niezmieniona.

git add <the file(s) for the second bug fix> 
git commit --amend -m'bug fixes' 

Jeśli wszystkie śledzone i zmienione pliki mają być włączone do drugiego bug fix, można uruchomić ten zamiast, jak zwykle:

git commit -a --amend 

zmieniający popełnić jest dokładnie to:

  • dodaje zmiany w indeksie do poprzedniego zatwierdzenia (dlatego potrzeba git add lub -a)
  • pozwala na c hange twój komunikat zatwierdzenia

Uważaj jednak: jeśli rozprowadziłeś pierwsze zatwierdzenie, repo drugiego użytkownika stanie się dziwne. Nie powinieneś zmieniać zatwierdzenia, które ktoś inny pobrał.


Można też prawdopodobnie używać git merge --squash, który czuje się bardziej logiczne, ale niekoniecznie łatwiejsze. Użyj go, aby scalić gałąź zawierającą twoje dwa zatwierdzenia, do poprzedniego zatwierdzenia.

Spłukiwanie działa również z git rebase.

+0

Z dwoma plikami I, które edytowałem, już zrobiłem 'git add file; git commit'. Czy zrobienie 'git --amend -m 'asd'' wystarczy edytować poprzedni komunikat zatwierdzenia, czyż nie? Zostawiasz pierwsze zatwierdzenie w dzienniku? – dave

+0

Nie, '--amend' dodaje zawartość indeksu do nowo utworzonego zatwierdzenia. Stare zatwierdzenie znika (staje się zwisające). Możliwe, że nadal możesz go zobaczyć w gitk, uruchom ponownie (Ctrl + F5) w gitk, aby zniknął. Zwisające zatwierdzenie zniknie z pamięci później ('git gc' powinno to wyczyścić). – Gauthier

+0

czy popełniłeś już dwa razy? W takim przypadku możesz poprzedzić powyższe polecenia funkcją 'git reset HEAD ^'. Zrób kopię zapasową repo przed zrobieniem tego wszystkiego (upewnij się, że folder .git jest w kopii zapasowej), nie chcę być odpowiedzialny za utratę danych. – Gauthier

Powiązane problemy