2016-02-12 169 views
2

我們正在將分支A合併到分支B.在分支A中,我們已經刪除了一些文件。當合併到分支B中時,我們不想刪除分支B中的文件。我們希望除文件刪除之外的其他合併更改。我們應該怎麼做?Git:如何不合並文件刪除

請注意,有問題的文件沒有合併衝突(即:它們在分支B中未被觸及)。

+0

在他們自己的提交文件刪除? –

+0

是的,他們是。儘管我很好奇你怎麼處理它。 –

+0

A分支是否可行?如果是這樣,你可以對它進行重定位,以便刪除全部在分支的「結尾」,並在刪除之前與提交合並。 –

回答

3

這裏一個可能的解決方案不依賴於刪除在不同的提交是:

由一個
# Do all the merging but do not commit the result 
git merge --no-commit branchA 
# Look at what has changed 
# Beside the list of modified files, there is also a list of all deleted files 
git status 
# Restore the deleted files (from the current commit on branchB) 
git checkout HEAD -- file1 file2 
# Now commit the merge 
git commit 

而不是列出所有已刪除的文件中的一個,這個(不徹底的測試)剪斷,可以使用(由this answer to another question啓發) :

git diff-index --cached --diff-filter=D -z --name-only HEAD | xargs -0 git checkout HEAD -- 
+0

此解決方案意味着文件已經消失了幾秒鐘,這可能也可能不會被接受。 –

+0

@MatthiasUrlichs:如果這是不可接受的,您可以在存儲庫的克隆中執行「合併和恢復」,然後從中獲取並快速合併創建的合併提交。 – siegi

0

我能想到的兩種可能的解決方案:

  1. 分支衍合一個讓所有的承諾與缺失是在分支的「結束」。然後合併最後一次提交之前這些缺失融科B.當然,這可能不是一個可行的解決方案,如果墊底將基於分支A.

  2. 與分支合併直接導致隨後與工作的任何克隆的回購問題「撤銷「與git revert刪除提交。這裏的缺點是你需要找到哪些提交「撤消」。如果有很多這些,手動運行git revert將非常耗時。

我很抱歉,如果這些都不適合你。我只是在這裏集思廣益。希望別人想出更好的想法。

0

如果你想自動完成這個你可以調整git-merge-one-file(它在libexec/git-core無論你已經安裝了GIT)和手動運行的合併。

git merge --no-commit --no-ff -s ours $topic   # set up parents 
git read-tree -um $(git merge-base @ $topic) @ $topic # handle really trivial cases 
git merge-index -o $tweaked_git_merge_one_file -a  # everything else, do my way 

和TWEAK是很容易的,對待$1$1.情況下,如果你的分支沒有做任何事情,但另一個分支刪除了它,作爲.$2.情況下你加入它和其他分支沒有做任何事情。所以

-"$1.." | "$1.$1" | "$1$1.") 
+"$1.." | "$1.$1") 

-".$2.") 
+".$2." | "$1$1.") 

因爲在這兩種情況下,該文件的本地副本是正確的,因爲-是,唯一可以做的就是標記索引條目(正確地)合併。