git - 撤消Git rebase

  显示原文与译文双语对照的内容

有人知道如何轻松撤销 git rebase?

想到的唯一方法是手工去:

  • git checkout 向两个分支提交 commit
  • 然后从那里创建一个临时分支
  • cherry-pick全部手工提交
  • 替换由manually-created分支重新建立的分支

在我的当前情况下,这将工作,因为我可以轻松地从两个分支的( 一个是我的东西,另一个是我的东西) 中找到提交。

然而,我的方法将我作为次优和 error-prone ( 假设我已经用我自己的2个分支进行了重新初始化) 。

有什么想法吗?

澄清:我讲的是一个 rebase,在这个过程中,一系列的提交被重放。 不止一个。

时间:

最简单的方法是找到分支的头部提交,因为它是在reflog在中开始之前的。

 
git reflog

 

并将当前分支重置为( 在reseting使用 --hard 选项之前,通常需要注意) 。


# Suppose the old commit was HEAD@{5} in the ref log
git reset --hard HEAD@{5}

你可以通过做一个 git log HEAD@{5} 来检查候选人的历史。

如果你启用了每个分支 reflogs,你应该能够简单地做 git reflog branchname@{1},在重新附加到最终头部之前,将分支分离为分支头。 我将再次检查这个,虽然我最近没有验证。 你可以通过添加:


[user]
 logallrefupdates=true

实际上,rebase将你的起始点保存到 ORIG_HEAD 中,这样通常如此简单:


git reset --hard ORIG_HEAD

但是,resetrebasemerge 都将原始的HEAD 指针保存到 ORIG_HEAD 中,因此,如果你执行了转换之后的任何命令,那么你就必须使用 reflog 。

charles的回答,但你可能想这样做:


git rebase -i --abort

reset 之后清理。

否则,你可能得到消息" Interactive rebase already started """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""。

将分支重置为它的旧提示的挂起提交对象当然是最好的解决方案,因为它恢复了以前的状态,而不需要付出任何努力。 但是如果你碰巧丢失了那些提交( 比如,。 因为你同时garbage-collected的存储库,或者这是一个新的克隆,你总是可以重新初始化分支。 这是 --onto switch的关键。

让我们假设,你有一个主题分支转换成为一种可以称为 topic,那就已经解组的0deadbeefmaster 当针尖 master的一定提交。 在 topic 分支的某个时刻,你做了 git rebase master 。 现在你要撤消这里操作。 以下是操作方法:


git rebase --onto 0deadbeef master topic

这将在 topic 上执行所有不在 master 上的提交,并在 0deadbeef 上重播它们。

eclipse日志 api --onto,你可以重新排列你的浏览记录到非常非常任何形状。

享受乐趣:- )

在执行任何非平凡操作之前,我实际上在分支上放置了一个备份标记。

那么,恢复就像 git reset --hard BACKUP

使用 reflog 对我不起作用。

我所做的工作与这里描述的类似。 在. git/logs/refs 中打开名为"rebase finsihed"的分支以打开文件,找到包含的行,类似:


5fce6b51 88552c8f Kris Leech <me@example.com> 1329744625 +0000 rebase finished: refs/heads/integrate onto 9e460878

签出行中列出的第二个提交。


git checkout 88552c8f

一旦确认这包含了我丢失的更改,我就分支并释放了一口气。


git log
git checkout -b lost_changes

按照 @Allan 和 @Zearin,的解决方案,我希望能够简单地做一个注释,但是我没有足够的声誉,所以我使用了以下命令:

而不是做 git rebase -i --abort ( 注意 -i ) 我只能做 git rebase --abort ( 没有在 -i ) 。

同时使用 -i--abort 会导致Git显示使用/选项列表。

因此,我以前和当前使用这个解决方案的分支状态是:


matbhz@myPc/my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

matbhz@myPc/my/project/environment (branch-123)
$

...