2012-12-10 76 views
1

我有(或正在瞄準有!)回購像這樣:如何從主人合併到項目中,放棄所有項目提交?

Master *-----*--*----------C--- 
     \     \ 
Project1 \-*-------A----B----M2---A'--B'--- 
      \    \    \ 
Project2 \----------*---M1------------M2--- 

我願做合併M2但我想一個完全忽略。然後,我將手動(例如櫻桃採摘)重新創建A'B'',如有必要,在主要的新變化之上。

Project2的是基於法師,但在從PROJECT1改變合併。

期望的結果:

  1. 我想點M2在文件方面是Ç完全相同的副本。

  2. 我需要Project1有它自己的線性歷史記錄,以便Project2可以從它合併。

上下文:Master是Drupal的主代碼庫。 Project1是我用來維護特定補丁的分支,我希望與幾個項目分享。 Project2(和許多其他)從Project1合併。

我已經考慮:

  1. git merge -s recursive -X theirs master問題,這是AFAIK它只會如果有什麼衝突喜歡theirs。因此,如果某個變化並不衝突,它會出現在M2這將意味着A」將是不完整的。

  2. git revert B..A ; git merge C這會工作,但會給我留下一個混亂和悠久的歷史。

  3. git merge -s ours但似乎沒有git merge -s theirs

  4. 我不想git reset --hard C因爲這會(我認爲)打破Project1合併到Project2的可能性。另一種方法是將Project1重新綁定到C,但這又意味着我無法合併到Project2中。

+0

如果你想要「C的完全相同」,爲什麼不直接刪除你的Project2文件夾,'git clone ; git checkout C'? –

+0

我希望分支Project1的頂點處的樹與C處的頂點相同。我不想將任何文件複製到新的回購(這是克隆所做的)。問題是關於如何將project1分支中的樹的狀態與master分支中給定的提交相同。 – artfulrobot

回答

1

這可以用「管道」來完成指令:

$ git checkout Project1 
$ git diff HEAD..master | patch -p1 
$ git add -A . 
$ git commit-tree `git write-tree` -p master -p Project1 \ 
     -m "Merge to clean Master at v1.2" 
0c5290081989cc28ff3977fbfe3951db7b7778b0 
$ git reset --hard 0c5290081989cc28ff3977fbfe3951db7b7778b0 

git diff HEAD..master會告訴我如何從獲得我在(B)和我想要的地方(C)在一個大的補丁,當然,補丁將應用它。

git add -A .會將工作樹中的所有更改添加到索引中。

然後,我們用下一行爲此創建一個合併提交:git-write-tree從索引創建一個新的樹對象,並將其SHA1作爲參數輸出到git commit-tree,它創建一個提交,它有兩個父項,項目1(B)和主人(C)的負責人,並給它一個合適的消息。

Git會創建提交對象,但它不會更新任何分支來使用此提交。最後一行告訴git我們希望我們當前的分支Project2先進(快速轉發)到它生成的提交SHA1。

如果有必要,您可以從那裏重新創建(例如,可以嘗試挑選櫻桃)補丁A'和B'。

2

我會反對你的計劃 - 你試圖欺騙混帳。 Git不喜歡被愚弄。你也在「僞裝」你的歷史。 M2,A'和B'都應該是一次提交 - 合併。

但是如果你想繼續前進,這樣做:

git merge --no-commit C 
rm -rf * 
git checkout C . 
git commit 

如果你有你想保留的rm之前對它們進行備份和恢復之後他們的任何gitignored文件。

或者,你也可以做(其實有很多清潔)

git checkout C 
git symbolic-ref HEAD refs/heads/Project1 
git update-ref MERGE_HEAD C 
git commit 
+0

感謝您的回答。我不認爲我在愚弄git(它自己[定義](http://code.google.com/p/git-core/),愚蠢)。我正在通過正確的方式(由我確定)來合併,就像我遇到衝突一樣。你的第一個答案是一種魅力(嘗試第三種,但以分離的頭部結束)。我發佈了另一個回答,我認爲它避免了.gitignored文件的問題,並且備用了相當可怕的'rm -rf *'。 – artfulrobot

+0

Git確實不關心很多事情。但git希望它的歷史是真實的。添加假合併通常會造成麻煩。合併提交應該包含來自兩個分支的所有更改 - 您的不支持。 – Chronial

+0

修復了最後一種方法 – Chronial

相關問題