【git 基础】git merge 和 git rebase

2,881 阅读2分钟

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 操作

  1. git rebase branchName 变基
  2. git rebase --continue 继续下一次提交的补丁
  3. git rebase --skip 跳过某次补丁
  4. git rebase --abort 终止 rebase
  5. 操作成功,在远程发送一个 merge request 请求

处理每次提交的都有可能执行 234 中一步操作。

ps:在不清楚的 rebase 到哪一步,可以使用 git status 的提示操作下一步。

解决 rebase 造成分支的不干净问题

rebase 会让当前的分支不干净,在开发时,为了保证每个 feature 分支干净,在 rebase 之前,将当前分支 checkout 一份用于 rebase,然后在远程发起merge request。

总结

rebase 最大好处就是处理合并代码,能够保持分支干净,一般用代码管理流程上。 merge 操作简单,处理一些个人代码问题时好使,不建议代码管理流程上使用。