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 并尝试弄清楚它上次横向移动的位置。
我正在研究一个月前从 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 并尝试弄清楚它上次横向移动的位置。