天天看點

git合并分支上指定的commit

merge 能夠勝任平常大部分的合并需求。但也會遇到某些特殊的情況,例如正在開發一個新的功能,線上說有一個緊急的bug要修複。bug修好了但并不像把仍在開發的新功能代碼也送出到線上去。這時候也許想要一個隻合并指定某些 commit 的功能。

假設分支結構如下:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

                  \

                76cada-62ecb3-b886a0[feature]

再假設 62ecb3 的送出修複了bug,這時候可以用

cherry pick 合并單個 commit

具體操作:

git checkout master

git cherry-pick 62ecb3

就這麼簡單。62ecb3 已經應用在 master 上了(作為一個新的commit)。

cherry pick 連續多個commit

cherry pick 雖好,但一次隻能合并一個commit。合并多個就要用到 rebase 了。再次假設想要把 76cada

和 62ecb3 合并到 master 上。

操作:

git checkout -b newbranch 62ecb3

git rebase —onto master 76cada^

76cada^ 表示從 76cada

的 commit 開始合并(作為新的commit)。這樣就完成了 76cada 到 62ecb3

合并到 master。

參考 https://ariejan.net/2010/06/10/cherry-picking-specific-commits-from-another-branch/

關于 cherry pick https://git-scm.com/docs/git-cherry-pick

關于 rebase http://git-scm.com/book/en/v2/Distributed-Git-Maintaining-a-Project#Rebasing-and-Cherry-Picking-Workflows