2014-05-18 77 views
5

的檢測我最近打,其中一個空文件是在兩個分支重新命名不同,但合併不會發生衝突而產生的問題。是的Git重命名空文件

步驟重新創建如下。

  1. 創建一個空文件。

    git init 
    touch empty 
    git add empty 
    git commit -m "add empty file" 
    
  2. 將它重命名爲分支。

    git checkout -b branch 
    git mv empty empty-in-branch 
    git commit -m "empty -> empty-in-branch" 
    
  3. 在master中以不同的方式重命名。

    git checkout master 
    git mv empty empty-in-master 
    git commit -m "empty -> empty-in-master" 
    
  4. 將分支合併到主。

    git merge --no-commit branch 
    

這使消息Automatic merge went well; stopped before committing as requested

git status卻與此新文件empty-in-branch。但是沒有刪除empty-in-master,所以如果我們在這個階段提交,我們會得到兩個文件。

我預計這將被標記爲需要手動解決合併衝突(即決定要保留的空文件)。如果原始文件非空,就會發生這種情況。

是否有什麼特別的影響重命名檢測空文件?是否有任何參數可以添加到git merge中,以便檢測衝突(例如調整合並策略)?

+0

肯定有趣的行爲。不確定原因,但... Git根據其內容存儲文件。所以兩個空文件在技術上會被認爲是相同的。由於可能存在大量的重疊,因此在這裏有一些特殊的邏輯是有意義的。 – Barett

+0

它看起來好像可能會對空文件進行特殊處理。但Git已經基於它的散列只存儲了每個對象的一個​​副本,所以許多重複的空文件和大量重複的非空文件(即沒有明顯需要特殊處理空文件)之間沒有真正的區別。 –

回答

2

空文件不再考慮重命名上的遞歸合併爲這個承諾:混帳的https://github.com/git/git/commit/4f7cb99ada26be5d86402a6e060f3ee16a672f16

舊版本仍然報告這是一個矛盾。

$ git --version 
git version 1.7.9.5 
# ... follow OP instructions to reproduce 
$ git merge --no-commit branch 
CONFLICT (rename/rename): Rename "empty"->"empty-in-master" in branch "HEAD" rename "empty"->"empty-in-branch" in "branch" 
Automatic merge failed; fix conflicts and then commit the result. 
$ git status 
# On branch master 
# Unmerged paths: 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both deleted:  empty 
# added by them:  empty-in-branch 
# added by us:  empty-in-master 
# 
no changes added to commit (use "git add" and/or "git commit -a") 

Git不會隱式跟蹤重命名,所以沒有重命名檢測結束意外事件發生是混帳只是看到這兩個的提交刪除的文件empty,並且每個提交添加一個新的文件。

有一個選項可以改變git-diff的這種行爲(https://github.com/git/git/commit/90d43b07687fdc51d1f2fc14948df538dc45584b),但是目前它沒有公開給選項git merge

其他的合併策略似乎並不要麼放棄所需的行爲。

+0

感謝 - 有用的信息。第一個鏈接說:「這將導致合併的修改/刪除衝突,這將讓用戶自行排除」,這不幸的是沒有發生。 –

+0

僅當空文件獲取內容時纔會這樣。您可以查看提交的測試並查看該行爲。 – onionjake