Po raz pierwszy zobowiązuję się do repozytorium git; Następnie żałuję zatwierdzenia i chcę go cofnąć. próbuję
# git reset --hard HEAD~1
Dostaję tę wiadomość:
fatal: ambiguous argument 'HEAD~1': unknown revision or path not in the working tree.
To zatwierdzenie jest pierwszym zatwierdzeniem z repozytorium. Masz pomysł, jak cofnąć początkowe zatwierdzenie gita?
git status
i, ku mojemu zaskoczeniu, powiedział gitfatal: Not a git repository (or any parent up to mount point ...)
!.gitignore
.git add .
,git commit -m "initial commit"
,git update-ref -D HEAD
Utwórz.gitignore
zauważyć, że git nadal widzi plików Warto dodać, że wcześniej należy ignorować. Innymi słowy,git update-ref -d HEAD
nie zabrał mnie z powrotem do stanu przed pierwszym zatwierdzeniem.git reset --hard HEAD~1
usuną dodane pliki dla wszystkich innych zatwierdzeń. Oczywiście pytanie brzmi: jak dojść do tego samego stanu, w którym to polecenie działa we wszystkich innych przypadkach. Zobacz ten wykaz, aby udowodnić, że Twoje rozwiązanie nie działa gist.github.com/greggman/522fa69a21d6cfb3ff0bgit update-ref -d HEAD
czy rzeczywiście przywrócić początkowy popełnić, ale zachowuje wszystkie poprzednio popełnione zmiany dodane do indeksu. Jeśli chcesz również usunąć te zmiany, po prostu wykonaj następujące czynnościgit reset --hard
. Nawet jeśli jest niekompletna, ta odpowiedź jest rzeczywiście najlepsza, więc unikaj jejrm -fr .git
(chyba że wiesz, co robisz).Możesz usunąć HEAD i przywrócić repozytorium do nowego stanu, w którym możesz utworzyć nowe wstępne zatwierdzenie:
Po utworzeniu nowego zatwierdzenia, jeśli już wypchnąłeś na zdalne, będziesz musiał wymusić je na pilocie, aby zastąpić poprzednie wstępne zatwierdzenie:
źródło
To pytanie zostało powiązane z tym postem na blogu i zaproponowano alternatywne rozwiązanie dla nowszych wersji Git:
To rozwiązanie zakłada, że:
master
oddzialeold_master
więc mogę swobodnie używać tej nazwyZmieni nazwę istniejącej gałęzi na
old_master
i utworzy nową, osieroconą gałąźmaster
(tak jak jest tworzona dla nowych repozytoriów), po czym możesz swobodnie usunąćold_master
... lub nie. Zależy od Ciebie.Uwaga: Przeniesienie lub skopiowanie gałęzi git zachowuje swój dziennik rejestrowania (zobacz ten kod ) podczas usuwania, a następnie tworzenia nowej gałęzi niszczy ją. Ponieważ chcesz wrócić do pierwotnego stanu bez historii, prawdopodobnie chcesz usunąć gałąź, ale inni mogą rozważyć tę małą notatkę.
źródło
Zgodnie z warunkami określonymi w pytaniu:
git init
,git add
operacje,git commit
,Jeśli te warunki wstępne zostaną spełnione, najprostszym sposobem cofnięcia początkowego zatwierdzenia byłoby:
z katalogu, w którym zrobiłeś
git init
. Następnie możesz powtórzyć,git init
aby odtworzyć repozytorium Git, i powtórzyć dodatki z wszelkimi zmianami, które są uzasadnione, że żałowałeś, że nie zrobiłeś za pierwszym razem, i powtórzyć początkowe zatwierdzenie.NIEBEZPIECZEŃSTWO! Spowoduje to usunięcie katalogu repozytorium Git.
Usuwa katalog repozytorium Git na stałe i nieodwracalnie, chyba że gdzieś masz kopie zapasowe. Zgodnie z warunkami wstępnymi nie ma nic, co chcesz przechowywać w repozytorium, więc nic nie tracisz. Wszystkie dodane pliki są nadal dostępne w działających katalogach, przy założeniu, że ich jeszcze nie zmodyfikowałeś i nie usunąłeś itp. Jednak wykonanie tego jest bezpieczne tylko wtedy, gdy nie masz nic innego w repozytorium. W okolicznościach opisanych w pytaniu „zatwierdzaj repozytorium po raz pierwszy - potem pożałuj”, jest to bezpieczne. Bardzo często jednak nie jest to bezpieczne.
Można to również bezpiecznie zrobić, aby usunąć niechciane sklonowane repozytorium; nie powoduje uszkodzenia repozytorium, z którego zostało sklonowane. Wyrzuca wszystko, co zrobiłeś w kopii, ale inaczej nie wpływa na oryginalne repozytorium.
Bądź ostrożny, ale jest bezpieczny i skuteczny, gdy spełnione są warunki wstępne.
Jeśli zrobiłeś inne rzeczy z repozytorium, które chcesz zachować, to nie jest to odpowiednia technika - twoje repozytorium nie spełnia już warunków wstępnych.
źródło
Nie możesz Więc:
źródło
git reset --hard
, więc dlaczego miałbygit add -A
?W końcu wrzucę to, co dla mnie zadziałało. Musiałem usunąć początkowe zatwierdzenie z repozytorium, ponieważ dane poddane kwarantannie zostały zgubione, zatwierdzenie zostało już wypchnięte.
Upewnij się, że aktualnie znajdujesz się we właściwej gałęzi.
git checkout master
git update-ref -d HEAD
git commit -m "Initial commit
git push -u origin master
To było w stanie rozwiązać problem.
Ważny
Miało to miejsce w wewnętrznym repozytorium, które nie było publicznie dostępne. Jeśli Twoje repozytorium było publicznie dostępne, załóż, że wszystko, co musisz przywrócić, zostało już usunięte przez kogoś innego.
źródło
Zastanawiam się, dlaczego „poprawka” nie jest sugerowana i została przekreślona przez @damkrat, ponieważ poprawka wydaje mi się właściwym sposobem na jak najskuteczniejsze rozwiązanie problemu leżącego u podstaw naprawienia błędnego zatwierdzenia, ponieważ nie ma celu, aby nie mieć początkowej popełnić. Jak niektórzy podkreślają, powinieneś modyfikować gałąź „publiczną” jak master, jeśli nikt nie sklonował twojego repo ...
źródło
git reset - twardo wprowadź zmiany, a następnie wykonajlub
i wtedy
--force przepisuje to zatwierdzenie, które zresetowałeś w pierwszym kroku.Nie rób tego, ponieważ masz zamiar sprzeciwić się całej idei systemów VCS, aw szczególności git. Jedyną dobrą metodą jest utworzenie nowej i usunięcie niepotrzebnej gałęzi. Zobacz
git help branch
informacje.źródło
Wszystko, co musisz zrobić, to cofnąć zatwierdzenie.
Następnie wciśnij
źródło