有谁知道如何轻松撤消git rebase?
想到的唯一方法是手动进行:
git checkout两个分支的提交父级然后从…创建临时分支
如果您尚未完成rebase并且在其中间,则以下工作:
git rebase --abort
如果 的 您已将分支推送到远程存储库 强> (通常是它的起源)然后你做了一个成功的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
如果你成功地反对远程分支而不能 git rebase --abort 你仍然可以做一些技巧来保存你的工作,而不是强迫推动。 假设您调用错误重新绑定的当前分支 your-branch 并正在跟踪 origin/your-branch
your-branch
origin/your-branch
git branch -m your-branch-rebased
git checkout origin/your-branch
git checkout -b your-branch
git log your-branch-rebased
git log your-branch
git cherry-pick COMMIT_HASH
your-branch-rebased
remote/your-branch
根据@Allan和@Zearin的解决方案,我希望我可以简单地做一个评论,但我没有足够的声誉,所以我使用了以下命令:
而不是做 git rebase -i --abort (注意 的 -一世 强> 我不得不干脆做 git rebase --abort ( 的 无 强> 该 的 -一世 强> )。
git rebase -i --abort
使用两者 -i 和 --abort 同时使Git向我显示使用/选项列表。
-i
--abort
因此,此解决方案的先前和当前分支状态为:
matbhz@myPc /my/project/environment (branch-123|REBASE-i) $ git rebase --abort matbhz@myPc /my/project/environment (branch-123) $
要取消,您可以输入以下命令:
git -c core.quotepath=false rebase --abort
如果你在git rebase中混淆了一些东西,例如 git rebase --abort ,虽然你有未提交的文件,但它们会丢失 git reflog 没有用。这发生在我身上,你需要在这里开箱即用。如果你像我一样幸运并使用IntelliJ Webstorm,那么你可以 right-click->local history 无论您使用版本控制软件犯了什么错误,都可以恢复到文件/文件夹的先前状态。另一个故障安全运行总是好的。
git reflog
right-click->local history
假设我将master重新绑定到我的功能分支,并且我得到了30个新的提交,它们会破坏某些东西。我发现通常最简单的方法就是删除糟糕的提交。
git rebase -i HEAD~31
最近31次提交的交互式rebase(如果选择的方式太多,则不会受到影响)。
简单地接受你想要删除的提交,并用“d”而不是“pick”标记它们。现在删除了提交,有效地删除了rebase(如果只删除了刚刚进行rebased时提交的提交)。
如果您在分支机构,您可以使用:
git reset --hard @{1}
HEAD不仅有参考日志(由...获得) git reflog ),每个分支也有reflogs(由。获得) git reflog <branch> )。所以,如果你在 master 然后 git reflog master 将列出该分支的所有更改。您可以参考这些更改 master@{1} , master@{2} 等
git reflog <branch>
master
git reflog master
master@{1}
master@{2}
git rebase 通常会多次更改HEAD,但当前分支只会更新一次。
git rebase
@{1} 简直就是一个 当前分支的快捷方式 ,所以它等于 master@{1} 如果你在 master 。
@{1}
git reset --hard ORIG_HEAD 如果你习惯了将不会工作 git reset 在互动期间 rebase 。
git reset --hard ORIG_HEAD
git reset
rebase
对于多次提交,请记住任何提交都会引用导致该提交的所有历史记录。所以在查尔斯的回答中,将“旧提交”称为“最新的提交”。如果重置为该提交,则会重新出现导致该提交的所有历史记录。这应该做你想要的。
实际上,rebase将你的起点保存到 ORIG_HEAD 所以这通常很简单:
ORIG_HEAD
然而 reset , rebase 和 merge 都保存你的原件 HEAD 指针进入 ORIG_HEAD 所以,如果你已经完成了任何这些命令,因为你试图撤消rebase,那么你将不得不使用reflog。
reset
merge
HEAD
最简单的方法是找到分支的头部提交,就像在rebase开始之前一样 引用日志 ...
并将当前分支重置为它(通常需要注意的是在重置之前绝对确定 --hard 选项)。
--hard
假设旧提交是 HEAD@{5} 在ref日志中:
HEAD@{5}
git reset --hard HEAD@{5}
在Windows中,您可能需要引用引用:
git reset --hard "HEAD@{5}"
你可以通过做一个来检查候选老头的历史 git log HEAD@{5} ( 视窗: git log "HEAD@{5}" )。
git log HEAD@{5}
git log "HEAD@{5}"
如果你没有禁用每个分支reflogs你应该能够做到 git reflog branchname@{1} 因为一个rebase在重新连接到最终头部之前分离了分支头。我会仔细检查这个,尽管我最近没有证实这一点。
git reflog branchname@{1}
默认情况下,为非裸存储库激活所有reflog:
[core] logAllRefUpdates = true
查尔斯的答案有效,但你可能想这样做:
之后清理 reset 。
否则,您可能会收到消息“ Interactive rebase already started ”。
Interactive rebase already started
在我做任何非常重要的操作之前,我实际上在分支上放了一个备份标签(大多数rebase都很简单,但是如果它看起来很复杂的话我会这样做)。
然后,恢复就像一样容易 git reset --hard BACKUP 。
git reset --hard BACKUP
运用 reflog 不适合我。
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