# 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而不是使用merge- git 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基本操作