Oto, co zrobiłem z moją rzekomo stabilną gałęzią ...
% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
refs/
refs/heads/
refs/tags/
refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
from cc4b63bebb6e6dd04407f8788938244b78c50285
to 83c9191dea88d146400853af5eb7555f252001b0
done
'refs/heads/unstable': up-to-date
Updating remote server info
To wszystko było błędem, jak później zrozumiałem. Chciałbym cofnąć cały ten proces i przywrócić gałąź alfa-0.3.0 z powrotem do tego, co to było.
Co powinienem zrobić?
Odpowiedzi:
Musisz upewnić się, że żaden inny użytkownik tego repozytorium nie pobiera niepoprawnych zmian lub nie próbuje budować na podstawie zatwierdzeń, które chcesz usunąć, ponieważ masz zamiar przewinąć historię.
Następnie musisz „wymusić” naepchnięcie starej referencji.
lub w twoim przypadku
Być może
receive.denyNonFastForwards
ustawiłeś w zdalnym repozytorium. W takim przypadku pojawi się błąd zawierający wyrażenie[remote rejected]
.W tym scenariuszu będziesz musiał usunąć i ponownie utworzyć gałąź.
Jeśli to nie zadziała - być może dlatego, że masz
receive.denyDeletes
ustawione, musisz mieć bezpośredni dostęp do repozytorium. W zdalnym repozytorium musisz wykonać coś takiego jak następujące polecenie hydrauliczne.źródło
git push -f origin last_known_good_commit:branch_name
Wierzę, że możesz to również zrobić:
Jest to bardzo podobne do ostatniej metody, z tym wyjątkiem, że nie musisz się chować w zdalnym repozytorium.
źródło
--hard
parametrze „ ”) powinien być identyfikatorem każdego zatwierdzenia, dla którego chcesz zresetować gałąź.git reset --hard [commit_id]
, żebyśmy nie zadzierali z kontinuum czasoprzestrzennym.+
zmusza do wypychania, podobnie jak-f
(ale nieco inaczej: stackoverflow.com/a/25937833/1757149 ). Bez niej, jeśli spróbujeszgit push origin alpha-0.3.0
push zawiedzie:Updates were rejected because the tip of your current branch is behind
.git revert
jest mniej niebezpieczny niż niektóre z sugerowanych tutaj podejść:Zastąp 35f6af6f77f116ef922e3d75bc80a4a466f92650 własnym zatwierdzeniem.
źródło
Przyjęte rozwiązanie (z @charles bailey) jest bardzo niebezpieczne, jeśli pracujesz we wspólnym repozytorium.
Najlepszą praktyką jest to, że wszystkie zatwierdzenia przekazane do zdalnego repozytorium, które są współużytkowane, należy uznać za „niezmienne”. Zamiast tego użyj „git revert”: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes
https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things
źródło
Sposób na zrobienie tego bez utraty pożądanych zmian:
Następnie możesz wybrać pliki, które chcesz przesłać
źródło
Inny sposób to zrobić:
git push origin --delete <branch_name>
)źródło
Spowoduje to przywrócenie repozytorium do wspomnianego numeru zatwierdzenia
źródło
Cofnij wielokrotne zatwierdzenia git reset - twardy 0ad5a7a6 (Wystarczy podać skrót SHA1 zatwierdzenia)
Cofnij ostatnie zatwierdzenie
git reset - hard HEAD ~ 1 (zmiany do ostatniego zatwierdzenia zostaną usunięte) git reset --soft HEAD ~ 1 (zmiany do ostatniego zatwierdzenia będą dostępne jako niezatwierdzone modyfikacje lokalne)
źródło
Scenariusz 1 : Jeśli chcesz cofnąć ostatnie zatwierdzenie, powiedz 8123b7e04b3, poniżej znajduje się polecenie (to zadziałało dla mnie):
Dane wyjściowe wyglądają jak poniżej:
Informacje dodatkowe: Scenariusz 2 : W niektórych sytuacjach może być konieczne przywrócenie cofniętego cofnięcia (w zasadzie cofnięcie cofnięcia) za pomocą poprzedniego polecenia, a następnie użycie poniższego polecenia:
Wynik:
Więcej informacji tutaj: https://github.com/blog/2019-how-to-undo-almost-anything-with-git
źródło
Istniejące odpowiedzi są dobre i poprawne, jednak co zrobić, jeśli trzeba cofnąć,
push
ale:Użyj tego polecenia, aby przywrócić zmianę do odwołania:
źródło
Jeśli chcesz zignorować ostatnie zatwierdzenie, które właśnie wrzuciłeś do zdalnej gałęzi: to nie usunie zatwierdzenia, ale po prostu zignoruje go, przesuwając wskaźnik git do zatwierdzenia wcześniej, o którym mowa HEAD ^ lub HEAD ^ 1
Ale jeśli już wypchnąłeś to zatwierdzenie, a inni wyciągnęli gałąź. W takim przypadku przepisywanie historii twojego oddziału jest niepożądane i powinieneś zamiast tego cofnąć to zatwierdzenie:
źródło