【问题标题】:Git force mergeGit强制合并
【发布时间】:2019-04-25 13:46:48
【问题描述】:

我想知道我应该怎么做才能强制从 dev 分支合并到我的 master 分支?使用“git merge dev”会导致很多冲突。但是,我不想单独处理它们。相反,我只想使用我的 dev 分支中的所有文件并将其合并到 master 中。但是这种“强制合并”并不像我想象的那么容易。有人可以指出我正确的方向吗?

【问题讨论】:

  • “强制合并”是什么意思?您会遇到冲突,因为 git 无法对内容进行排序。您始终可以使用合并选项来告诉它采用存在冲突的某个分支的版本:-Xours 或 -Xtheirs。
  • stackoverflow.com/a/10697551/1375964 可以使用递归的“使用 -ours”策略。 stackoverflow.com/q/17667023/1375964 -您可能只想更改 master 指向的内容。如果您共享此存储库,请谨慎操作
  • @eftshift0 我偶然发现了这些选项。但老实说,我并没有完全理解在我的案例中使用哪一个。我基本上希望我的开发分支成为我的“主人”。这就是我所说的“强制合并”。那么,哪个分支是“我们的”,哪个分支是“他们的”?

标签: git github


【解决方案1】:

我只想使用我的 dev 分支中的所有文件

如果您的意思是要使用开发分支中的所有文件 - 即由于分支分歧而对 master 分支所做的任何更改都应该撤消 - 那么有几种方法.

合并 -s ours

你可以

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

这有点迂回,因为没有“他们的”策略。 (默认合并策略有一个“他们的”策略选项,但它仍会尝试应用来自 master 的更改,只要它们与来自 dev 的更改不冲突;如果您想要只保留dev 版本,这是行不通的。)因此,您使用ours 策略在master 和dev 之间创建合并提交dev 所有文件的版本,然后快进 master 到该合并。

这意味着在合并提交时父级的顺序将被颠倒,这是您通常不会注意到的,但在某些情况下可能很重要(例如,如果您在日志上使用 --first-parent 或其他内容)。

提交树

如果父母的顺序很重要,您可以使用管道命令commit-tree

git checkout master
git merge $(git commit-tree dev -p master -p dev -m "merging dev over master")

历史改写

上述方法的潜在缺点是它们会产生一个可能不直观的合并提交,因为它的结果会忽略来自合并一侧的更改(而合并预计会合并来自两者的更改)边)。因为您的合并在正常策略下会发生冲突,所以问题并不大,但仍然有人将其归类为“邪恶合并”。如果你想避免这种情况,另一种选择是重写历史记录。

这也有不利的一面,尤其是当您使用此存储库与其他开发人员协作时。您可以在 git rebase 文档中的“从上游变基中恢复”下阅读有关该问题的信息(以及通常如何解决该问题)。 (虽然文档将问题称为“上游变基”,但它确实适用于共享分支的任何历史重写。)

如果您认为历史重写有意义,那么最简单的方法就是移动 master 分支,使其指向与 dev 相同的提交。

git checkout dev
git branch -f master

【讨论】:

  • ours 和 theirs 总是让我感到困惑......也许参考策略文档 recursive-ours 和 ours 会有所帮助。
  • @Mark Adelsberger 感谢您的精彩文章。 'merge -s ours' 方式对我有用。
猜你喜欢
  • 2021-04-25
  • 1970-01-01
  • 2020-01-16
  • 2017-03-23
  • 2013-02-21
  • 2013-10-23
  • 2011-10-12
  • 1970-01-01
  • 2016-01-29
相关资源
最近更新 更多