[英]How to rebase after a merge?
我們有一系列這樣的事件:
是否可以將步驟3中的合並轉換為rebase? 如果不出意外,它會使即將發生的合並變得更簡單,因為可以看到更少的歷史記錄。
我們沒有啟用rerere。
考慮以下Git圖:
A...C...D...F
^ ^ ^ master
\ \
G...H...I...J
^ feature
......意味着“很多提交”。
假設我們想要實質上重新定義,即在特征歷史中提交而不是在主歷史中進行提交,並將它們改為主數據提交的線性序列。 這讓我們在提交I
中將master合並到feature中這一事實而感到困惑。 如果我們試圖改變,Git搞砸了,因為它試圖在主人的頂部應用例如C
並發現沖突。
我們可以通過從feature
獲取實際更改並將它們打包到新提交中來解決此問題。 這是使用非常基本的Git命令執行此操作的方法:
(1) git checkout feature
(2) git merge master
(3) git reset A
(4) git add -A # This stages all working copy changes
(5) git commit -m "Every change between A and J"
在步驟(2)中, feature
分支在master
J
中都具有所有變化。 在步驟(3)之后,HEAD指向A
,但是我們的工作副本具有來自master
和J
所有更改,並且步驟(4)和(5)階段並提交這些更改。
此時我們的圖表看起來像這樣
A...C...D...F
^ ^ master
\
J'
^ feature
請注意, J'
包含A...F
中的所有內容。 現在我們做
git rebase master
Git愉快地將J'
的更改應用為新提交J''
,但是要添加的唯一更改是G...J
的更改,因為其他更改已經在master中。 所以現在我們有了
A...F<--J''
master^ ^feature
將我們的feature
分支中的所有更改壓縮為提交J''
。 此時,如果需要,您可以重置為F
並以更精細的方式重新應用J''
中的更改(即使使用git add --patch
)。
另一種基本相同的方法是使用read-tree
如另一個答案所述
git checkout master
git read-tree -u -m feature
從這個答案中竊取的另一種做同樣事情的方法是
git diff master > feature.patch
git checkout master
patch -p1 < feature.patch
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.