2016-03-02 29 views
1

我該如何告訴git「讓這個分支HEAD看起來像這個其他分支HEAD」?使git只是*複製*(不合並)?

我們有一些開發develop的歷史,爲發佈版本進行分支,並盡一切努力使版本分支工作。但我們一直在更新master。幸運的是,我們爲實際發佈的內容添加了標籤。我們現在希望事後讓master成爲一系列發佈版本。

這不僅僅是解決所有合併衝突「他們的」;我希望所有的差異解決「他們的」,如果你願意。例如,如果在release/1過程中我們添加了x = x + 1;Foo.java,但從來沒有補充說,爲developrelease/2,那麼當我們提供release/1master,這條線應該有,但當時我們已經完成release/2master,它應該消失。瞭解,歷史上任何地方都沒有改變線路的改變;它只是被添加到一個死衚衕的分支。

另外,我認爲git rebase ....不是我想要的:我不想失去深厚的歷史。一旦我成功完成了版本1到37的發佈,git log master應顯示實際上對每個發行版所做的所有更改(可能還有一些合併修復提交)。

回答

1
git checkout -B master release/X  # release/X is the new master version 

是你想要的。當前master歷史記錄中沒有任何內容是相關的,因爲您只需要整理release/X

如果你真的真的必須保持廢棄的歷史可到達從活動的工作,

git checkout -B master release/X  # release/X is the new master version 
git merge -s ours --no-ff [email protected]{1} 

,但沒有太多的理由。你可以標記它,如果它甚至是值得的。

+0

我喜歡jthill比torek更好,因爲它保留了歷史記錄(git log)。誠然,對我來說這只是一個「高興」,實際上我的原始聲明使得它看起來確實是不受歡迎的(所以錯誤不在於託瑞克的建議)。猜猜我已經進化了! – jackr

3

如果我理解正確的話,你基本上要做出一個新的master的是,實際上,移除了一個master下的一切,並與(現在仍然是)release/X下的一切替換它的所有承諾。

這樣做有更短更快的方法,但我會先告訴你較慢的方法,因爲我認爲它更清晰。注意,這裏假設你在Git目錄下的頂層(git rev-parse --show-cdup會告訴你有多少../的你可能需要去到那個級別):

$ git checkout master   # onto the branch we want to whack 
$ git rm -rf .     # remove everything 
$ git checkout release/X -- . # repopulate index and work tree 
$ git commit     # and commit the result 

如果這真的是你想要的要做到這一點,請注意,您可以通過git commit-tree更快地完成此操作,該操作通過獲取給定的樹ID和父ID來向存儲庫添加新的提交。由於所需的新樹與某個現有樹(release/X)完全相同,因此您只需標識所需的父提交(大致指master指向最初),創建新提交,並使master指向那個,而不打擾與索引和工作樹。如果你有很多這樣的release/N項目,這樣做會更快,只是有點棘手。

+0

對於'commit-tree'並沒有那麼棘手:'git commit-tree -p master release/X^{tree}'。 – PetSerAl

+0

@PetSerAl:當然,但是在stdout上產生新的提交ID。然後,您必須使用'git update-ref'來更新'master'來指向新的提交 - 或者在做出一系列提交的情況下,保持循環使用前一個提交作爲它的父對象,並且最後做一次更新。 (這是我正在做的,但沒有時間詳細寫出來。) – torek