2009-09-25 92 views
5

我一直在挖掘git合併和rebase文檔,並且沒有陷入困境。我正在積極研究Git中的項目,並且需要與其他人分享特定的里程碑開發人員。我想要按照每個里程碑/版本中的內容精確分享代碼,但不是所有提交到每個版本的小型提交都是如此。Git重定位/合併公開發布

如何創建一個反映開發分支的發佈分支,其中發佈分支上的提交每個都包含來自開發分支的多個提交?換句話說,發佈分支應該有一個壓縮的歷史記錄,但在其他方面與開發分支匹配。

最初,我曾想過使用單獨的分支並使用git merge --squash會很有效,創建一個新的分支,並提交一系列反映每個發行版之間所有更改的提交。我現在明白,git merge --squash不適用於重複使用。

Git rebase可以將多個提交合併成一個大的提交,但是因爲它改變了提交歷史,不會改變我的私人歷史以及公共發佈?

我不想失去我的小變化的歷史,但想要將聯合提交推送到共享服務器。

回答

7

當然,如果你的提交都值得保留並構成你的公開發布工作,那麼它們應該構成你發佈的歷史記錄的一部分?如果你不想發佈完整的版本庫歷史記錄,那麼使用git archive創建發行版tarball可能會更好。

話雖如此,如果你真的想創建一個具有獨立歷史的版本分支,那麼這是可能的。你是在和自己的更多的維護開銷,不過,因爲你永遠無法從您的私人記錄合併到你的公開發布分支,因爲這將帶來所有的私人歷史,你的發行版分支。這就是git所做的事情;它跟蹤來自哪裏的變化。

您可以從發佈分支合併到專用小,但由於你的工作(大概)從私有分支即將在今年不會得到你很多。您最簡單的選擇是有一個單獨的發佈分支,其中只包含發佈點處的專用分支狀態的快照提交。

假如你已經達到你想要創建一個提交基於當前發佈分支(release)提交的私有分支(private)點,並假設你有樹被釋放簽出與沒有改變索引,這是你可以做的。

# Low-level plumbing command to switch branches without checking anything out 
# (Note: it doesn't matter if this branch hasn't yet been created.) 
git symbolic-ref HEAD refs/heads/release 

# Create a new commit based on the current index in the release branch 
git commit -m "Public release commit" 

# Switch back to the private branch 
git checkout private 

您可以爲每個版本(或子釋放)和新的承諾將在以前版本的基礎上直接內置在不結合任何您的私人歷史的做到這一點。

+0

這當然可以。爲我工作:) – 2009-09-26 00:49:15

+0

謝謝,查爾斯。這就是我要找的。 – Neil 2009-09-26 01:09:54

2

只要創建一個新的分支,並在那裏做所有的擠壓。然後發佈。其他分支中的小型提交仍將存在。

我對這個工作流會是這個樣子:

git co -b release_branch_squash release_branch_with_all_commits 

git rebase last_release_tag 

現在是時候來應對可能出現的所有衝突。我真的不知道 知道如何避免這種情況。通常情況下,這並不是什麼大問題。無論如何,我的git 存儲庫已經記錄了大多數衝突解決方案。

git rebase --interactive last_release_tag 

這會帶來vim。對於我想要壓扁的所有版本,我將pick 替換爲squash。然後保存並退出。完成。

+0

你能詳細說一下嗎?從像http://stackoverflow.com/questions/1464642/git-merge-squash-repeatedly/1465119#1465119評論它看起來像重複合併--squash不會工作。當我嘗試過這些時,即使文件具有共同的歷史記錄,我也會得到非常長的衝突列表。如果我理解正確,git merge --squash將創建一個不共享舊提交歷史記錄的新提交,因此未來的合併不會有共同的祖先。 你已經描述了我想要的行爲,但是我絆倒了讓Git去做。 – Neil 2009-09-25 23:38:33

+0

我用我的建議工作流更新了答案。儘管我必須承認Charles Bayleys解決方案可能更適合您的需求。 – davrieb 2009-09-26 01:31:43