是的,事实上有不止一种方法可以做到。
rebase和merge(以及cherry-pick)命令都采用相同的strategy
和-X
标志传递给底层的git合并机制。对于recursive
策略,在出现在合并的分支中都修改了的文件的情况下,-Xours
和-Xtheirs
选择一个或另一个“方面”。
或者当合并停止并发生冲突时,您可以使用带有--ours
或--theirs
标志的git checkout
,从其中一个侧面选择版本。(您也可以使用其他命令来执行此操作;此处,我将坚持使用--ours
和--theirs
作为与使用合并机制的命令匹配的参数。)
这当然是不同的,因为您可以更改选择:
$ git checkout main
Switched to branch 'main'
$ git merge branch
... conflicts in files A and B ...
$ git checkout --ours -- A
$ git checkout --theirs -- B
注意这与“我们的策略”(上面展示了使用ours
选项的recursive
策略)非常不同。使用“我们的策略”,会发生完全不同的事情。让我们先不使用它,再次进行相同的合并:
$ git checkout main && git merge branch
... conflicts ...
$ git checkout --ours -- A B
假设有第三个文件
C
,Git可以自动合并它。当你执行上述操作时,Git会将
C
合并并保留
main:A
和
main:B
。但是如果你使用
git merge --strategy=ours branch
,Git会选择
main:A
、
main:B
和
main:C
,而且会放弃
branch:C
的更改而不是自动合并它们。
上面使用了
git merge
是因为它使得 "ours" 和 "theirs" 工作正确。然而我不喜欢 Git 给它们起的这些名字,因为在进行变基时,我们的版本和他们的版本会交换,因为变基是通过切换到 “另一个” 分支并执行一系列挑选操作来完成的。
$ git checkout mine; git rebase theirs
通过进行(非常)粗略的等价物来在下方工作:
$ git checkout theirs; git cherry-pick theirs..mine
然后,重新调整分支标签的位置,以便分支theirs
实际上不会移动。(在内部情况并不像这么糟糕:-),但它确实成功地使--ours
意味着 "their",而--theirs
则意味着"our",这是相当糟糕的外部表现)。
git merge --strategy=ours
是否等同于git merge --ours --file_with_conflict1 --file_with_conflict2 ... --file_with_conflict_n
,其中 'file_with_conflict1',... 'file_with_conflict_n' 是所有具有合并冲突的文件? - Diana Vazquez Romogit merge
不支持--ours
。你是不是想用git merge-file
?(它的用法不同,但确实有--ours
选项。) - torekgit merge --strategy=ours
b.git merge
然后git checkout --ours --file_with_conflict1 --file_with_conflict2 ... --file_with_conflict_n
,其中 'file_with_conflict1',... 'file_with_conflict_n' 是所有具有合并冲突的文件?(a) 和 (b) 是等价的吗? - Diana Vazquez Romo-s ours
的git merge
会尝试合并每个文件。其中一些将成功合并,因此结合了工作。其他文件将产生冲突;对于那些文件的git checkout --ours
将放弃他们的工作,只留下我们的工作。所以我们将得到一个混合:一些文件仅来自我们的工作(我们更改了文件而他们没有更改,或者存在冲突),一些仅来自他们的工作(他们更改了文件而我们没有更改),还有一些合并的文件(合并没有冲突)。但是带有-s ours
,Git 将忽略他们的工作。 - torek