2014-02-12 106 views
0

我有TEST分支,然後我有master分支。我怎樣才能得到其他分支git中的新文件

我有文件夾叫DATA與子文件夾和文件。

現在,在我的主人,我有

  1. 新的文件,這是不是在測試
  2. 修改過的文件都在測試和掌握主
  3. 文件,但在測試中刪除現在

我只想更新來自主分支的新文件的TEST分支,以便TEST分支的所有其他應用程序都不應該在那裏。

我能做到這一點很容易與rsync但只是在想如果能夠在git

回答

2

做你應該小心一點這個,因爲有不同的答案相似,但不完全是最相同的,問題。例如假設提交歷史看起來是這樣的:

A - B - C <-- master 
    \ 
    D - E <-- TEST 

這裏masterTEST開始與一個共同的承諾,A,然後發散。讓我們假設共同提交A具有這些文件(目錄DATA/如果你喜歡,但我只是命名文件):

file_A1 
file_A2 

進一步假設提交B增加file_B1但刪除file_A2。然後,承諾C增加file_C1並略微修改file_A1

這意味着如果你git checkout master你會得到修改file_A1內容的三個文件(A1,B1和C1)。

現在假設提交D修改file_A1並添加file_B1file_D1。然後提交E刪除file_B1並添加其他內容。

這意味着如果你git checkout TEST你會得到三個文件(A1,A2和D1)與修改後的file_A1內容(可能不同於版本進行修改,提交C,或可作爲內容犯同樣的C)。

當您詢問「TEST中的文件不在master」中時,file_A2是否算在內?如果你git checkout TEST;它不在那裏,如果你git checkout master;但它那裏在共同的起點,承諾A

當你想知道「在兩個文件中都修改過的文件」時:顯然file_A1被修改了。但是如果兩者的變化相同,那麼file_A1具有相同的內容,而不管哪個分支被檢出。是「在兩個修改」,或不?

什麼混帳需要你做回答這些問題是選擇是否要比較兩個特定修訂,還是要考慮的東西更像是一個三方合併(你會得到什麼,如果你試圖合併TESTmaster使用它們的合併基礎版本A作爲起點)。


git diff <options> master TEST 

這將比較提交C(什麼master指向的,即,所述主分支的「尖端」)對提交E(分支TEST的尖端)。所以,你比較兩個file_A1 s和看到提交Efile_A2file_D1,缺乏file_B1

這裏的<options>部分可以是空的,或者可以在下文中所描述的。


mergebase=$(git merge-base master TEST) 
git diff <options> $mergebase master 
git diff <options> $mergebase TEST 

這確實兩個單獨的diff,合併基的(提交A)針對master,以及對TEST合併-鹼。

第一個差異會告訴你,在分支master,從AC的變化是修改file_A1,刪除file_A2,加file_B1,並添加file_C1

這是怎樣操作的git的使用弄清楚如何做一個分支合併。事實上,有用於運行git diff對兩個分支的合併基礎的特殊語法,對那兩個分支之一的提示:

git diff <options> TEST...master # three dots 

這並不等同於第一DIFF(git diff <options> $mergebase master)。到合併基礎比較分支TEST的提示:

git diff <options> master...TEST # again, three dots 

至於<diff options>,如果你不感興趣的不同內容的文件的,明顯的選項下手爲--name-status ,打印名稱和文件狀態-ES和--no-renames,關閉重命名檢測(除非你想重命名檢測,在這種情況下,加-M代替)。

如果檢出差異選擇的提交,就會得到兩棵樹之間的變化,文件將顯示爲已添加,刪除或修改(分別爲AD和狀態)。這裏有更多的可能性:T如果常規文件被替換爲符號鏈接,反之亦然(以及更多與子模塊有關的特殊情況); C(加上一個數字相似度值)如果添加--find-copies-harder和/或-C選項發生;和R(加上一個數字值,就像C)發生重命名檢測。 CR個案不僅打印狀態和文件名,還打印「原始文件名」。

您可以添加--diff-filter以僅選擇特定事件:例如,--diff-filter=A將僅選擇那些狀態爲A(已添加)的文件。