Jak zmienić ostatnie zatwierdzenie, aby cofnąć dodanie pliku?

108

Mam dwa pliki zmodyfikowane a, bw ostatnim popełnić. Ale bnie należy zatwierdzać pliku , jaki jest przepływ pracy, aby to zmienić?

Xiè Jìléi
źródło

Odpowiedzi:

109

Aktualizacja (kilka lat później)

Jan Hudec

Usunięcie go tylko z indeksu jest banalne.

To prawda: możesz łatwo zresetować plik do zawartości indeksu, jak sugeruje najnowsza odpowiedź (napisana przez Matta Connolly'ego ):

git reset HEAD^ path/to/file/to/revert

HEAD^pozwala plikowi na dostęp do jego zawartości w poprzednim zatwierdzeniu przed ostatnim.

Więc możesz git commit --amend, jak pierwotnie napisałem poniżej.


W Git 2.23 (sierpień 2019 r.) Możesz użyć nowego git restorepolecenia

 git restore --source=HEAD^ --staged  -- path/to/file/to/revert

krótszy:

 git restore -s@^ -S -- path/to/file/to/revert

Znowu możesz git commit --amend, jak pierwotnie napisałem poniżej.


Oryginalna odpowiedź (styczeń 2011 r.)

Jeśli jest to twój ostatni zatwierdzenie (i nigdzie go nie wypchnąłeś), możesz go zmienić :
(pierwszy ukryj lub zapisz b)

 git commit --amend

Następnie usuń b, wprowadź ponownie. Przywróć b i gotowe.

--amend

Służy do zmiany końcówki bieżącego oddziału.
Przygotuj obiekt drzewa, który chcesz jak zwykle zastąpić najnowsze zatwierdzenie (obejmuje to zwykłe ścieżki -i / -o i jawne ścieżki), a edytor dziennika zatwierdzeń jest zapełniany komunikatem zatwierdzenia z końcówki bieżącej gałęzi.
Zatwierdzenie, które utworzysz, zastępuje bieżącą wskazówkę - jeśli była to scalenie, będzie miała rodziców bieżącej wskazówki jako rodziców - więc bieżące górne zatwierdzenie zostanie odrzucone.

VonC
źródło
... Then stash/delete b, re-commit..tutaj nie powinno Thenbyć słowa after? - --amendpo stach / delete b, ...
Xiè Jìléi
@ 谢 继 雷: innymi słowy, najpierw zapisz b, a następnie zatwierdź - popraw, a następnie przywróć? Prawdziwe. Zaktualizowałem odpowiedź.
VonC
Dzięki sile indeksu git, powiedzenie każdemu, aby ukrył / zapisał plik, jest po prostu głupie (-1). Usunięcie go tylko z indeksu jest banalne.
Jan Hudec
1
@ JanHudec To prawda, odpowiednio zmodyfikowałem odpowiedź. Nie zastosowałem się do tej starej odpowiedzi tak dokładnie, jak w przypadku przepełnienia stosu. W każdym razie 99% pytań git dotyczących SU powinno być migrowanych na SO.
VCC
66
  1. git diff --name-only HEAD^ - (opcjonalnie) użyj, aby wyświetlić listę plików, które zmieniły się w ostatnim zatwierdzeniu.
  2. git reset HEAD^ path/to/file/to/revert- aby zresetować indeks do ostatniej wersji, pozostawiając kopię roboczą nietkniętą.
  3. git commit --amend- zmienić ostatni zatwierdzenie, aby uwzględnić zmiany indeksu
Matt Connolly
źródło
9
Imho to znacznie lepsza odpowiedź niż zaakceptowana.
mik01aj
1
Pamiętaj, że nie powinieneś używać git commit -a --amend(tzn. Nie dodawać plików) dla kroku 3, w przeciwnym razie dokonasz zmian kopii roboczej, które są zmianami, które próbujesz usunąć. Opcjonalnym krokiem 2.5 może być git checkout path/to/file/to/revertrównież wyczyszczenie kopii roboczej.
dmnd
1
Alternatywnie możesz git rm --cached path/to/file/to/revertusunąć plik bez usuwania go z drzewa.
Jan Hudec
13

Alternatywnie, jeśli używasz git gui, po prostu wybierz opcję „Zmień ostatnie zatwierdzenie”, dodany plik pojawi się na liście „Przeniesione”, kliknij jego ikonę, aby przenieść go na listę „Niestabilne” i zatwierdzić.

Jan Hudec
źródło
1
@VonC: Edycja i dzielenie łatek jest dość powszechną operacją dla ciężkich użytkowników git, więc GUI zostało zaprojektowane tak, aby było łatwe i jest najlepszym narzędziem IMO.
Jan Hudec
Ten działa! Nie udało mi się uzyskać innych opcji dla tego konkretnego zadania. Dzięki za wskazówkę!
Serguzest
10

Jeśli chcesz usunąć b z ostatniego zatwierdzenia

git rm --cached b (will preserve the file in the working tree but remove it from the index)
git commit --amend

Jeśli chcesz usunąć wszystkie zmiany do b w swoim ostatnim zatwierdzeniu

(backup b)
(modify b to state before incorrect commit)
git commit --amend
(restore b)
pingo
źródło
git rm --cachedi zrezygnuj z tworzenia kopii zapasowych / przywracania tańca (-1).
Jan Hudec
Dzięki za zwrócenie na to uwagi. Chciałem podzielić się tym, jak to zrobiłem, ponieważ było to podejście, które czułem się najwygodniej nawet po przeczytaniu całego wątku.
pingo
4

Alternatywa, która nie wymaga hakowania indeksu, ale zachowuje stary komunikat zatwierdzenia:

$ git reset HEAD^
$ git add <all the files you want, excluding the one you don't want>
$ git commit -C HEAD@{1}

Podoba mi się to, ponieważ (a) używa poleceń, których regularnie używam, i (b) mogę zrobić, git add -paby dowiedzieć się dokładnie, co chcę zatwierdzić.

Justin L.
źródło