乐闻世界logo
搜索文章和话题

How to undoing a git rebase?

7 个月前提问
3 个月前修改
浏览次数95

6个答案

1
2
3
4
5
6

在使用 Git 进行版本控制时,git rebase 是一种常用的命令,用于重新组织提交的历史。然而,如果在 rebase 过程中出现了错误,或者你决定这个 rebase 操作并不是你想要的,你可能需要撤消这个 rebase。

要撤消一个已经完成的 rebase,有几种方法可以实现:

1. 使用 git refloggit reset

Git 的 reflog 记录了你的仓库中 HEAD 的所有变化,这包括 commit, rebase, merge 等操作。使用 reflog,你可以找到 rebase 操作之前的 HEAD 的位置,并且使用 reset 命令将其重置到那个状态。

例如:

bash
# 查看 reflog,找到想要撤消到的状态 git reflog # 假设在 rebase 之前的提交是 HEAD@{5} git reset --hard HEAD@{5}

这将撤消 rebase 并且将你的分支重置到之前的状态。

2. 使用备份分支

在执行 rebase 之前,创建一个备份分支也是一个安全的做法。这样,如果 rebase 不如预期,你可以轻松地切换到备份分支。

例如:

bash
# 在 rebase 之前创建一个备份分支 git branch backup-branch # 如果需要撤消 rebase,可以切换回备份分支 git checkout backup-branch # 如果决定使用备份分支的内容,可以这样做: git branch -f main backup-branch git checkout main

这样,你就可以恢复到 rebase 之前的状态,同时保留了一个未被 rebase 影响的分支的副本。

总结

使用 git refloggit reset 是撤消 rebase 的最直接的方法,因为它允许你直接回到任何之前的状态。然而,使用备份分支可以为操作提供额外的安全性,尤其是在处理复杂的 rebase 或在公共分支上工作时。

在实际工作中,我曾经遇到过一个情况,在我对一个功能分支进行 rebase 与主分支后,发现有几个文件的合并结果不正确,这直接影响了项目的功能。那时,我使用了 git reflog 查找历史,并使用 git reset --hard 恢复到 rebase 之前的状态,然后重新审查并逐步执行 rebase,确保每一步的变更都是正确的。这个经历教会了我在执行复杂的 Git 操作前,养成查看 reflog 以及备份分支的好习惯。

2024年6月29日 12:07 回复

最简单的方法是找到分支的头提交,因为它就在引用日志中开始变基之前...

shell
git reflog

并将当前分支重置为它(在使用该选项重置之前要绝对确定通常的警告--hard)。

假设旧的提交位于HEAD@{2}引用日志中:

shell
git reset --hard HEAD@{2}

在 Windows 中,您可能需要引用引用:

shell
git reset --hard "HEAD@{2}"

git log HEAD@{2}您只需执行( Windows:) 即可查看候选老头的历史记录git log "HEAD@{2}"

如果您没有禁用每个分支重新记录,您应该能够简单地执行git reflog branchname@{1}变基操作,在重新附加到最终头之前分离分支头。不过,我会仔细检查此行为,因为我最近尚未验证它。

默认情况下,所有引用日志都会针对非裸存储库激活:

shell
[core] logAllRefUpdates = true
2024年6月29日 12:07 回复

实际上,rebase 保存了合并的起点 ORIG_HEAD,所以回滚通常很简单:

shell
git reset --hard ORIG_HEAD

但是, resetrebaseall merge会将您的原始 HEAD指针保存到 ORIG_HEAD,如果您在尝试撤消变基后执行了任何这些命令,那么您将不得不使用 reflog。

2024年6月29日 12:07 回复

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

shell
git rebase --abort

后进行清理reset

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

2024年6月29日 12:07 回复

将分支重置为其旧提示的悬空提交对象当然是最好的解决方案,因为它无需花费任何精力即可恢复之前的状态。但是,如果您碰巧丢失了这些提交(例如,因为您同时对存储库进行了垃圾收集,或者这是一个新的克隆),您始终可以再次重新调整分支的基础。这其中的关键就是 --onto开关。

假设您有一个主题分支,想象中称为,您在提交的顶端时 topic分支了该分支。在树枝上的某个时刻,你做到了。现在您想要撤消此操作。就是这样:master``master``0deadbeef``topic``git rebase master

shell
git rebase --onto 0deadbeef master topic

topic这将获取所有未启用的提交 master,并在 0deadbeef.

有了它 --onto,您可以将您的历史记录重新排列成几乎任何形状。

2024年6月29日 12:07 回复

git reset --hard origin/{branchName}

是重置通过 rebase 完成的所有本地更改的正确解决方案。

2024年6月29日 12:07 回复

你的答案