2017-02-22 18 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會有所不同!