merge
git merge
将已提交的commit
(自历史记录与当前分支分开以来的提交)合并到当前分支中。
原始分支
A---B---C topic
/
D---E---F---G master
checkout
至master
分支,使用命令git merge topic
A---B---C topic
/ \
D---E---F---G---H master
git merge --abort
将中止合并过程,并尝试重建合并前的状态。但是,如果在合并开始时有未提交的更改(尤其是在合并开始后进一步修改了这些更改),则git merge --abort
在某些情况下将无法重建原始更改。因此警告:不建议运行git merge
合并重要的未提交更改
rebase
git rebase
的使用场景
- 合并多次
commit
为单次commit
- 分支合并
变基的原理
- 找到这两个分支(即当前分支 topic、变基操作的目标基底分支 master)的最近共同祖先 D
- 对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件(A+B+C=C’)
- 然后将当前分支指向目标基底 C’, 最后以此将之前另存为临时文件的修改依序应用。
原始分支
A---B---C topic
/
D---E---F---G master
在topic
分支使用git rebase master
C' topic
/
D---E---F---G maste
checkout
至master
分支,使用命令git merge topic
D---E---F---G---C' master
注意:rebase 会改写历史记录,若该分支的提交已被其他使用者修改时,不建议使用
可选操作
- p,
pick
保留该commit- r,
reword
保留该commit,但修改注释- e,
edit
保留该commit,但修改提交- s,
squash
保留该commit,将其前一个commit合并- f,
fixup
操作与squash
相同,但丢弃注释- x,
exec
执行shell命令- d,
drop
丢弃该commit
cherry-pick
git-cherry-pick
能应用(合并)已经存在的commit,即选择合并某个特定commit
原始分支
A---B---C topic
/
D---E---F---G master
假设commit C的版本号为7289a5
,在master
分支使用git cherry-pick 7289a5
A---B---C topic
/
D---E---F---G---C master
参考资料: