有谁知道如何轻松撤消git rebase?
想到的唯一方法是手动进行:
- git checkout两个分支的提交父级
- 然后从那里创建一个临时分支
- 樱桃 - 手工挑选所有提交
- 用手动创建的分支替换我重新定位的分支
在我目前的情况下,这将是有效的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是我的同事的东西)。
然而,我的方法让我感到不理想和容易出错(假设我刚刚用自己的2个分支进行了重新定位)。
有任何想法吗?
澄清:我正在谈论一个重播,在此期间重播了一堆提交。不仅仅是一个。
最简单的方法是找到分支的头部提交,就像在rebase开始之前一样 引用日志...
git reflog
并将当前分支重置为它(通常需要注意的是在重置之前完全确定 --hard
选项)。
假设旧提交是 HEAD@{5}
在ref日志中:
git reset --hard HEAD@{5}
在Windows中,您可能需要引用引用:
git reset --hard "HEAD@{5}"
你可以通过做一个来检查候选老头的历史 git log HEAD@{5}
(视窗: git log "HEAD@{5}"
)。
如果你没有禁用每个分支reflogs,你应该能够做到 git reflog branchname@{1}
因为一个rebase在重新连接到最终头部之前分离了分支头。我会仔细检查这个,但我最近没有证实这一点。
默认情况下,为非裸存储库激活所有reflog:
[core]
logAllRefUpdates = true
实际上,rebase将你的起点保存到 ORIG_HEAD
所以这通常很简单:
git reset --hard ORIG_HEAD
但是,那 reset
, rebase
和 merge
都保存你的原件 HEAD
指针进入 ORIG_HEAD
所以,如果你已经完成了任何这些命令,因为你要尝试撤消rebase,那么你将不得不使用reflog。
查尔斯的答案有效,但你可能想这样做:
git rebase --abort
之后清理 reset
。
否则,您可能会收到消息“Interactive rebase already started
”。
将分支重置为其旧提示的悬空提交对象当然是最佳解决方案,因为它可以在不花费任何精力的情况下恢复之前的状态。但是,如果您碰巧丢失了这些提交(f.ex。因为您在此期间垃圾收集了您的存储库,或者这是一个新的克隆),您可以再次重新绑定该分支。关键是这个 --onto
开关。
假设你有一个富有想象力的主题分支 topic
,你分道扬.. master
当尖端 master
是的 0deadbeef
承诺。在某些时候,在 topic
分支,你做到了 git rebase master
。现在你要撤消这个。就是这样:
git rebase --onto 0deadbeef master topic
这将承担所有提交 topic
没有 master
并重播它们 0deadbeef
。
同 --onto
,你可以重新安排你的历史 任何形状。
玩的开心。 :-)
在我做任何非常重要的操作之前,我实际上在分支上放了一个备份标签(大多数rebase都很简单,但如果它看起来很复杂,我会这样做)。
然后,恢复就像一样容易 git reset --hard BACKUP
。
以防万一 您已将分支推送到远程存储库 (通常是它的起源)然后你做了一个成功的rebase(没有合并)(git rebase --abort
你可以很容易地给出“没有进行任何改变” 重置分支 运用
命令:
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
如果您尚未完成rebase,并且在其中间,则以下工作:
git rebase --abort
对于多次提交,请记住任何提交都会引用导致该提交的所有历史记录。所以在查尔斯的回答中,将“旧提交”称为“旧提交的最新内容”。如果重置为该提交,则会再次出现导致该提交的所有历史记录。这应该做你想要的。
运用 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