[英]How to rebase only the commits after the latest merge?
考慮以下情形:
因此,如果我最初有:
(1) (2)
x--x--x--x--x--x--x master
\ \
y--y--Y--y--y dev
(2)(3) (4)
我想得到:
(1) (2)
x--x--x--x--x--x--x master
\ \
y--y--------Y'--y'--y' dev
(2) (5) (5)
如果我只是做git rebase master
,它將從2和4都重新提交,並從3刪除合並。這不是我想要的。
還有一個選項可以做git merge master
,然后從3開始執行git rebase -i -p
之前的git rebase -i -p
,然后從3開始進行合並之后的最后一個合並,並從3進行修正/壓縮到合並中。 更新 :它沒有工作這么簡單。 Git拒絕壓榨兩次合並。 問題: git rebase交互式:南瓜合並在一起提交 。
您從以下位置開始:
(1)
x--x--x--x--x--x--x master
\ \
y--y--Y--y--y dev
(2)(3) (4)
做一個git rebase --onto
:
git branch dev1 Y^
git rebase --onto master Y^ dev
Y^
引用合並提交Y
的第一個父級:這里是y
,而不是x
。
請參閱“ 先輩參考 ”:
第一個父級是您合並時所在的分支,第二個父級是您合並到的分支上的提交。
您最終將得到:
(1)
x--x--x--x--x--x--x master
\ \
y--y Y'--y'--y' dev
(2) (5)
(dev1)
這會將您的初始dev
分支一分為二,並且僅將最后一個dev
提交應用於master
,同時保持第一個dev
提交不變,現在由分支dev1
引用。
您可以嘗試:
git rebase -p --onto master `Y^` dev
看看是否保留了y
(即Y^
)和新近重新確定的Y'
之間的關系。 但是我懷疑那是可能的。
-p
用於--preserve-merge
。
使用my和VonC的答案可以使解決方案更加自動化:
git checkout -b tmp Y
git merge master
git reset --soft HEAD^^
git rev-parse master > .git/MERGE_HEAD
git commit -C Y
git checkout -
git rebase --onto tmp Y
git branch -d tmp
Y-是要擴展的合並提交。
它是這樣的:
x--x--x--x--x--x--x master
\ \
y--y--Y--y--y dev
x--x--x--x--x--x--x master
| \
\ Y tmp
\ / \
y--y y--y dev
x--x--x--x--x--x--x master
| \ \
\ Y-----Y' tmp
\ / \
y--y y--y dev
x--x--x--x--x--x--x master
| \
| -------Y' tmp
\ /
y--y--Y--y--y dev
x--x--x--x--x--x--x master
| \
| -------Y' tmp
\ / \
y--y y--y dev
x--x--x--x--x--x--x master
\ \
y--y--------Y'--y--y dev
我最終做了以下工作:
git rebase -i -p Y^
在文件中,在合並后的行后添加以下行(大概在第一行之后):
exec sh -c "git merge master; git reset --soft HEAD^^; git rev-parse master > .git/MERGE_HEAD; git commit -C `git rev-parse HEAD`"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.