在这个主题上似乎有千变异,并且许多已被问到,但我似乎无法为我找到合适的解决方案。git:checkout vs merge vs ??为解决有利于我们选择的冲突
我有两条发展线,一条是关于我(我们)完成的“主人”,另一条是关于“their_new_stuff”的分支。两者都改变了大量的文件,触及同一地点的许多文件并产生冲突。
现在我需要将他们的工作合并到我们的工作中,并以下列方式处理冲突:对于99%的冲突,我可以简单地接受“我们的”。但是,我也需要他们所做的所有不相互冲突的改变,并且在一些关键冲突中,我需要接受他们的或者手工合并。了解哪些文件需要手动合并或合并需要人工检查。
我曾尝试以下:
尝试1:
git merge their_new_stuff
# for each file with conflicts:
# if requires manual merge:
# do manual merge
# else:
git checkout --ours all/files/not/merged/by/hand.cc
起初我以为这是我想要的,但是这并不工作,因为结帐用“我们”是完整文件结帐,并且不仅检出/解决冲突的部分。所以我失去了他们想要的非冲突性变化。
尝试2:
git merge -s recursive -Xours their_new_stuff
这不起作用,因为它不允许单个文件合并。我需要知道哪里存在冲突,并且希望看到具有冲突标记的文件版本来帮助我进行手动合并,所以理想情况下,我会在合并失败后执行某些操作。
尝试3:然后我想我或许可以这样做:
git merge their_new_stuff
# for each file with conflict:
# if file needs manual merge:
cp file file2
git merge --abort
git merge -s recursive -Xours their_new_stuff
# for each file with manual merge:
cp file2 file
# merge by hand
我认为这应该工作,但感觉很klugy。有没有一种“正确”的方式来做到这一点?理想情况下,我想做类似的事情:
git merge their_new_stuff
# for each file with conflict
# if needs manual merge
# do manual merge
# else
# is there any command that does something like?:
git remerge -s recursive -Xours file
实际上我想做合并,得到冲突标记。检查手动合并,如果不需要手动合并,请使用“-Xours”重新合并该文件。这可能吗?
的Git确实有'混帐合并-file',你可以在每个文件的基础上使用。请注意,为了*要*使用它,您必须从基础(阶段1),本地('--ours')和其他(' - 他们')文件中提取(通常从索引的三个阶段)到普通的文件系统文件。请注意,'merge-file' *会带'--ours'和'--theirs',它们具有'-X'风格的含义。 – torek
@torek谢谢,不知道。这很有趣 - 我想我可以做一个''merge''来查看冲突,然后放弃,然后在“keep our”文件和''merge-file''上使用'merge-file --ours''没有''--ours''来获取“手动合并”文件中的冲突标记。如果更好的东西不会很快出现,请随时让这个答案,我会接受。 –
您甚至不需要(也可能不想)中止合并:要将文件的三个索引版本提取到临时文件中,并且只有在文件保持未解析状态时,这些文件才保留在*索引中。 (另请参阅:'git ls-files --stage','git ls-files --unmerged'。) – torek