2017-02-22 122 views
1

我是新来的混帐,所以请裸露在我身边。正在使用`git checkout - 他们的<filename>'解决合并冲突的合法方式?

我从master更新,并得到一个合并错误,我不应该修改文件(我必须这样做是因为意外)。

而不是试图找出代码中的合并问题,我可以告诉git使用'他们'的副本吗?我可以只使用git checkout --theirs而没有任何后果吗?

如果不是,那么这样做的正确方法是什么?

+1

嗯,它会做它说的,但我建议你确保你不知道做的改变对'git diff master ... HEAD path/to/file'来说并不重要。如果冲突很短,将merge.conflictstyle设置为diff3也会有所帮助。 – Ryan

回答

2

可以,其实git checkout --theirs -- path更换工作树版本的文件(名为路径)与他们的版本。 --部分仅在path类似于git checkout选项时才是必需的,例如,如果该文件被命名为--ours--force或者其他愚蠢的东西。 (这是很好的养成使用它,虽然,以防万一的习惯。总有一天,你会绊倒名为-rf文件和-- -rf习惯会阻止您运行rm -rf ... :-))

由于让Git让实现显示通过,这不会标记文件已解决,但。您必须单独将git add标记为已解决的路径。这是因为,当文件处于冲突状态时,所有三个版本(基数为--ours--theirs)都存储在该索引条目的三个“冲突版本”插槽中。要将文件标记为已解决,您必须让Git将这三个插槽打开并将文件写入更常规的插槽零条目。这就是Git如何知道哪些文件已解析,哪些不是:通过这些特殊的较高编号的索引插槽。

奇怪的是,如果你git checkout MERGE_HEAD path,那标记为已解决的文件。这是因为此形式的git checkout首先将指定的commit-MERGE_HEAD中的文件复制到索引插槽零中,然后从那里复制到工作树。 “复制到插槽0”步骤可解决合并冲突。但需要注意的是,如果你更名为文件时,path你需要--theirspath你需要MERGE_HEAD会有所不同!