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

标签 git merge

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

   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/

相关文章:

c++ - Git 1.56 boost 存储库中缺少 boost::posix_time::to_time_t

Git diff 报告本地更改 'old mode'/'new mode'

git - 如何选择包含端点的 git commit 范围

python - 将 View 与模板 View django 合并

git-subtree pull 并发症

python - 从一组列中检索第一个非 NA 值

git pull 自动 merge

git - $ git add --all 与 $ git add * 之间的区别?

github - 在 Android Studio 上操作 GitHub 拉取请求

Mercurial 工作流程,具有选择性功能部署和持续集成