2013-06-24 39 views
5

在發佈分支做了一些改動的問題是關於一些git-flow方法論邊緣情況git的流動:如何防止信息合併回開發

我有某種典型的混帳流動的歷史是這樣的:

 o---o---o---o [release-3.5.0] 
    /
----o---o---o---o---o [development] 

的Git流告訴我們合併發佈-3.5.0支進發展然後釋放已準備就緒。所以,最終我們會得到所有的變化,在發佈分支進入開發分支。

 o---o---o---o 
    /   \ 
----o---o---o---o---o [development] 

現在想象一下,我們有一個承諾「X」上發佈分支我們DO NOT想在開發分支,例如它是某種形式的黑客/修復要不然這已經是固定的發展更健全的方式(即通過提交Y)

 o---X---o---o [release-3.5.0] 
    /
----o---o---o---Y---o [development] 

所以,主要問題是如何處理這種情況?如何防止這個提交(或提交)重新開發?

+0

的可能的複製[混帳 - 合併時跳過特定提交(HTTP ://堆棧溢出。COM /問題/ 727994/git的跳躍 - 特定提交 - 當 - 合併) – Lu55

回答

7

雖然答案推薦rebase和/或合併/恢復/壁球會的工作,我個人認爲更好的回答會是這樣:

git checkout development 
git merge --no-commit release-3.5.0 
# make whatever changes you need to fixup the "hack" and/or clean up any conflicts 
git commit 
+0

'--no-commit'不會生成'合併信息'。發佈分支不會在合併時顯示在歷史記錄中,也不會被合併爲類似'git branch --merged'的命令。所以,人們可能會意外地再次錯誤地合併它。 – Olegas

+2

@Olegas雖然您的評論在技術上是正確,按照上述完整的工作流程*將*打造「合併信息」(假設你的意思是合併格式提交信息和/或父指針的組合,在創建合併歷史DAG),但它是創建這些的最後一個'git commit'。 'git merge --no-commit'只是設置一些東西,以便創建適當的元數據。如果你嘗試'混帳分支--merged'最終'git的commit'之前,將正確顯示該分支尚未合併,因爲合併尚未提交... – twalberg

+1

是的,你是對的。提交後一切都很好,包括合併信息,我錯了。 – Olegas

1

您有幾種選擇:

1)使用git rebase -i

在這種模式下,你可以變基在你的開發分支的release分支,並排除第十屆提交。

警告在這種情況下,您會混淆現有的克隆存儲庫。

2)使用git cherry-pick

在這種模式下,你將不得不挑選承諾逐一的可能性。

3)在一個單獨的分支使用git rebase -i事後合併它,在這個答案規定:Is it possible to exclude specific commits when doing a git merge?

+0

'rebase'是不適合的原因「你提到的警告,'櫻桃pick'是可以接受的,但是太複雜原因」的發佈分支我有太多許多提交(但它可以自動化)。 – Olegas

+1

摘櫻桃實際上允許選擇一個範圍的提交(http://stackoverflow.com/a/1994491/696792)的,但這包括了一些問題,太(在鏈接的答案指定) – StKiller

+0

更新了第三條道路的答案。 – StKiller

2

在這種情況下,您總是想完全合併版本(類似的)分支。所以確保沒有遺漏。

但在合併過程中,您可以自由修改內容 - 包括刪除或重做一些更改。對於您的示例,合併分支,還原您不喜歡的提交,並將該還原壓縮到合併提交中。顯然在該操作的合併提交消息中做一個註釋。

如果修復程序已經在devel上,則合併只會跳過它,或者通過選擇devel版本來解決衝突。

問題是你想把歷史展示作爲你的第二個數字,而狀態是最好的。