如何轻松撤消git重基?冗长的手动方法是:

签出两个分支的提交父级创建并签出临时分支手工挑选所有提交重置故障的重基分支以指向临时分支

在我目前的情况下,这是可行的,因为我可以很容易地发现两个分支的提交(一个是我的东西,另一个是同事的东西)。然而,我的方法给我的印象是次优且容易出错(假设我刚刚用自己的两个分支重新建立了基础)。

澄清:我所说的是一个重基,在重基过程中,多次提交被重复,而不仅仅是一次。


当前回答

如果你不想硬复位。。。

您可以从reflog签出提交,然后将其保存为新分支:

git reflog

在开始重定基础之前找到提交。您可能需要进一步向下滚动才能找到它(按Enter键或PageDown键)。记下HEAD编号并更换57:

git checkout HEAD@{57}

检查分支/提交,如果正确,则使用此HEAD创建一个新分支:

git checkout -b new_branch_name

其他回答

如果你不想硬复位。。。

您可以从reflog签出提交,然后将其保存为新分支:

git reflog

在开始重定基础之前找到提交。您可能需要进一步向下滚动才能找到它(按Enter键或PageDown键)。记下HEAD编号并更换57:

git checkout HEAD@{57}

检查分支/提交,如果正确,则使用此HEAD创建一个新分支:

git checkout -b new_branch_name

按照@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)
$

如果您在分支机构,可以使用:

git reset --hard @{1}

HEAD不仅有一个引用日志(通过git reflog获得),每个分支也有reflog(通过gitreflog<branch>获得)。所以,如果您在master上,那么git-relog master将列出该分支的所有更改。您可以通过master@{1}、master@{2}等引用这些更改。

gitrebase通常会多次更改HEAD,但当前分支只会更新一次。

@{1} 只是当前分支的快捷方式,因此如果您在master上,它等于master@{1}。

git reset——如果在交互式重基过程中使用git rese,硬ORIG_HEAD将无法工作。

实际上,rebase将您的起点保存到ORIG_HEAD,因此这通常很简单:

git reset --hard ORIG_HEAD

然而,reset、rebase和merge都会将原始HEAD指针保存到ORIG_HEAD中,因此,如果您在尝试撤消rebase之后执行了这些命令,则必须使用reflog。

对于多次提交,请记住,任何提交都引用导致该提交的所有历史记录。因此,在查尔斯的回答中,将“旧承诺”读为“旧承诺中的最新承诺”。如果您重置为该提交,那么导致该提交的所有历史记录都将重新出现。这应该是你想要的。