2012-02-03 75 views
34

我想在git倉庫中的兩個任意文件上利用git-merge算法。這是我的工作目錄:在兩個單獨的文件上運行git合併算法

folder/ 
    file1 
    file2 

文件1和文件2是類似的,但我想看看,好像他們是不同版本的同一文件的GIT中如何將它們合併。換句話說,我想要這樣的東西:

git merge-files file1 file2 > merge_of_file1_file2 

有沒有辦法做到這一點?

回答

43

這沒有意義,因爲你沒有提供一個共同的祖先。但是,如果您確實有一個,則可以使用:

git merge-file <current-version> <common-ancestor> <other-version> 

這將結果放在當前版本文件中;如果你想在其他地方使用,請使用:

git merge-file -p <current> <common> <other> > <dest> 

它需要共同的祖先提供某些事情來考慮相對的變化。你可以通過提供一個空文件或者從你的版本庫的歷史記錄中提供一箇舊版本的副本,但是結果的質量取決於你選擇一個共同的祖先的程度,因爲它將兩個差異合併在一起,在這和每個新版本之間。一個空文件只會在相似(至少有三條相同的行很多)時才能正常工作。

沒有這個,你所能做的,只能是看差異:

git diff --no-index file1 file2 
+2

如何使用一個文件的副本作爲共同的祖先? – 2013-02-13 14:27:55

+1

@CarlG,假設file2包含比file1多一行。如果選擇file1作爲祖先,則此行被解釋爲一個添加,因此合併將是文件2.如果選擇file2作爲編輯,則該行將被解釋爲刪除,並且您將得到file1作爲結果。 – 2013-09-05 07:07:38

+2

@CarlG換句話說,如果您從A開始,一方將其更改爲B,而另一方將其保留爲A,則合併結果顯然是B. – Cascabel 2013-09-05 07:11:00

29

對於你正在嘗試做的事:

touch file3 #empty 
git merge-file file1 file3 file2 

這將做文件1的三方合併file2和file3(空文件)作爲基礎。

請注意,這寫入file1。如果不需要,你當然可以做下面的事情:

touch file3 
cp file1 merge_of_file1_file2 
git merge-file merge_of_file1_file2 file3 file2 
+1

我證實了這一點(通過Git Bash)。這是我寫的封裝成一個單一的命令這個bash函數: ''' 功能合併(){ \t觸摸__merge_result__ \t混帳合併-文件$ 1 __merge_result__ $ 2 \t RM __merge_result__ } ''' – 2015-12-08 23:13:14