首页 > 解决方案 > 重新设置合并冲突:如何撤消?

问题描述

我正在研究一个月前从 master 分支出来的功能分支 B。随着其他新功能的出现,主分支不断更新。

这是 master 分支现在的样子:

1 -> 2 -> 3 -> 4 -> 5 -> 6 ->7 

当我第一次分支出来时,它看起来像这样:

1 -> 2 -> 3

这就是我的功能分支 (B) 现在的样子:

x -> y -> z

现在我已经准备好将我的新功能推送到 master,我被建议先从 master 变基,然后创建一个 PR。

在这样做git rebase时,我的分支遇到了与几个文件的合并冲突。我以为我会保留传入的更改,并且变基将正常进行。但是,我解决了冲突,将整个“REBASE MASTER”步骤转换为一种“MERGE MASTER”。又名:它将已经合并到 master 中的提交应用到我的功能分支中,而不是我最初打算使用git rebase.

这就是我的功能分支现在的样子:

x -> 4 -> 5 -> 6 -> y -> 7 -> z

这是我想要实现的(但没有实现):

1 -> 2 -> 3 -> 4 -> 5 -> 6 ->7 -> x -> y -> z

我怎么回去?这已经被推送到远程分支,所以我不能简单地删除我的本地分支并再次从原点获取。

我能想到的一种方法是再次从 master 分支出来,并创建一个功能分支 C。然后,从 B 到 C 的cherry-pick提交。一旦我确定 C 是 B 的完整副本(并且只包含我的提交想要),我可以删除 B。我错过了什么吗?还是有更好/更快的方法?

标签: gitmergerebaseabort

解决方案


(首先,以防万一,中止任何仍在进行中的变基git rebase --abort


你是唯一一个在这个特性分支上工作的人吗?(我想是的,我会假设它为以下)

PR 是否已被接受/合并到 master 中?

如果不是,那么这是一个非常不可逆转的情况。(这可能是 Lux 在评论中暗示的)

首先,找到您需要恢复的提交哈希(z在您的示例中)。为此,您可以检查您的分支的reflog(或者如果可用,可以从您最近的命令输出中选择它)。

然后将本地分支 B 恢复到旧引用(在变基之前)并再次将其推送到远程(使用--force,因为 git 会抱怨这不是线性历史)。

git branch -f B <commit_hash_of_z>
git push -f origin B

现在你可以重做你的 rebase 并尝试找出它上次横盘的地方。


推荐阅读