【问题标题】:Git how to rollback a rebaseGit如何回滚变基
【发布时间】:2017-04-24 07:12:14
【问题描述】:

在 Git 中,如果您对 rebase 不满意,如何回滚?

Git 没有用于 rebase 的预运行。如果我做了一个 rebase 并且还没有推送它,我该如何回滚到之前,就好像它从未发生过一样?

【问题讨论】:

  • git rebase --abort
  • “失败”是什么意思?您是否完成 rebase,但您不喜欢结果?或者你是否遇到了冲突并想在中间停止变基?我认为是前者,因为你不能推送一个冲突的、未完成的变基,但我问是因为它们是两个不同的问题。
  • 是的,以前的。谢谢。
  • Undoing a git rebase的可能重复

标签: git


【解决方案1】:

您可以使用reflog 找到变基开始之前的第一个操作,然后将 --hard 重置回它。例如

$ git reflog

b710729 HEAD@{0}: rebase: some commit
5ad7c1c HEAD@{1}: rebase: another commit
deafcbf HEAD@{2}: checkout: moving from master to my-branch
...

$ git reset HEAD@{2} --hard

现在你应该回​​到变基开始之前。

要找到正确的重置位置,您只需选择最接近顶部且以“rebase”开头的条目。

更新:如 cmets 和其他答案中所述,您还可以使用ORIG_HEAD 作为找到重置位置的更简单方法:git reset ORIG_HEAD --hard

替代方法

如果变基是您在分支上所做的唯一的事情,即您没有未推送的提交/更改 - 那么您可以使用git branch -D 删除本地分支,然后检查它再次:

$ git checkout my-branch
$ git rebase master
// not happy with the result
$ git checkout master
$ git branch -D my-branch
$ git checkout my-branch

或者为了同样的效果,你可以将 --hard 重置为原始分支:

$ git reset --hard origin/my-branch

如果您在有其他未推送的提交时这样做了,那么您将丢失它们。在这种情况下,只需使用上面的 reflog 方法跳回到您进行提交的 reflog 条目。

【讨论】:

  • 另一个方便的快捷方式:rebase 将ORIG_HEAD 设置为要重新设置的分支的原始哈希值。因此,与其为HEAD@{2} 找到数字 2,不如只使用ORIG_HEAD ...但如果ORIG_HEAD 仍然不受干扰。一堆 Git 命令设置它(rebase、am、reset 和 merge,在各种情况下)。
  • 谢谢您,先生!对此有很大帮助:)
  • 谢谢你我的源代码......使用这个 $ git reset HEAD@{2} --hard
  • 获得我的支持,因为我建议删除本地分支并再次拉取它!
  • @Robbie,我多么希望给予赏金。谢谢。
【解决方案2】:

Rebase 将旧状态的备份保留为 ORIG_HEAD
所以你可以通过运行来恢复最后一次变基:

git reset --hard ORIG_HEAD

【讨论】:

  • 您是否知道该标签的记录位置?
  • 这是否有一些缺点或者它是一个新功能?这似乎比筛选 reflog 容易得多。
  • 这不是新的。但是你通常会在 rebase 之后立即使用它,在几次 rebase 之后不能回溯等。对于这些复杂的情况,你会寻找 relog 的东西,但只是“哎呀,我刚刚做了什么?我怎样才能恢复现在呢?”它工作得很好。
猜你喜欢
  • 2012-06-17
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2012-07-28
  • 2012-04-29
  • 2011-06-17
  • 2012-10-03
  • 2015-12-06
相关资源
最近更新 更多