2009-10-23 13 views
313

Zrobiłem "zatwierdzenie git", ale nie popychałem innych. , więc gdy wykonuję "git status", otrzymuję "# Twój oddział wyprzedza" master "o 1 commit. 'Usuń zatwierdzenie git, które nie pchnęło

Więc jeśli chcę przywrócić mój top popełnienia, mogę po prostu zrobić”

git reset --hard eb27bf26dd18c5a34e0e82b929e0d74cfcaab316 

zważywszy, że kiedy robię 'dziennik git'

 
commit eb27bf26dd18c5a34e0e82b929e0d74cfcaab316 
Date: Tue Sep 29 11:21:41 2009 -0700 


commit db0c078d5286b837532ff5e276dcf91885df2296 
Date: Tue Sep 22 10:31:37 2009 -0700
+6

To pytanie wydaje się być duplikatem innego z twoich pytań: http://stackoverflow.com/questions/1338728/how -to-delete-a-git-commit –

+0

Możliwy duplikat [Usuń zatwierdzenia z oddziału w Git] (https://stackoverflow.com/questions/1338728/delete-commits-from-a-branch-in-git) –

+0

Możliwy duplikat [Jak przywrócić repozytorium Git do poprzedniego zatwierdzenia?] (Https://stackoverflow.com/questions/4114095/how-to-revert-git-repository-to-a-previous-commit) –

Odpowiedz

306

Faktycznie, podczas korzystania git reset, powinieneś odwołać się do zatwierdzenia, że ​​resetujesz do, więc prawdopodobnie chcesz zatwierdzić db0c078.

Łatwiejszą wersją będzie git reset --hard HEAD^, aby zresetować poprzednie zatwierdzenie przed bieżącą głową; w ten sposób nie trzeba kopiować wokół identyfikatorów zatwierdzeń.

Uwaga: należy zachować ostrożność podczas wykonywania wszelkich git reset --hard, ponieważ można stracić wszelkie niezatwierdzone zmiany. Możesz chcieć sprawdzić git status, aby upewnić się, że twoja kopia robocza jest czysta, lub że chcesz zdmuchnąć wszelkie zmiany, które tam są.

Ponadto zamiast głowy można użyć origin/master jako punkt odniesienia, jak sugeruje @bdonlan w komentarzach: git reset --hard origin/master

+223

Lub 'reset git - hard origin/master', aby zresetować go do miejsca pochodzenia. – bdonlan

+0

Tak, jest to również przydatne. –

+1

Innym przydatnym wskaźnikiem, na który można zresetować, jest ORIG \ _HEAD lub jego uogólnienie za pomocą refloga HEAD @ {1} (ostatnia pozycja HEAD). –

267

jeśli nie popchnęły zmian do zdalnego

git reset HEAD~1 

Check jeśli kopia robocza jest czysta przez git status.

indziej popchnęły zmian do zdalnego

git revert HEAD 

Komenda ta powróci/usuń ostatni commit/zmiana i wtedy można wcisnąć

+11

To odpowiada na "Usuń najnowsze zatwierdzenie git, które nie zostało pchnięte" (najbliższa odpowiedź IMHO) –

+9

Ponadto, zachowuje lokalne zmiany wykonane w ostatnim zatwierdzeniu, podczas gdy git reset - twarde nie –

103
git reset --hard origin/master 

aby przywrócić go do czegokolwiek pochodzenie było na.

Ten został wysłany przez @bdonlan w comments. Dodałem tę odpowiedź dla osób, które nie czytają komentarzy.

+2

To pytanie zostało zadane prawie 5 lata temu, a to już jest w jednym z komentarzy. –

+1

Co jeśli obecny lokalny oddział różni się od 'master' - czy powinienem wtedy użyć' origin/mybranch'? –

+0

Dzięki za udostępnienie! To jest jedyny, który pracował dla mnie. – Hajjat

11

Doświadczyłem tej samej sytuacji, którą zrobiłem poniżej jako o wiele łatwiej. Przekazując commit-Id można dotrzeć do konkretnego popełnić chcesz jechać:

git reset --hard {commit-id} 

Jak chcesz usunąć Twoja ostatnia popełnić tak trzeba zdać commit-Id gdzie trzeba przesunąć kursor:

git reset --hard db0c078d5286b837532ff5e276dcf91885df2296 
+0

To ostrzeżenie dla takich jak ja - zrób kopie zapasowe plików chcesz ZACHOWAĆ zmiany, ponieważ zostaną one przywrócone do wcześniejszej wersji. Mój scenariusz polegał na tym, że przypadkowo umieściłem zrzut bazy danych w katalogu repo, a następnie zatwierdziłem - oczywiście nie chciałem przekazywać tych plików do repo, ale DID chce zachować zmiany, które wprowadziłem w innych plikach. Musiałem więc skopiować i wkleić wymagane zmiany z kopii zapasowej, którą wykonałem PRZED wykonaniem resetowania git. – user1063287

0

Jednym ze sposobów jest usunięcie lokalnego oddziału i pobranie tej gałęzi z serwera, jeśli lokalny oddział znajduje się przed zdalnym za pomocą wielokrotnych zatwierdzeń i należy anulować wszystkie z nich.

0

To co mam zrobić:

Pierwszy checkout swój oddział (w moim przypadku master oddział):

git checkout master 

następnie zresetować do zdalnego HEAD^(będzie to usunięcia wszystkich zmian), wymyj czysto i pociągnij:

git reset HEAD^ --hard && git clean -df && git pull 
Powiązane problemy