2011-12-20 61 views
3

git的變基給出的以下情形的其他分支

  • 我們制定不同的主題分支的特徵。
  • 在發佈之前,我們將所有主題分支合併爲master。然後在該分支上開始持續集成
  • 此外,我們還直接在主分支上進行小的更改(拼寫錯誤等)
  • 如果一切正常,我們將主分支中的所有更改合併到分支分支中。然後將發佈此分支分支

只要我們的測試沒有任何問題,此工作流程就沒有問題。但是,只要我們決定不向主人發佈一個功能,我們就會遇到麻煩。

例如:

  • 我們有不同的特性5個特性分支
  • 我們將它們合併全部納入master
  • 除此之外,我們直接在主機(2個)不同的提交(我們修正了一些拼寫錯誤)
  • 現在我們發現,5個功能中有1個未按預期工作,我們無法發貨
  • 我們仍然希望將其他4個功能(+ 2個提交在主站)提出

我們現在唯一的選擇是: - 合併4個主題分支直接進入發行 - 櫻桃挑高手2個提交到發佈

這可以是相當惱人特別是當我們沒有跟蹤直接對主人做出的提交,並且數量增加。

我想有我們能夠一個場景:

  • 看到所有的提交(或更好:合併分支)
  • 拋棄一切,我們不希望有在變化下一個版本
  • 合併其他所有更改爲釋放

我已經做了一些研究,跑進git rebasegit rebase --interactive非常接近我的預期。

最好的情況是:

  • 底墊中,從主的所有更改釋放交互式
  • 刪除我不需要
  • 釋放所有提交(或更好的分支機構)只改變我要

問題但是是:

當我這樣做:

git checkout master 
git rebase --interactive release 
<changes> 

我最終修改主分支而不是釋放分支。添加--onto release選項也沒有幫助。

是否有可能在另一個分支上提交rebase的結果?

問候 雷夫

+0

你能舉一個更具體的例子嗎?你的情況很混亂。 – fge 2011-12-20 11:41:34

+0

我改了一些措辭,並增加了一個例子,希望它更容易理解 – leifg 2011-12-20 11:58:38

+0

你不應該反過來嗎? 'git chechout release''git rebase -i master' ... – number5 2011-12-20 13:31:10

回答

3

我對這個問題的理解是,在合併5個不同的分支成主,然後合併到發佈之前,您實現了5人有錯誤,所以你只需要保持對其他4.

在這種情況下,爲什麼你git revert錯誤分支的合併提交併繼續與其餘?有什麼我失蹤?

+0

git revert -m功能爲我做了,謝謝 – leifg 2011-12-22 09:45:49

2

爲了將來的參考,請看Revert a faulty merge,它解釋了「撤消」合併的一些場景。另請參閱Git rebase手冊Recovering From Upstream RebasePro Git - Rewriting History中的警告。如果你還沒有看過,請看Git project's workflowA successful Git branching model

未來更好的工作流可能是將功能分支合併到發佈分支上,並且只有在通過測試,質量保證,用戶接受等後纔將發佈分支合併到master上。我通常會等待在此之前合併發佈日期。您始終可以在發佈日期之前進行進一步的測試合併,以確保不會有任何合併衝突意外。

要解決你目前的情況,假設我們有兩個修復以下歷史承諾和五個特性分支合併提交:

$ git --no-pager log --oneline --decorate --all --graph 
* e202262 (HEAD, master) Merge branch 'f5' 
|\ 
| * d9930ca (f5) f5 
* | f9d743b Merge branch 'f4' 
|\ \ 
| * | eea7737 (f4) f4 
| |/ 
* | c84ad9f Merge branch 'f3' 
|\ \ 
| * | 135c7f7 (f3) f3 
| |/ 
* | 65ed393 Merge branch 'f2' 
|\ \ 
| * | 9a9b5b6 (f2) f2 
| |/ 
* | 76ae0e8 Merge branch 'f1' 
|\ \ 
| * | 8a02982 (f1) f1 
| |/ 
* | ace81a9 fix 2 
* | d4b32e1 fix 1 
|/ 
* ab6d5b0 A 

我會做的是:

  1. resetmasterab6d5b0提交。
  2. 創建release分支。
  3. fix 1fix 2提交添加到發佈分支。
  4. 假設f2是有問題的特徵,f1f3f4f5分支合併到release分支。
  5. 在進行測試時,請執行release的幹運行合併到master
  6. 如果一切正常,則合併releasemaster

下面是將要執行的命令,使用以上的歷史,以完成這些步驟(見Git reference manual有關這些命令的詳細信息):

# Reset master to before the fix and merge commits 
git checkout master 
git reset --hard ab6d5b0 
# Create a release branch 
git checkout -b release 
# Add the fix commits back 
git cherry-pick d4b32e1 
git cherry-pick ace81a9 
# Merge feature branches 
git merge f1 
git merge f3 
git merge f4 
git merge f5 
# Dry run merge 
git checkout master 
git merge --no-ff --no-commit release 
git reset --hard HEAD 
# Merge release to master 
git checkout master 
git merge --no-ff release 

這將使您以下歷史:

$ git --no-pager log --oneline --decorate --all --graph 
* e24c16e (HEAD, master) Merge branch 'release' 
|\ 
| * d23369a (release) Merge branch 'f5' into release 
| |\ 
| | * d9930ca (f5) f5 
| |/ 
|/| 
| * 8b90602 Merge branch 'f4' into release 
| |\ 
| | * eea7737 (f4) f4 
| |/ 
|/| 
| * 926c094 Merge branch 'f3' into release 
| |\ 
| | * 135c7f7 (f3) f3 
| |/ 
|/| 
| * e964e13 Merge branch 'f1' into release 
| |\ 
| | * 8a02982 (f1) f1 
| |/ 
|/| 
| * bb5f6f5 fix 2 
| * e8ffeef fix 1 
|/ 
| * 9a9b5b6 (f2) f2 
|/ 
* ab6d5b0 A 

由於釋放的製備是在一個單獨的分支了,master保持清潔,並釋放因特徵選擇的問題可能是心肌梗死管理難題tigated。