[英]How to rebase a branch in git one revision closer to head of other branch?
[英]git rebase on other branch
給出以下場景:
master
分支。 然后在該分支上開始持續集成 只要我們的測試沒有任何問題,這個工作流程就可以了。 但是一旦我們決定不從主人那里發送一個功能,我們就會遇到麻煩。
例如:
master
我們現在唯一的選擇是: - 將4個主題分支直接合並到發布中 - 櫻桃選擇master上的2個提交到發布
這可能相當煩人,特別是當我們不跟蹤直接在master上進行的提交並且數量增加時。
我想有一個場景,我們能夠:
我已經做了一些研究並遇到了git rebase
。 git rebase --interactive
非常接近我的預期。
最好的方案是:
然而問題是:
當我做:
git checkout master
git rebase --interactive release
<changes>
我最終修改了主分支而不是發布分支。 添加--onto release
選項也無濟於事。
是否有可能在另一個分支上提交rebase的結果?
對萊夫說
我對這個問題的理解是你將5個不同的分支合並到master中,然后,在合並到release之前,你會發現其中一個有錯誤,所以你只想保留其他4個。
在這種情況下,你為什么不git revert
錯誤分支的合並提交並繼續其余的? 有什么我想念的嗎?
為了將來參考,請查看還原錯誤合並 ,這解釋了“撤消”合並的一些方案。 另外,請參閱Git rebase
手冊中的警告, 從上游Rebase恢復和Pro Git中的警告- 重寫歷史記錄 。 如果您還沒有,請查看Git項目的工作流程和成功的Git分支模型 。
未來更好的工作流程可能是將功能分支合並到發布分支上,並且只有在通過測試,QA,用戶接受等之后才將發布分支合並到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
我會做的是:
reset
master
reset
為ab6d5b0
提交。 release
分支。 fix 1
和fix 2
提交添加到發布分支。 f2
是有問題的特征,將f1
, f3
, f4
和f5
分支合並到release
分支上。 release
到master
。 release
合並到master
。 以下是使用上述歷史記錄執行這些步驟的命令(有關這些命令的更多信息,請參閱Git參考手冊 ):
# 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
保持干凈,並且可以減輕由於功能選擇問題導致的發布管理難題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.