为什么会使用“git merge -s ours”?

问题描述 投票:13回答:5

我理解“我们的”合并策略(听到合并的引用?)实际上并没有使用来自其他分支的任何提交。

“我们的”战略有时被称为“保持对方的历史”。但它将历史记录为“应用”。奇怪的。有没有我想要这种行为的情况?

作为替代方案,您也可以导入其他分支并将其历史记录放在那里,它所属的位置。

请注意,我问的是“-s ours”策略,而不是“-s我们的”选项“-s recursive”(不同之处在于它应用那些不冲突的提交)。

git merge
5个回答
11
投票

一种用法是“跳过”在维护分支上进行的提交,该提交无意返回到开发的主/主干分支。请参阅此前一个问题的示例:git - skipping specific commits when merging


4
投票

另一个原因是,如果您的分支与活动分支非常不同步,并且您希望使用活动分支更新旧分支,但可能的合并冲突会阻止使用正常合并轻松完成此操作。

例如,我的用例是:

你有一个master和dev分支,由于某种原因,你没有在几周内更新你的主分支,并且你试图将你的dev分支合并到master现在会导致合并冲突。你可能想要做的是用dev分支的当前状态覆盖你的主分支,所以让它们同步。

在这种情况下你可以做的如下,使用另一个SO用户in another SO answer here概述的步骤。但请参阅下面的警告说明。

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

值得一提的是:最后,我的主人与我的开发人员保持同步,但开发人员显示4个提交被推送到遥控器,这很奇怪。应该有0推,因为我只是想更新master。不过,代码看起来很好。值得注意的是,因为我之前从未使用过git merge -s ours所以我不是100%使用它。

我还找到了另一个使用ours的答案,这对人们有用:https://stackoverflow.com/a/13307342/339803


2
投票

我在另一个分支中使用这个伪合并来跟踪其他分支,包括被遗弃的分支。这个额外的分支实际上只有一个文件(称为branches-list),它包含活动和非活动分支的文本列表,但在重要点(主要是分支点和“分支结束”,要么合并要么放弃)开发分支合并(使用“-s ours”)到此分支。

这是our project最近的截图:

因此,我最后从大师那里分支elo-test,然后从我分支stroke-transform-example为我的question here(和答案 - 这应该是两个不同的提交,但)。在每个这样的分支点,更重要的是,在分支结束时的每个点,而不是它被合并到其他分支(当我下次清理时将发生在stroke-transform-example),我现在将这个分支与-s ours合并到meta-分支branches

然后我可以在不丢失历史的情况下删除未使用的分支,因此git branch -a的输出总是非常小。如果我想回顾一下我做了什么,我很容易找到它们。

(我认为这不是真正的选择,但它的效果非常好。)


0
投票

另一种用途是作为强制推动的替代方案,其不会导致其他人的非快进变化。

例如。你想恢复传入(愚蠢)提交,但你不想做git push -f,因为那时你将花费下一个半小时指导你的客户从中恢复,你想要一个更短的替代品

git checkout -b temp remote/origin
git revert HEAD
git push temp:origin
git checkout master
git merge origin/master

所以你干脆做

git merge -s ours origin/master

0
投票

一个用途是作为另一个合并的准备。

假设您有一些下游更改要与新的上游版本合并,但新的上游版本不是旧版上游版本的git后代(可能是因为旧的上游版本是一个与trunk不同的稳定分支,也许是因为上游版本实际上是导入工具的结果)。

你能做的是。

  1. 查看新的上游版本。
  2. “psuedomerge”旧的上游版本。
  3. 合并新的下游版本。

通过这种方式,您的本地更改将被合并,但是git不会尝试合并旧的上游更改,因为它认为它们已经合并。

© www.soinside.com 2019 - 2024. All rights reserved.