2013-09-24 5 views
6

я перебазировать свой филиал version2 против хозяина с помощью:отменить GIT перебазироваться, используя на

git rebase --onto master version1 version2 

Как я могу отменить это?

Чтобы отменить это я сделал git reflog

В настоящее время git status (на version2) дает мне:

Your branch and 'origin/version2' have diverged, 
and have 2563 and 222 different commits each, respectively. 
nothing to commit (working directory clean) 

Я хочу, чтобы отменить это перебазирование.

ответ

6

Предполагая, что вы не изменили version2 ветвей, так как вы перебазировать его, все, что вам нужно сделать, это жесткий сброс филиала на 1-м положения предварительного, используя <reference>@{n} синтаксис, где n является Nth до положения ссылки :

git checkout version2 
git reset --hard [email protected]{1} 
+0

Вы можете узнать больше об этом в моем ответе на [Что означает «при знаке @ знак/символ/символ в Git?] (Http://stackoverflow.com/questions/17910096/what-does-the- at-sign-symbol-character-mean-in-git/17910097 # 17910097), последний раздел. –

12

Очень быстрый и простой способ отменить git rebase - это вернуть ярлыки ответвления.

Если вы уверены, что хотите отказаться от текущего сообщения version2, вы можете начать с git reflog (как и вы). Я буду включать rebase шаг здесь, и я оставлю в нескольких «реальных» сокращенных рефов:

$ git checkout branch 
$ git rebase --onto master start-after branch 
... rebase output ... 
# oops! dag-nab-it! didn't mean to do that! 

$ git reflog 
<rev..> [email protected]{0}: rebase finished: returning to refs/heads/branch 
<rev..> [email protected]{1}: rebase: some commit msg... 
05f7dc8 [email protected]{2}: rebase: checkout master 
aa4e140 [email protected]{3}: checkout: moving from master to branch 

Здесь aa4e140 находится где HEAD филиала было. Эта функция также доступна в ORIG_HEAD:

$ git log -1 --oneline ORIG_HEAD 
aa4e140 some commit msg... 

(больше использовать журнал, если вам нужно, чтобы убедиться, что вы собираетесь в нужном месте.)

Если вы сделали какой-нибудь другой мерзавец вещи, так как rebase, ORIG_HEAD, возможно, были перемещены, но reflog будет иметь правильное значение. Если ORIG_HEAD и то, что вы видите в рефлоге, согласны, вы определенно имеете правильное значение. В любом случае, убедитесь, что у вас есть правильное значение (и что у вас нет никаких сохраненных изменений, что git status чист - вы можете использовать git stash, если необходимо, здесь).

Также попробуйте git reflog version2, в котором будет показана история лейбла version2.

Теперь только силой тока ветвей убедитесь, что все-таки тот, который вы хотите изменилась к цели фиксации:

$ git branch 
... see that you're still on "branch" or "version2" or whatever 
$ git reset --hard aa4e140 

Вуаля, все обратно точно так, как они были до запуска git rebase.

Если вы что-нибудь, чтобы изменить ORIG_HEAD не сделано, это даже легче, чем все это:

$ git log ORIG_HEAD # make sure that's what you want 
... 
$ git branch  # make sure you're on `version2` 
... 
$ git reset --hard ORIG_HEAD 
HEAD is now at ... 

но метод reflog является более общим (работает около месяца после перебазирования, независимо от того, что вы сделали между ними).

(Период времени здесь настраивается; см git reflog документации истечение дня по умолчанию 30 для reflog записей «недоступно из текущего наконечнике ветви», которая, как правило, в случае старые фиксации из. . до перебазирования)


ключ к пониманию почему это работает очень просто: git rebaseдержит ваш старый совершает. Он просто добавляет новые коммиты в commit-graph, затем перемещает метку. Когда ярлык перемещен, сложнее увидеть ваши старые коммиты - они не отображаются по умолчанию, они только в «reflog», но они все еще там. Верните этикетку, и новых коммитов - это те, которые не отображаются, а старые - обратно!

+0

Благодарим вас за объяснение в последнем абзаце. Ни один из других ответов, которые я видел, не сделал. – bunnyhero

+0

Согласен с bunnyhero. сброс rebase не имеет никакого смысла, пока вы не поймете, что в git ничего не потеряно, и gitX не показывает части дерева комманд, которые недоступны объектам ref –

Смежные вопросы