我正在用 cpp 撰寫一個專案。當我使用時,git merge other_branch我同意一個有線問題:
在我的分支My上,目錄中有一個頭檔案,Foo.h在${PROJECT_ROOT}我要合并的分支上other_branch,有一個頭檔案foo.h在${PROJECT_ROOT}. Foo.h并且foo.h有不同的內容,當我使用git merge other_branchonMy分支時, git 替換Foo.h為foo.h. 事實上,Foo.h 消失了,只有 foo.h頭檔案存在于${PROJECT_ROOT}. 為了解決沖突,我重命名foo.h為Foo.h并更改內容,解決問題后,我使用git add .andgit commit -m "..."完成合并。執行此操作后,我使用git status查看我的作業空間條件,我發現它Foo.h沒有暫存為提交。所以我git add Foo.h用來暫存檔案但沒有任何反應,Foo.h仍然沒有上演提交,它是有線的。
我想知道:
- 為什么 git replace
Foo.hwithfoo.h而不是報告沖突? - 為什么不
git add .作業?
PS。當我看到遠程存盤庫時,我發現Foo.h并且foo.h全部存在。我的作業系統是MacOS。
我的結論是:git是區分大小寫的,MacOS的檔案是不區分大小寫的,git其實是想保留foo.handFoo.h但是OSX把Foo.handfoo.h當成一個檔案,所以只foo.h存在,當我重命名foo.h為Foo.hgit的時候仍然認為Foo.h是foo.h,所以當我使用時git add Foo.h,git addfoo.h實際上,所以Foo.hin git 變成了幻象。
uj5u.com熱心網友回復:
即使是單個作業系統也可能支持具有區分大小寫和不區分大小寫檔案名的檔案系統。
盡管經過大量作業,應該可以確定特定git存盤庫所在的底層檔案系統是否使用區分大小寫或不區分大小寫的檔案名,無論出于何種原因,這在git您正在使用的版本中都沒有實作git準確配置是您的責任。配置core.ignorecase設定告訴 git 底層檔案系統是區分大小寫還是不區分大小寫,并且應該進行相應的設定。
可以合理地預期,特定作業系統的預構建git包將預先安裝并配置為作業系統的合理默認值。因此,如果作業系統主要使用不區分大小寫的檔案名,那么期望git作業系統的預構建包將相應設定是合理的。但是,從表面上看,無論出于何種原因,這并沒有發生在你的案例中。
如果git配置為區分大小寫的檔案名,git則將相應地繼續其業務,并且生成的芯片將落在可能的位置。
為什么 git 用 foo.h 替換 Foo.h 而不是報告沖突?
因為git采用了計算機編程的黃金法則:計算機總是完全按照你告訴它做的事情,而不是你想讓它做的事情。現在變成了:git始終完全按照您的要求執行操作,而不是您希望它執行的操作。
在這種情況下,您告訴git創建或合并foo.h。因此,git 繼續并創建了檔案foo.h。您的作業系統按照git的說明破壞了現有Foo.h檔案。
為什么不 git add 。作業?
因為,在這一點上,事情是毫無意義的。
您前進的方法是設定core.ignoreCaseglobal,然后進行新的結帳。
uj5u.com熱心網友回復:
您的結論大部分是正確的:Git區分大小寫,而您的特定macOS 檔案系統不區分大小寫。但是,macOS 可以使用區分大小寫的檔案系統,這就是在此存盤庫中合并時要走的路。 以下是如何在任何現有卷上創建區分大小寫的 macOS 磁盤映像,然后使用它與 Git 一起作業。
uj5u.com熱心網友回復:
默認情況下,Git 以區分大小寫的方式運行。這是正確的行為,因為不可能以不區磁區域設定的方式正確地對文本進行大小寫折疊。但是,您使用的檔案系統不區分大小寫,因此 Git 根本無法同時檢出這兩個檔案,因為您的檔案系統不支持。
Git 沒有對此發出警告的原因git merge是因為不同的檔案系統以不同的方式折疊大小寫。事實上,大小寫折疊演算法可能取決于格式化檔案系統的作業系統版本。不幸的是,沒有作業系統將大小寫折疊演算法暴露給用戶空間,因此 Git 無法知道正在使用的大小寫折疊演算法(如果有的話)。
Git可以在新克隆上檢測到這一點,因為沒有現有檔案,所以如果它覆寫了一個檔案,那么肯定存在沖突。但是,當作業樹已經存在時,這不起作用。
請注意,Git 會自動檢測檔案系統是否不區分大小寫,core.ignoreCase如果是,則為存盤庫設定。您不應修改此設定或全域設定它,因為這會破壞 Git 的自動檢測。但是,這仍然不能讓 Git 檢測到所有大小寫折疊問題,因為它根本無法檢測到。
如果您想使用此存盤庫,您需要自己創建一個區分大小寫的 APFS 卷,或者使用 Linux 或其他非 macOS Unix VM 來執行此操作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521441.html
標籤:混帐
上一篇:如何解決gitrevert中的所有合并沖突,以便僅將HEAD(當前更改)更改提交到分支
下一篇:Git最佳實踐
