git - “git merge -s ours”是否有“theirs”这个版本?

  显示原文与译文双语对照的内容

使用 git merge,我自己有 conflicts,"b"成在合并主题分支 我知道所有的冲突都可以用"b"中的版本解决。

我知道 git merge -s ours 但是我想要的是 git merge -s theirs

为什么不存在在与现有的git 命令冲突后,如何实现相同的结果? ( git checkout 来自的每个未合并文件)

更新:从分支中丢弃任何东西的"解决方案"不是我正在寻找的东西。

时间:

另一件要考虑的事情是使用-X添加策略。 例如:


git checkout branchA
git merge -X theirs branchB

这对我在 1.7.1版本的Git中工作。 我看到的唯一冲突是我在branchB中删除了一个文件。 合并会抱怨这是一个冲突。 基本上,当你签出branchA时,你在branchB中删除的文件仍然存在。 要解决冲突,只需执行以下操作:


git rm {DELETED-FILE-NAME}

从那里提交。

( 如果你记得先删除文件,则与-Xtheirs的合并不应该抱怨冲突)

将branchB合并到 checked-out branchA中的一个可能的测试解决方案:


# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB 

# make temporary branch to merged commit
git branch branchTEMP 

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

为了自动化它,你可以使用branchA和branchB作为参数将它包装到一个脚本中。

这里解决方案保留合并提交的第一个和第二个父级,就像你预期的那样 git merge -s theirs branchB

旧版本的git允许你使用"他们的"合并策略:



git pull --strategy=theirs remote_branch

但是这已经被删除了,如 Junio Hamano ( Git维护者) 中的解释。 在链接中,你可以执行以下操作:



git fetch origin
git reset --hard origin

请注意,这与实际合并不同。 你的解决方案可能是你真正要寻找的选项。

我使用了来自 Paul Pladijs的答案自现在。 我发现,你可以做一个"普通"合并,冲突发生,所以你


git checkout --theirs <file>

使用来自其他分支的修订解决冲突。 如果对每个文件执行这里操作,你就会得到与预期的相同的行为


git merge <branch> -s theirs

总之,这项工作比merge-strategy的工作要多 ! ( 这是用git版本 1.8.0测试的)

真的正确做合并以唯一输入你要合并的分支从你可以做

git merge -s ours ref-to-be-merged

git diff --binary ref-to-be-merged | git apply -R --index

git commit --amend

在我所知的任何场景中都不会有冲突,你不必做出额外的分支,它就像一个正常的合并提交。

然而这并不能很好的与子模块一起玩。

Paul pladijs的一个变种,不需要临时分支:


git checkout branchA

# Do a merge commit. The content of this commit does not matter.
# Note: This advances branchA.
git merge -s ours branchB

# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB

# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA

# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA

# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD

这将把你的newBranch合并到现有的baseBranch中


git checkout <baseBranch>//this will checkout baseBranch
git merge -s ours <newBranch>//this will simple merge newBranch in baseBranch
git rm -rf.//this will remove all non references files from baseBranch (deleted in newBranch)
git checkout newBranch --.//this will replace all conflicted files in baseBranch

...