[英]GIT: git checkout --ours still showing “both modified”
我正在嘗試解決某些文件中的合並沖突
both modified: myFile.h
我運行了以下命令:
git checkout --ours myFile.h
之后,我跑了:
git status
它顯示了這一點:
both modified: myFile.h
為什么仍顯示“兩者都已修改”?
一些git checkout
命令解決了合並沖突,采用了您簽出的版本,而有些則沒有。 這是沒有的情況之一。
因此,您必須使用以下命令將沖突標記為已手動解決: git add myFile.h
。
合並(動作,即謂語合並)是通過Git的索引 (也稱為暫存區或有時稱為緩存 )來完成的。 索引對於每個文件都有一個條目,它將進入您進行的下一次提交 。 通常,一個條目保存一個文件,但是索引每個條目有四個插槽 ,並對其編號。 插槽零( 0
)是正常的“無沖突,文件已准備提交”插槽。 插槽1、2和3僅在合並沖突期間使用,並且包含合並基本版本(插槽1),- --ours
版本(插槽2)和- --theirs
版本(插槽3)。
如果插槽0已滿,則其他三個插槽為空。 如果填充了其他任何插槽,則插槽0為空,文件處於“沖突”狀態。 (添加/添加,修改/刪除和重命名/刪除沖突的情況可能是僅填充了其他三個插槽中的兩個。)
當您運行git checkout commit -- path
, 1 Git將文件從給定的提交復制到插槽0,然后從插槽0復制到工作樹。 復制到插槽0會清空插槽1-3(如果已滿),因此文件現在已解析!
但是,當您運行git checkout --ours -- path
,Git不必向索引插槽0寫入任何內容,它只需從插槽2獲取文件內容即可。因此它從插槽2復制到工作樹,文件未解析。
請注意,這意味着您可以執行git checkout HEAD -- path
從HEAD
提交中提取文件的git checkout HEAD -- path
,寫入插槽0,從而解析並寫入工作樹。 不過,這在其他方面有細微的不同。 假設在合並期間,Git決定重新命名文件並對其進行修改。 考慮了重命名:文件的新名稱為evil/zorg
而不是舊名稱evil-zorg
。 如果您使用git checkout --ours
,Git將以新名稱evil/zorg
提取舊版本的HEAD(頭) evil-zorg
evil/zorg
。 如果您使用git checkout HEAD
,Git將找不到新名稱的文件!
(這是Git的另一種情況,它使實現細節得以顯示,或者等效地,將太多的東西塞進一個命令中。)
1的原因--
是處理其名字看起來像一個選擇的文件。 (例如,如果文件名是--theirs
呢?)如果path部分看起來不像選項,則不需要--
。 這是一個好習慣回暖,但:使用--
每一次,當你的文件名不象一個選項,你會不會感到驚訝的一天。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.