1

我有一个 git 分支,dev这正是我希望我的另一个 git 分支所在master的位置。 master有一些修补程序在未来比两者的共同祖先更远,所以这个命令链会产生复杂和愚蠢的合并冲突:

git checkout master
git merge dev # Complicated merge conflicts. Boo hiss.

我想做的是在 master 上进行一个新的提交,它的状态为 dev HEAD 。从那时起,事情可以以更理智的方式进行

例子:

dev:    A ---> B ---> C ----> D
master: A ---> Y ---> Z ----> *

A是我的共同祖先。Y 和 Z 是相互冲突的修补程序更改,因此 D、A 和 Z 之间的三向合并是一团糟。

最后我想要这个结果:

  • master 的 HEAD 包含与 dev 上的 HEAD 完全相同的代码
  • 历史没有被重写,因为两个分支都被推送到远程
  • 一个很好的提交消息,解释了这个合并提交
4

3 回答 3

2

您可以尝试使用ours合并策略:

git checkout dev
git merge -s ours master
git checkout master
git merge dev

合并到 master 将创建一个合并提交,但提交的结果将忽略在master. 然后,您只需快进master以匹配dev

合并策略的文档中

ours

这解决了任意数量的头,但合并的结果树始终是当前分支头的树,有效地忽略了所有其他分支的所有更改。它旨在用于取代分支的旧开发历史。-Xours请注意,这与递归合并策略的选项不同。

于 2013-09-02T22:22:16.533 回答
1

要在 master 上获得与 dev 上的内容完全匹配的新提交,您可以执行以下操作:

git checkout dev                         # Get the working directory we want.
git symbolic-ref HEAD refs/heads/master  # Move HEAD to master without changing 
                                         # index or working directory.
git commit                               # Create the new commit on master.

这将创建一个与 dev 分支分开的全新提交。

我的灵感来自这里:https ://stackoverflow.com/a/6070417/2348315

如果您在 dev 和 master 之间进行合并提交,则需要解决这些单独的历史记录。在此操作之后立即创建合并提交应该是无冲突的,但它必须是合并提交而不是快进合并。

如果您正在挑选更改并且遇到了您想以您描述的方式解决的冲突情况,那么这种方法将是有意义的。如果您的工作流程是合并更改,那么 @Cupcake 的merge -s ours方法似乎更合适。

于 2013-09-02T22:46:07.273 回答
0
  1. fork marster 到一个新的分支修补程序
  2. 将主人重置为您想要的祖先(A)
  3. 将 D (== head/dev) 合并到 master

有关重置好书 gitpro 的详细信息:http: //git-scm.com/2011/07/11/reset.html

于 2013-09-02T22:21:42.467 回答