Rebase with merge conflicts:如何撤消?

Rebased with merge conflicts: How to undo?

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

主分支现在是这样的:

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

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

1 -> 2 -> 3

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

x -> y -> z

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

在执行 git rebase 时,我的分支遇到了与几个文件的合并冲突。我以为我只是保留传入的更改,并且 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。然后,cherry-pick从B提交到C。一旦我确定C是B的完整副本(并且只包含我想要的提交),我可以删除 B。我错过了什么吗?或者有 better/faster 方法吗?

有一个选项可以恢复签到,这本身就是单独的签到。

但我建议您仔细阅读。

https://www.atlassian.com/git/tutorials/undoing-changes/git-revert

也希望你明白"rebase A on B"和"merge A with B"的区别

我会建议如果你正在做 rebase,请在本地更新 master 的来源。(这是我保持事物位管理的技巧,我不知道它是否标准)

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


你是唯一一个在这个功能分支上工作的人吗? (我猜是的,我会假设为以下)

PR 已经accepted/merged 成为 master 了吗?

如果不是,那就是非常不可挽回的局面了。 (这可能是Lux在评论中暗示的)

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

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

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

现在你可以重做你的 rebase 并尝试弄清楚它上次横向移动的位置。