問題描述
不同本地倉庫(e.g. Repo1, Repo2)之間同時修改一個文件時, 出現文件無法merge的情況.
具體表現為, 沖突(紅色雙向實心箭頭)一直存在, 點pull沒反應, 點push報錯, 雙擊文件也沒有出現merge提示("<<<<<<"這樣的符號), 點"add to index", mark as merged等等 都沒用. 手動merge或者overwrite, 也無法push回remote.
原因:
repo1和repo2同時修改一個文件e.g. README.MD
repo1修改成AAA, commit+push到remote
repo2修改成BBB, commit到本地.Fetch, 進入Sync Perspective. 沖突可見.
此時, 正確操作應該是: repo2中選擇沖突文件, 用merge tool來合並成最終版本.
但如果操作人員不小心, 講repo2中的沖突文件直接修改成CCC, 且不commit, 則會遇到上述問題. 導致pull(fetch+merge)不成, push不成, merge界面不出現的尷尬情形.
在沖突文件較多時, 這個問題比較隱蔽, 容易造成困擾.
根本原因:
不通過merge tool或者pull(不推薦), 直接修改文件, 會導致repo2的staging和本地倉庫不一致.
此時, 該文件對repo2而言, staging, local repo, remote repo內容各不相同.
commit之后使得本地所有文件一致. 可以重新開始fetch+merge.
解決方法:
在repo2中, 修改沖突文件, commit, 再次走正常merge步驟即可.
題外話
Eclipse中配置EGit - 具體參數意義 https://git-scm.com/docs/git-config
1. 有防火牆的情況下記得設置http.proxy
2. http.sslVerify設置為false避免push fetch時做http的ssl驗證.
3. core.autocrlf - 如果跨Windows(CRLF), Mac(CR)和Linux(LF)寫代碼, 需要注意這個換行符的問題. 設置如下(3個選項) 另有core.safecrlf可以做檢查用.
#添加文件到git倉庫時, 視為text, 自動把crlf變lf. 取出的時候又把文件轉成crlf.
# x -> LF -> CRLF
git config --global core.autocrlf true
# x -> LF -> LF #添加時, crlf轉lf, 取出文件的時候, 不做轉換, 仍是lf. git config --global core.autocrlf input #不做轉換, 原樣進出
# x -> x -> x git config --global core.autocrlf false
#拒絕提交包含混合換行符的文件 git config --global core.safecrlf true #允許提交包含混合換行符的文件 git config --global core.safecrlf false #提交包含混合換行符的文件時給出警告 git config --global core.safecrlf warn
因此, 只在Windows系統下開發, 直接設false即可. 倉庫中和workspace中的換行符都是CRLF.
此外, 如果文件中包含中文字符且使用UTF-8編碼, 也應該用false保證文件一致性. 轉換過程可能導致問題.
Windows+Linux/Mac開發: Windows下設置為true, Mac/Linux下設置為input.
這樣Windows的Workspace中是CRLF (提交時會把CRLF轉換成LF, 取出時會把LF轉換成CRLF)倉庫和Mac/Linux的Workspace下都是LF.