Is there a "theirs" version of "git merge
When merging topic branch "B" into "A" using git merge
, I get some conflicts. I know all the conflicts can be solved using the version in "B".
I am aware of git merge -s ours
. But what I want is something like git merge -s theirs
.
Why doesn't it exist? How can I achieve the same result after the conflicting merge with existing git
commands? ( git checkout
every unmerged file from B)
UPDATE: The "solution" of just discarding anything from branch A (the merge commit point to B version of the tree) is not what I am looking for.
Add the -X
option to theirs
. For example:
git checkout branchA
git merge -X theirs branchB
Everything will merge in the desired way.
The only thing I've seen cause problems is if files were deleted from branchB. They show up as conflicts if something other than git did the removal.
The fix is easy. Just run git rm
with the name of any files that were deleted:
git rm {DELETED-FILE-NAME}
After that, the -X theirs
should work as expected.
Of course, doing the actual removal with the git rm
command will prevent the conflict from happening in the first place.
Note: A longer form option also exists. To use it, replace:
-X theirs
with:
--strategy-option=theirs
A possible and tested solution for merging branchB into our 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
To automate it you can wrap it into a script using branchA and branchB as arguments.
This solution preserves the first and second parent of the merge commit, just as you would expect of git merge -s theirs branchB
.
Older versions of git allowed you to use the "theirs" merge strategy:
git pull --strategy=theirs remote_branch
But this has since been removed, as explained in this message by Junio Hamano (the Git maintainer). As noted in the link, instead you would do this:
git fetch origin
git reset --hard origin
Beware, though, that this is different than an actual merge. Your solution is probably the option you're really looking for.
链接地址: http://www.djcxy.com/p/7182.html上一篇: 如何使用svn树重新同步git?
下一篇: 有没有“他们的”版本的“混帐合并