簡體   English   中英

GIT:git checkout-我們仍然顯示“兩個都已修改”

[英]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 -- path1 Git將文件從給定的提交復制到插槽0,然后從插槽0復制到工作樹。 復制到插槽0會清空插槽1-3(如果已滿),因此文件現在已解析!

但是,當您運行git checkout --ours -- path ,Git不必向索引插槽0寫入任何內容,它只需從插槽2獲取文件內容即可。因此它從插槽2復制到工作樹,文件解析。

請注意,這意味着您可以執行git checkout HEAD -- pathHEAD提交中提取文件的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM