git merge 和 git rebase,要先理解他们的区别,操作起来就很简单。
一、git merge 和 git rebase 的区别
他们的区别在于两个方面:分支 commit 的线路和操作区别。
1. 分支的线路区别
- rebase 分支线路不分叉,也不会多一条提交
- merge 分支线路分叉,而且每次合并会多出一条分支记录
1.1 借助 sourcetree 观察两者的区别
merge 后的结果
rebase 后的结果
1.2 也可借助 git log --graph --pretty=oneline --abbrev-commit 观察
merge 后的结果
rebase 后的结果
2. 操作的区别
- rebase 后,每次 commit 都得处理,最大感受是不停的执行 git --continue
- merge,一次处理所有提交
简而言之:rebase 操作繁琐,merge操作简单。
二、 git merge 操作
这个比较简单,直接上命令。
git checkout feature/a
git merge feature/b
# 有冲突,想解决
git add .
git commit -m '解决冲突的提交'
# 有冲突,不想解决
git merge --abort # 存在冲突时,不想合并,可以取消这次合并
保留commit可用git merge --squash
我合并分支的时候需要保留 commit 信息,可以用 git merge --squash 来解决。 示例如下:
git checkout master # 切换分支
git merge --squash issue1 # 有冲突
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Squash commit -- not updating HEAD
Automatic merge failed; fix conflicts and then commit the result.
# 解决冲突
git add sample.txt
git commit
[master 0d744a7] Conflicts: sample.txt
1 files changed, 4 insertions(+), 0 deletions(-)
三、git rebase 操作
- git rebase branchName 变基
- git rebase --continue 继续下一次提交的补丁
- git rebase --skip 跳过某次补丁
- git rebase --abort 终止 rebase
- 操作成功,在远程发送一个 merge request 请求
处理每次提交的都有可能执行 234 中一步操作。
ps:在不清楚的 rebase 到哪一步,可以使用 git status 的提示操作下一步。
解决 rebase 造成分支的不干净问题
rebase 会让当前的分支不干净,在开发时,为了保证每个 feature 分支干净,在 rebase 之前,将当前分支 checkout 一份用于 rebase,然后在远程发起merge request。
总结
rebase 最大好处就是处理合并代码,能够保持分支干净,一般用代码管理流程上。 merge 操作简单,处理一些个人代码问题时好使,不建议代码管理流程上使用。