gpt4 book ai didi

git - 如何重新 merge 已经 merge 的分支?

转载 作者:太空狗 更新时间:2023-10-29 12:47:49 30 4
gpt4 key购买 nike

我有一个类似于下图的提交图。标记为 * 的提交表示大量提交。

   A*
|
B---------
| |
C* D* <- old feature branch
| |
E---------
|
F*
|
G <- master

merge 提交 E 未正确完成,C* 中的一些更改(不是全部)已丢失。我怎样才能重做 merge 以将更改重新引入当前的母版?

一切都已经被推送(开源项目),所以改变历史不是一个选项。

我尝试从提交的 C* 中创建一个补丁并将其应用到 master,但是因为 C* 中的一些更改已被正确 merge ,并且因为该项目自该提交以来不断发展,大约80% 的补丁失败。

理想情况下,我们将采用 C* 中的所有更改,将它们应用到掌握并解决所有冲突。但是因为分支已经被 merge 了,所以 git 没有检测到任何变化,也不允许再次 merge 。

$ git checkout 5bc5295   # C
HEAD is now at 5bc5295... cleanup

$ git checkout -b "missing-commits"
Switched to a new branch 'missing-commits'

$ git checkout master
Switched to branch 'master'
Your branch is up-to-date with 'origin/master'.

$ git merge missing-commits
Already up-to-date.

最佳答案

Ideally, we would take all the changes in C*, apply them to master and resolve all conflicts.

不,理想情况下你会倒带时间,像以前那样进行 merge (但这次是正确的),然后重新应用 F* 更改并最终得到正确的 master

你可以这样做:

git checkout missing-commits
git checkout -b correct-merge
git merge D # do it right, this time around!
git checkout master
git checkout -b correct-master
git rebase --onto correct-merge wrong-merge correct-master # have fun with the mother of all rebases!

如果你设法处理 rebase 期间的所有冲突,你最终会得到你想要的,最初,在分支 correct-master 中。

由于您不想更改历史记录,因此您可以创建一个大补丁并将其应用到您当前的 master,但我更喜欢这种方法(假设您在工作中完成了所有工作目录 yourrepos):

cd yourrepos ; git checkout correct-master ; cd ..
cp -a yourrepos newrepos
rm -rf newrepos/.git
cd yourrepos ; git checkout master ; cd ..
cp -a yourrepos/.git newrepos/

现在,当您输入 newrepos 并执行 git status 时,您将在分支 master 上,并且会准确地看到 之间的所有更改code>mastercorrect-master,就像您应用了补丁一样。它将捕获已删除的文件、新文件、更改的文件、更改的权限、更改的符号链接(symbolic link)等。

理想情况下,如果一切顺利,它将准确显示 C 中缺少的提交。使用您最喜欢的 git add 变体,最后使用一个不错的 git commit(或者多个,如果您愿意),您就完成了。历史没有被改写。

关于git - 如何重新 merge 已经 merge 的分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42583073/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com