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

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

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

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


当前回答

如果您成功地重新基于远程分支,并且不能git rebase--abort,那么您仍然可以使用一些技巧来保存您的工作,并且不需要强制推送。假设您的当前分支因错误而被重新设置为分支,并正在跟踪源/分支

gitbranch-m your branch rebased#重命名当前分支git checkout origin/your branch#签出到源已知的最新状态git结帐-b您的分行检查git-log您的分支,将其与git-log分支进行比较,并定义分支中缺少的提交gitcherry-pickCOMMIT_HASH用于分支中的每个提交推动您的更改。请注意,两个本地分支与远程/您的分支关联,您应该只推送您的分支

其他回答

如果你不想硬复位。。。

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

git reflog

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

git checkout HEAD@{57}

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

git checkout -b new_branch_name

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

git reset --hard ORIG_HEAD

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

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

假设你有一个想象中的主题分支,称为topic,当master的提示是0deadbeef提交时,你分支了master。在主题分支的某个时刻,您完成了git rebase master。现在您要撤消此操作。以下是操作方法:

git rebase --onto 0deadbeef master topic

这将接收所有关于主题的提交,但这些提交不在主控上,并在0个标题的顶部回放它们。

有了--on,你可以将你的历史重新整理成任何形状。

玩得开心。:-)

如果您已经将分支推送到远程存储库(通常是它的源位置),然后您成功地进行了重基(没有合并)(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

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

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将无法工作。