使用`git checkout --theirs <filename>` 是解决合并冲突的一种gitimate 方法吗?

Is using `git checkout --theirs <filename>` a legitimate way of resolving a merge conflict?

我正在从 master 进行更新,但遇到了一个我不应该修改的文件的合并错误(我一定是不小心这样做的)。

与其试图找出代码中的合并问题,不如告诉 git 使用 'their' 副本?我可以只使用 git checkout --theirs 而不产生任何后果吗?

如果不是,正确的处理方法是什么?

事实上,您可以 git checkout --theirs -- <em>path</em> 来替换工作树版本文件(名为 path)及其版本。仅当 path 类似于 git checkout 选项时才需要 -- 部分,例如,如果文件名为 --ours--force 或类似的傻事。 (不过,养成使用它的习惯是件好事,以防万一。有一天你会偶然发现一个名为 -rf 的文件,而 -- -rf 的习惯会阻止你 运行 rm -rf... :-) )

由于 Git 让实施显示出来,因此 不会 将文件标记为已解决。您必须单独 git add 将其标记为已解决的路径。这是因为当文件处于冲突状态时,所有三个版本(基本、--ours--theirs)都存储在该索引条目的三个 "conflicting versions" 槽中。要将文件标记为已解决,您必须使用 Git 破坏这三个槽并将文件写入更正常的槽零条目。这就是 Git 知道哪些文件已解析,哪些未解析的方式:通过这些特殊的编号更高的索引槽。

特别地,如果你 git checkout MERGE_HEAD <em>path</em> 将文件标记为已解决。这是因为这种形式的 git checkout 首先将文件从指定的提交 — MERGE_HEAD — 复制到索引槽零,然后从那里复制到工作树。该 "copy to slot 0" 步骤解决了合并冲突。但请注意,如果您 重命名 文件,则 path 您需要 --theirs path你需要的跟MERGE_HEAD会不一样!