这是一件烦人的事情。
我使用这个命令来合并两个分支
git checkout -b temp public/master
git merge -Xtheirs --squash -m "squashed with devtemp" devtemp
我遇到一些冲突:
CONFLICT (rename/delete): public/github.css deleted in devtemp and renamed in HEAD. Version HEAD of public/github.css left in tree.
Removing public/extra-html/exit-codes.html
Removing public/.gitkeep
Auto-merging package.json
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.
怎么能忽视这种冲突呢?我认为 --theirs/--ours (或者这些命令的正确 Git API 是什么)可以解决此类问题吗?有没有更好、更实际的方法?
The -X theirs
策略参数仅指导合并对一个文件内的各个冲突的冲突解决,而不是针对高级全文件冲突。
在这种情况下,正如消息所说,冲突在于“他们”(devtemp
) 删除public/github.css
完全,而“你”(HEAD
)重命名它。您的 Git 不确定在这里要做什么,并已将文件保留在新名称下。
如果您想做他们所做的事情,只需git rm
文件以其新名称命名,以便将其删除。但是......请注意,重命名是detected通过内容相似性,因此他们可能根本没有实际删除该文件,而是删除了另一个文件,其内容(在删除之前)与您创建的新文件非常相似。在这种情况下,删除该文件可能是错误的。
在所有情况下,每当进行合并时,明智的做法是在提交之前测试结果。使用时尤其如此-X
与任一ours
or theirs
。 Git 不知道它在组合什么,仅仅依赖于文本相似性,并且可以进行无意义的合并,尤其是当盲目偏向某一方时在发生冲突的情况下但使用both双方的改变,只要这些改变不冲突(这就是-X
选项做)。
自从你跑步以来git merge --squash
,由于某种原因抑制了最终的git commit
无论如何(a lagit merge --no-commit
),你已经预料到必须运行git commit
分别地。只需解决冲突(并像往常一样彻底测试)并提交即可。
Edit(根据评论):如果您想以编程方式执行此操作(尽管我建议不要这样做),您可以使用git ls-files --stage
(也许与-z
以获得更好的机器可读输出)。任何非零阶段条目都意味着合并失败。索引的内容会告诉你发生了什么:
- 基本版本存在,我们的存在,他们的不存在:重命名/删除冲突,其中 Git 保留了“我们的”重命名版本。删除我们的(
git rm -- <path>
) 采取“他们的”删除。
- 基本版本存在,他们的存在,我们的不存在:重命名/删除冲突,其中我们删除了文件但他们重命名了它。工作树可能(我没有测试过)在其名称下有该文件。添加它(
git add -- <path>
)来重新命名。 (您将需要设置一个测试用例并验证这是正确的路径。)
- 基本版本不存在,他们的存在,我们的存在:创建/创建冲突。毫无疑问,Git 将我们的文件版本保留在树中。使用
git checkout --theirs -- <path>
将其版本提取到工作树,然后git add -- <path>
切换到他们的版本。
我认为这应该涵盖所有未解决的案件。或者,如果您遇到从未有任何实际重命名的情况,您会从 Git 的重命名检测代码中得到错误的命中,并且您会想要-X no-renames
禁用它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)