如何轻松撤消git重基?冗长的手动方法是:
签出两个分支的提交父级创建并签出临时分支手工挑选所有提交重置故障的重基分支以指向临时分支
在我目前的情况下,这是可行的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是同事的东西)。然而,我的方法给我的印象是次优且容易出错(假设我刚刚用自己的两个分支重新建立了基础)。
澄清:我所说的是一个重基,在重基过程中,多次提交被重复,而不仅仅是一次。
如何轻松撤消git重基?冗长的手动方法是:
签出两个分支的提交父级创建并签出临时分支手工挑选所有提交重置故障的重基分支以指向临时分支
在我目前的情况下,这是可行的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是同事的东西)。然而,我的方法给我的印象是次优且容易出错(假设我刚刚用自己的两个分支重新建立了基础)。
澄清:我所说的是一个重基,在重基过程中,多次提交被重复,而不仅仅是一次。
当前回答
对于多次提交,请记住,任何提交都引用导致该提交的所有历史记录。因此,在查尔斯的回答中,将“旧承诺”读为“旧承诺中的最新承诺”。如果您重置为该提交,那么导致该提交的所有历史记录都将重新出现。这应该是你想要的。
其他回答
按照@Allan和@Zearin的解决方案,我希望我可以简单地发表评论,但我没有足够的声誉,所以我使用了以下命令:
我不得不简单地执行gitrebase-i-art(不使用-i),而不是执行gitrebase-i-art。
同时使用-i和--abort会导致Git显示用法/选项列表。
因此,我以前和现在使用此解决方案的分支状态是:
matbhz@myPc /my/project/environment (branch-123|REBASE-i)
$ git rebase --abort
matbhz@myPc /my/project/environment (branch-123)
$
另一种不需要进行硬重置的方法是创建一个具有您所需起点的新分支。
与其他解决方案一样,您可以使用reflog来找到正确的起点。
git reflog
(您也可以在此处使用git-log-g了解更多详细信息)
然后注意对提交SHA的引用(例如:e86a52b851e)。
最后,使用gitbranch命令。
git branch recover-branch e86a52b851e
参考:https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery#_data_recovery
实际上,rebase将您的起点保存到ORIG_HEAD,因此这通常很简单:
git reset --hard ORIG_HEAD
然而,reset、rebase和merge都会将原始HEAD指针保存到ORIG_HEAD中,因此,如果您在尝试撤消rebase之后执行了这些命令,则必须使用reflog。
如果您已经将分支推送到远程存储库(通常是它的源位置),然后您成功地进行了重基(没有合并)(gitrebase--abort给出“没有正在进行的重基”),您可以使用命令:
git reset--硬原点/{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
将分支重置为其旧提示的悬空提交对象当然是最好的解决方案,因为它可以恢复以前的状态,而无需花费任何精力。但是,如果您碰巧丢失了这些提交(例如,因为您同时垃圾收集了存储库,或者这是一个新的克隆),您可以再次重新设置分支的基础。这一点的关键是--on开关。
假设你有一个想象中的主题分支,称为topic,当master的提示是0deadbeef提交时,你分支了master。在主题分支的某个时刻,您完成了git rebase master。现在您要撤消此操作。以下是操作方法:
git rebase --onto 0deadbeef master topic
这将接收所有关于主题的提交,但这些提交不在主控上,并在0个标题的顶部回放它们。
有了--on,你可以将你的历史重新整理成任何形状。
玩得开心。:-)