Cofanie rebase ' u git
Czy ktoś wie jak łatwo cofnąć rebase git?
Jedyny sposób, który przychodzi na myśl, to zrobić to ręcznie:
- git checkout rodzica commit do obu gałęzi
- następnie utwórz stamtąd gałąź temp
- cherry-wybierz wszystkie commity ręcznie
- zastąp gałąź, w której rebasowałem przez ręcznie utworzoną gałąź
W mojej obecnej sytuacji to będzie działać, ponieważ mogę łatwo wykryć commity z obu gałęzi (jeden był moim rzeczy, drugi był rzeczy mojego kolegi).
Jednak moje podejście wydaje mi się nieoptymalne i podatne na błędy (powiedzmy, że właśnie zrebasowałem z 2 własnymi gałęziami).
Jakieś pomysły?
Wyjaśnienie: mówię o rebase, podczas którego powtórzono kilka commitów. Nie tylko jeden.
15 answers
Najłatwiej byłoby znaleźć commit główny gałęzi, jak to było bezpośrednio przed rozpoczęciem rebase w reflog ...
git reflog
I aby zresetować bieżącą gałąź do niej (ze zwykłymi zastrzeżeniami o byciu absolutnie pewnym przed zresetowaniem za pomocą opcji --hard
).
Załóżmy, że stary commit był HEAD@{5}
w logu ref:
git reset --hard HEAD@{5}
w systemie Windows może być konieczne zacytowanie odniesienia:
git reset --hard "HEAD@{5}"
Możesz sprawdzić historię kandydata old head by just doing a git log HEAD@{5}
(okna: git log "HEAD@{5}"
).
Jeśli nie wyłączyłeś reflogów gałęzi, powinieneś być w stanie po prostu zrobić git reflog branchname@{1}
, ponieważ rebase odłącza głowicę gałęzi przed ponownym przymocowaniem do ostatecznej głowicy. Sprawdziłbym to jeszcze raz, choć ostatnio tego nie zweryfikowałem.
Domyślnie wszystkie reflogy są aktywowane dla repozytoriów innych niż nagie:
[core]
logAllRefUpdates = true
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-20 03:32:48
Właściwie, rebase zapisuje twój punkt wyjścia do {[1] } więc zwykle jest to tak proste, jak:
git reset --hard ORIG_HEAD
Jednak reset
, rebase
i merge
Wszystkie Zapisz swój oryginalny wskaźnik HEAD
do ORIG_HEAD
więc jeśli wykonałeś którąś z tych komend od rebase, którą próbujesz cofnąć, będziesz musiał użyć reflog.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-28 13:24:50
Odpowiedź Karola działa, ale możesz chcieć to zrobić:
git rebase --abort
Aby posprzątać po reset
.
W przeciwnym razie możesz otrzymać wiadomość " Interactive rebase already started
".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-10 03:12:43
Resetowanie gałęzi do zwisającego obiektu commit jego starej końcówki jest oczywiście najlepszym rozwiązaniem, ponieważ przywraca poprzedni stan bez wysiłku. Ale jeśli zdarzy ci się stracić te commity (np. ponieważ w międzyczasie zebrałeś śmieci w swoim repozytorium, lub jest to świeży klon), zawsze możesz ponownie przerobić gałąź. Kluczem do tego jest przełącznik --onto
.
Załóżmy, że masz gałąź tematyczną nazwaną topic
, którą rozgałęziłeś master
kiedy końcówką master
był 0deadbeef
commit. W pewnym momencie, będąc na gałęzi topic
, zrobiłeś git rebase master
. Teraz chcesz to cofnąć. Oto jak:
git rebase --onto 0deadbeef master topic
Pobierze wszystkie commity na topic
, których nie ma na master
i odtworzy je na 0deadbeef
.
Za pomocą --onto
możesz zmienić swoją historię na praktycznie dowolny kształt.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 02:47:34
Przed wykonaniem jakiejkolwiek nietrywialnej operacji (większość rebases jest trywialna, ale zrobiłbym to, jeśli wygląda na skomplikowaną).
Następnie Przywracanie jest tak proste, jak git reset --hard BACKUP
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-24 05:08:16
W przypadku, gdy przepchnąłeś swoją gałąź do zdalnego repozytorium (zwykle jest to origin), a następnie wykonałeś udaną rebase (bez scalania) (git rebase --abort
daje "No rebase in progress") możesz łatwo zresetować gałąź używając
polecenie:
Git reset --hard origin/{branchName}
Przykład:
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is ahead of 'origin/{branchName}' by 135 commits.
(use "git push" to publish your local commits)
nothing to commit, working directory clean
$ ~/work/projects/{ProjectName} $ git reset --hard origin/{branchName}
HEAD is now at 6df5719 "Commit message".
$ ~/work/projects/{ProjectName} $ git status
On branch {branchName}
Your branch is up-to-date with 'origin/{branchName}.
nothing to commit, working directory clean
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-05 10:12:49
W przypadku, gdy nie ukończyłeś rebase i w jego środku, następujące działania:
git rebase --abort
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 20:20:39
Dziwię się, że nikt jeszcze o tym nie wspomniał. Rebase pozostawia stary stan jako ORIG_HEAD
, więc możesz przywrócić ostatnią rebase, uruchamiając:
git reset --hard ORIG_HEAD
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-02 12:56:51
Używanie reflog
nie zadziałało na mnie.
To, co u mnie działało, było podobne do opisanego tutaj . Otwórz plik .git / logs / refs nazwany od gałęzi, która została zrebasowana i znajduje linię zawierającą "rebase finsihed", coś w stylu:
5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878
Sprawdź drugi commit wymieniony w wierszu.
git checkout 88552c8f
Po potwierdzeniu, że to zawierało moje utracone zmiany, rozgałęziłem się i odetchnąłem z ulgą.
git log
git checkout -b lost_changes
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-20 13:59:06
Dla wielu commitów, pamiętaj, że każdy commit odwołuje się do całej historii poprzedzającej ten commit. Więc w odpowiedzi Charlesa, przeczytaj "Stary commit" jako "najnowszy ze starych commitów". Jeśli zresetujesz ten commit, cała historia prowadząca do tego commita pojawi się ponownie. To powinno robić, co chcesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-25 21:36:50
Podążając za rozwiązaniem @Allan i @Zearin, chciałbym po prostu zrobić komentarz, ale nie mam wystarczającej reputacji, więc użyłem następującego polecenia:
Zamiast robić git rebase -i --abort
(zwróć uwagę na -i ) musiałem po prostu zrobić git rebase --abort
(bez -i ).
Używanie obu -i
i --abort
w tym samym czasie powoduje, że Git pokazuje mi listę użycia / opcji.
Więc mój poprzedni i obecny status gałęzi z tym rozwiązaniem to:
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-11 21:26:47
Jeśli udało Ci się przerobić na zdalną gałąź i nie możesz git rebase --abort
nadal możesz wykonać kilka sztuczek, aby zapisać swoją pracę i nie mieć wymuszonych wypychań.
Załóżmy, że Twoja bieżąca gałąź, która została przez pomyłkę zmieniona, nazywa się your-branch
i śledzi origin/your-branch
-
git branch -m your-branch-rebased
# Zmień nazwę bieżącej gałęzi -
git checkout origin/your-branch
# checkout to latest state that is known to origin git checkout -b your-branch
- sprawdź
git log your-branch-rebased
, porównaj zgit log your-branch
i zdefiniuj commity, których brakuje wyour-branch
-
git cherry-pick COMMIT_HASH
dla każdy commit wyour-branch-rebased
- Przesuń swoje zmiany. Należy pamiętać, że dwa lokalne oddziały są powiązane z
remote/your-branch
i należy nacisnąć tylkoyour-branch
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-23 09:23:45
Powiedzmy, że rebase master do mojej gałęzi feature i otrzymuję 30 nowych commitów, które coś psują. Zauważyłem, że często najłatwiej jest po prostu usunąć złe commity.
git rebase -i HEAD~31
Interaktywny rebase dla ostatnich 31 commitów (nie zaszkodzi, jeśli wybierzesz zbyt wiele).
Po prostu weź commity, których chcesz się pozbyć i oznacz je "d "zamiast"pick". Teraz zmiany są usuwane skutecznie cofając rebase (jeśli usuniesz tylko zmiany, które otrzymałeś, gdy rebasing).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-09 12:25:35
Jeśli coś zepsujesz w rebase git, np. git rebase --abort
, gdy masz niezatwierdzone pliki, zostaną one utracone i git reflog
nie pomogą. To mi się przydarzyło i musisz myśleć nieszablonowo. Jeśli masz szczęście tak jak ja i używasz IntelliJ Webstorm, Możesz right-click->local history
i możesz powrócić do poprzedniego stanu plików / folderów bez względu na to, jakie błędy popełniłeś z oprogramowaniem do wersjonowania. Zawsze dobrze jest mieć uruchomiony kolejny failsafe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 12:25:18
Aby anulować, możesz wprowadzić następujące polecenie:
git -c core.quotepath=false rebase --abort
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-15 05:31:43