可能大家知道如何使用cherry-pick
从一个分支合并特定的commits
到另一个分支,但是这个方法不能保留原始的提交信息(比如提交时间线等),而如果要保留合并过来的commits
的所有提交信息,那么我们就需要使用git rebase
和git merge
这两个强大的命令。
准备工作
首先,用git log
查看一下你想选择哪些commits
进行合并,例如:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
\
76cada - 62ecb3 - b886a0 [feature]
假设你需要合并feature
分支的commits 76cada-62ecb3
到master
分支,并且保留所有提交信息,那我们可以使用git rebase
和git merge
的命令组合
使用git rebase
合并一系列commits
首先需要基于feature
创建一个临时分支,指明临时分支的最后一个commit
为62ecb3
git checkout -b temp-branch 62ecb3
然后,rebase
这个临时分支的commit
到master
,76cada^
指明你想从这个这个commit
开始(一直到commit 62ecb3
)。
git rebase --onto master 76cada^
得到的这个temp-branch
就是feature
分支的commits 76cada-62ecb3
都被合并到了master
分支所有提交的最后,但是保留所有的提交信息(包括提交时间),整个过程是这样的:git rebase
把你的temp-branch
分支里的commits 76cada-62ecb3
取消掉,并且把它们临时保存为补丁(patch
)(这些补丁放到.git/rebase
目录中),然后把temp-branch
分支更新到最新的master
分支,最后把保存的这些补丁应用到temp-branch
分支上。
使用git merge
把这些commits
合并到master
现在temp-branch
这个临时分支还是不能同步到远程的master
分支,还需要做下面的操作:
git checkout -b master origin/master
git merge temp-branch
我们来检查下master
分支是否已经合并feature
分支的commits 76cada-62ecb3
了:
git log
确认没有问题就可以提交到远程仓库了:
git push