Usuń zatwierdzenie git, które nie zostało wypchnięte


722

Zrobiłem, git commitale jeszcze nie wysłałem go do repozytorium. Kiedy to zrobię git status, dostaję „# Twój oddział wyprzedza„ master ”o 1 zatwierdzenie.

Więc jeśli chcę cofnąć moje najwyższe zatwierdzenie, czy mogę po prostu:

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316

biorąc pod uwagę, że kiedy to zrobię git log, dostaję:

commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316
Data: Wt 29 września 11:21:41 2009 -0700


zatwierdzić db0c078d5286b837532ff5e276dcf91885df2296
Data: wtorek 22 10:31:37 2009 -0700

9
To pytanie wydaje się być duplikatem innego z twoich własnych pytań: stackoverflow.com/questions/1338728/how-to-delete-a-git-commit
Brian Campbell



3
NIEBEZPIECZEŃSTWO: reset --hardmoże spowodować utratę pracy, ponieważ spowoduje to zastąpienie plików lokalnych (twoja nowa praca) plikami git z sieci (zdarzyło mi się). Pytania i odpowiedzi dotyczące git powinny wyraźnie określać, co robią ich polecenia i jakie ryzyko dla czytelników obserwują.
OrangeSherbet,

Odpowiedzi:


673

Właściwie, kiedy użyć git reset, należy odnieść się do popełnienia że jesteś resetowanie się ; więc prawdopodobnie chciałbyś db0c078zatwierdzić.

Łatwiejszą wersją byłoby git reset --hard HEAD^zresetowanie do poprzedniego zatwierdzenia przed bieżącym nagłówkiem; w ten sposób nie musisz kopiować wokół identyfikatorów zatwierdzeń.

Uważaj, gdy je wykonasz git reset --hard, ponieważ możesz utracić wszelkie niezatwierdzone zmiany. Możesz sprawdzić, git statusczy twoja kopia robocza jest czysta, lub czy chcesz usunąć wszelkie zmiany, które tam są.

Ponadto zamiast HEAD możesz użyć origin/masterjako odniesienia, jak sugeruje @bdonlan w komentarzach:git reset --hard origin/master


374
Lub git reset --hard origin/master, aby zresetować go do dowolnego źródła.
bdonlan

1
Innym przydatnym wskaźnikiem, do którego można zresetować, jest ORIG_HEAD lub jego generalizacja z wykorzystaniem reflog HEAD @ {1} (ostatnia pozycja HEAD).
Jakub Narębski

12
Czytnik, przed tobą git resetkod. Zrób sobie przysługę w przyszłości: różnica między reset, reset --softa reset --hard(Co stanie się z twoją wcześniejszą git addaka „twoją pracą” :) Zdjęcie: link
user18099

3
Zauważ, że spowoduje to usunięcie tego, co było w zatwierdzeniu, które chcesz usunąć (więc a git statusnie pokaże żadnych zmian, a zatwierdzenie zostanie usunięte / zmiany utracone).
Bjørn Børresen

12
UWAGA: Zachowaj ostrożność podczas używania, git reset --hard HEAD^ponieważ utracisz zmiany w zatwierdzonych plikach (zmiany zostaną usunięte). Istnieją dwa odgałęzienia tego pytania: Aby cofnąć zatwierdzenie, ale nadal mają zmiany na dysku, zrób togit reset --soft HEAD~1
papigee

625

JEŚLI NIE przekazałeś swoich zmian do pilota

git reset HEAD~1

Sprawdź, czy kopia robocza jest czysta przez git status.

W innym przypadku zmiany zostały przekazane zdalnie

git revert HEAD

To polecenie przywróci / usunie ostatnie zatwierdzenie / zmianę, a następnie będziesz mógł je wypchnąć


34
Odpowiedzi na „Usuń najnowszy zatwierdzenie git, które nie zostało wypchnięte” (najbliższa odpowiedź IMHO)
Pierre de LESPINAY

25
Ponadto zachowuje lokalne zmiany dokonane w ostatnim zatwierdzeniu, a git reset - twardy nie
Stanimir Stoyanov

1
dla mnie cofnie ostatnie wciśnięte zatwierdzenie i nieprzypisane zatwierdzenie
CodyChan

git revert HEAD właśnie dla mnie właśnie usunął wszystkie pliki, które miałem gotowy wypchnąć. Bądź ostrożny!
Jason Bruce

159
git reset --hard origin/master

aby zresetować go do dowolnego źródła.

Zostało to opublikowane przez @bdonlan w komentarzach . Dodałem tę odpowiedź dla osób, które nie czytają komentarzy.


4
To pytanie zostało zadane prawie 5 lat temu i jest to już jeden z komentarzy.
Anubian Noob

1
Co się stanie, jeśli obecny lokalny oddział różni się od master- powinienem origin/mybranchwtedy użyć ?
Pavel Vlasov

9
Zwykle nie czytam komentarzy, gdy spieszy mi się na odpowiedź ... Dziękuję za podanie jako odpowiedzi (prosty, który działa)
Leonardo Alves Machado

Ostrzeżenie: pamiętaj, że spowoduje to usunięcie wszystkich istniejących zmian w kodzie, poza git reset HEAD~tym, że ustawia tylko zatwierdzenie w kodzie
Mayer Spitzer

69

Istnieją dwie gałęzie tego pytania (wycofanie zatwierdzenia nie oznacza, że ​​chcę stracić wszystkie moje lokalne zmiany):

1. Aby cofnąć ostatnie zatwierdzenie i odrzucić zmiany w zatwierdzonym pliku :

git reset --hard HEAD~1

2. Aby cofnąć ostatnie zatwierdzenie, ale zachować zmiany lokalne (na dysku) :

git reset --soft HEAD~1

To (późniejsze polecenie) doprowadzi cię do stanu, w jakim byłbyś, gdybyś to zrobił git add.

Jeśli chcesz później wycofać pliki, zrób to

git reset

Teraz możesz wprowadzić więcej zmian przed dodaniem, a następnie ponownym zatwierdzeniem.


47

Po prostu wpisz w konsoli:

$ git reset HEAD~

To polecenie odrzuca wszystkie lokalne zatwierdzenia przed zdalnym HEAD


7
Czy możesz wyjaśnić, co twoja odpowiedź dodaje do istniejących odpowiedzi?
nvoigt

Spowoduje to wyczyszczenie bieżącego zatwierdzenia przed wypchnięciem - bez cofania zmian dokonanych lokalnie - podobnie jak inne odpowiedzi - co może być poważnym momentem wyciągania włosów
Grant

41

Wierzę, że jeden z nich spełni twoje potrzeby

1 - Cofnij zatwierdzenie i zachowaj wszystkie pliki w stanie przejściowym: git reset --soft HEAD~;

2 - Cofnij zatwierdzanie i odznaczanie wszystkich plików: git reset HEAD~;

3 - Cofnij zatwierdzenie i całkowicie usuń wszystkie zmiany: git reset --hard HEAD~;

oto znalazłem odpowiedź


Ta odpowiedź musi zostać zaakceptowana: D
Aaron John Sabu

30

Usuń ostatni zatwierdzenie przed wypchnięciem

git reset --soft HEAD~1

1oznacza ostatnie zatwierdzenie, jeśli chcesz usunąć dwa ostatnie użycie 2i tak dalej *


3
Cześć Karina, wzmianka o --softjest świetnym dodatkiem do możliwych odpowiedzi, ale czy mógłbyś również wspomnieć dlaczego? Wyjaśnienie rozwiązania jest zawsze pomocne. Spróbuj także trzymać się angielskiego. Dzięki
Vlastimil Ovčáčík

1
--soft- zapewnia, że ​​nie stracisz zmian w pliku, którego zatwierdzenia próbujesz cofnąć
papigee

19

Doświadczyłem tej samej sytuacji, co zrobiłem poniżej, ponieważ jest to o wiele łatwiejsze. Przechodząc commit-Id, możesz dotrzeć do konkretnego zatwierdzenia, które chcesz wykonać:

git reset --hard {commit-id}

Aby usunąć ostatnie zatwierdzenie, musisz przekazać miejsce, w commit-Idktórym chcesz przesunąć wskaźnik:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296

Tylko ostrzeżenie dla początkujących jak ja - zrób kopię zapasową plików, w których chcesz zachować zmiany, ponieważ zostaną one przywrócone do wcześniejszej wersji. Mój scenariusz polegał na tym, że przypadkowo wrzuciłem zrzut bazy danych do katalogu repozytorium, a następnie zatwierdziłem - oczywiście nie chciałem zatwierdzić tych plików do repozytorium, ale DID chciałem zachować zmiany, które wprowadziłem w innych plikach. Musiałem więc skopiować i wkleić wymagane zmiany z kopii zapasowej, którą zrobiłem PRZED wykonaniem resetu git.
user1063287

10

To jest to, co robie:

Najpierw sprawdź swój oddział (dla mojego masteroddziału):

git checkout master

Następnie zresetuj do zdalnej HEAD ^ ( usunie wszystkie lokalne zmiany ), wymuś czyszczenie i pociągnij:

git reset HEAD^ --hard && git clean -df && git pull

1
To bardzo nuklearna opcja. Sugerowałbym miękki reset do ograniczonego zatwierdzania.
c0der512

3

Jednym ze sposobów byłoby usunięcie lokalnego oddziału i pobranie go z serwera, jeśli lokalny oddział wyprzedza zdalne wiele zatwierdzeń i trzeba je wszystkie wycofać.


genialna odpowiedź - pozwala na łatwe kliknięcie w sourcetree :)
Kamil Kiełczewski

1

Miałem właśnie ten sam problem i skończyłem na:

git rebase -i HEAD~N

(N to liczba zatwierdzeń, które pokaże ci git)

Powoduje to wyświetlenie monitu edytora tekstu, a następnie możesz usunąć żądane zatwierdzenie, usuwając linię z nim powiązaną.

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.