# git 合并
# Rebase场景一:如何合并多次提交记录
合并最近的n次提交记录
git rebase -i HEAD~n1进入vi编辑模式
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
如果保存的时候,出错
error: cannot 'squash' without a previous commit1注意不要合并先前提交的东西,也就是已经提交远程分支的纪录。
如果你异常退出了
vi窗口git rebase --edit-todo1这时候会一直处在这个编辑的模式里,我们可以回去继续编辑,修改完保存一下
git rebase --continue1查看结果
git log1
# Rebase场景二:分支合并
我们先从
master分支切出一个dev分支,进行开发:git checkout -b feature1这时候,你的同事完成了一次
hotfix,并合并入了master分支,此时master已经领先于你的feature分支了恰巧,我们想要同步
master分支的改动,首先想到了merge让我们来试试
git rebase而不是使用mergegit rebase master1首先,
git会把feature分支里面的每个commit取消掉; 其次,把上面的操作临时保存成patch文件,存在.git/rebase目录下; 然后,把feature分支更新到最新的master分支; 最后,把上面保存的patch文件应用到feature分支上;从
commit记录我们可以看出来,feature分支是基于hotfix合并后的master,自然而然的成为了最领先的分支,而且没有merge的commit记录,是不是感觉很舒服了。在
rebase的过程中,也许会出现冲突conflict。在这种情况,git会停止rebase并会让你去解决冲突。在解决完冲突后,用git add命令去更新这些内容git rebase --continue1这样
git会继续应用余下的patch补丁文件。在任何时候,我们都可以用
--abort参数来终止rebase的行动,并且分支会回到rebase开始前的状态。git rebase —abort1
# 注意事项
- 如果你想要一个干净的、线性的提交历史,没有不必要的合并提交,你应该使用 git rebase 而不是 git merge 来并入其他分支上的更改。
另一方面,如果你想要保存项目完整的历史,并且避免重写公共分支上的 commit, 你可以使用 git merge。两种选项都很好用,但至少你现在多了 git rebase 这个选择。
- 可以使用
git commit --amend
# 参考
https://juejin.im/post/6869519303864123399
← git基本操作