reset撤销 - 放弃git rebase




撤消git rebase (10)

使用reflog对我不起作用。

对我有用的东西与here描述的类似。 打开以重新分支的分支命名的.git / logs / refs中的文件,找到包含“rebase finsihed”的行,如:

5fce6b51 88552c8f Kris Leech <[email protected]> 1329744625 +0000  rebase finished: refs/heads/integrate onto 9e460878

签出该行上列出的第二个提交。

git checkout 88552c8f

一旦确认,这包含了我失去的变化,我分支并松了一口气。

git log
git checkout -b lost_changes

有谁知道如何轻松撤消git rebase?

想到的唯一方法是手动进行:

  • git checkout两个分支的提交父级
  • 然后从那里创建一个临时分支
  • 樱桃 - 手工挑选所有提交
  • 用手动创建的分支替换我重新定位的分支

在我目前的情况下,这将是有效的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是我的同事的东西)。

然而,我的方法让我感到不理想和容易出错(假设我刚刚用自己的2个分支进行了重新定位)。

有任何想法吗?

澄清:我正在谈论一个重播,在此期间重播了一堆提交。 不仅仅是一个。


假设我将master重新绑定到我的功能分支,并且我得到了30个新的提交,这些提交会破坏某些功能。 我发现通常最简单的方法就是删除糟糕的提交。

git rebase -i HEAD~31

最近31次提交的交互式rebase(如果选择的方式太多则不会受到影响)。

只需要删除你想要删除的提交,并用“d”而不是“pick”标记它们。 现在删除了提交,有效地删除了rebase(如果只删除了刚刚进行rebased时提交的提交)。


如果您已将分支推送到远程存储库 (通常是它的原点)然后您已经完成了成功的rebase(没有合并)( git rebase --abort给出“No rebase in progress”),您可以使用命令轻松地重置分支

git reset --hard origin / {branchName}

例:

$ ~/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

如果你在git rebase --abort了一些东西,例如git rebase --abort ,当你有未提交的文件时,它们将会丢失并且git reflog将无济于事。 这发生在我身上,你需要在这里开箱即思考。 如果您像我一样幸运并使用IntelliJ Webstorm,那么您可以right-click->local history ,无论您使用版本控制软件犯了什么错误,都可以恢复到文件/文件夹的先前状态。 另一个故障安全运行总是好的。


如果您尚未完成rebase,并且在其中间,则以下工作:

git rebase --abort

实际上,rebase将你的起点保存到ORIG_HEAD所以这通常很简单:

git reset --hard ORIG_HEAD

但是, resetreset rebasemerge都将您的原始HEAD指针保存到ORIG_HEAD因此,如果您已经尝试撤消的rebase中已经执行了任何这些命令,那么您将不得不使用reflog。


将分支重置为其旧提示的悬空提交对象当然是最佳解决方案,因为它可以在不花费任何精力的情况下恢复之前的状态。 但是,如果您碰巧丢失了这些提交(f.ex。因为您在此期间垃圾收集了您的存储库,或者这是一个新的克隆),您可以再次重新绑定该分支。 关键是--onto开关。

假设你有一个主题分支富有想象力地称为topic ,当master的提示是0deadbeef提交时你分支master 。 在topic分支的某个时刻,你做了git rebase master 。 现在你要撤消这个。 这是如何做:

git rebase --onto 0deadbeef master topic

这将采取topic上的所有提交,而不是master ,并在0deadbeef之上重播它们。

使用--onto ,您可以将历史重新排列成几乎任何形状

玩得开心。 :-)


我很惊讶这里没有人提到过这个。 Rebase将旧状态ORIG_HEADORIG_HEAD ,因此您可以通过运行以下命令恢复最后一个rebase:

git reset --hard ORIG_HEAD

查尔斯的答案有效,但你可能想这样做:

git rebase --abort

reset后清理。

否则,您可能会收到消息“ Interactive rebase already started ”。


根据@Allan和@Zearin的解决方案,我希望我可以简单地做一个评论,但我没有足够的声誉,所以我使用了以下命令:

而不是做git rebase -i --abort (注意-i )我不得不简单地做git rebase --abort没有 -i )。

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

因此,此解决方案的先前和当前分支状态为:

[email protected] /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort

[email protected] /my/project/environment (branch-123)
$




undo