git 中 merge 和 rebase 小记

作为一线工程师的你,对于 git一定不会陌生,git 作为一个开源的分布式版本控制系统,有着广泛的用户基础。git 使用有很多可视化的工具,idea 自身也大多都集成了 git 套件,如下:

image.png

不过相比于这些可视化工具,我更喜欢使用命令行的方式。

本篇背景也是源于实际工作,一个同学遇到的问题是:他从 master 分支自己拉了一个开发分支,但是由于时间很长,所以在提交之前他执行了:

1
git pull

然后 push ,当提交 mr 时发现,自己的提交里有很多别人的 commit 记录。ok,这里背景交代清楚,我们通过一个实际的 case 来看看。

git pull 发生了什么?

  • 从 master 分支切出一个 dev 分支
  • 切到 master 分支,代码修改,然后提交
  • 切回 dev ,执行 git pull

在执行 git pull 之前,先看下 git log

image.png

执行 git pull 之后

image.png

所以可以非常明显的看到,git pull 操作中有把 master merge 到当前 dev,实际上 git pull 是下面两个指令的整合:

1
git pull = git fetch + git merge

那既然是 merge,所以 dev 中后续的提交,都会带上此次 merge 的 commit 记录;

image.png

这就是那位同学遇到的问题。如果我们不想让自己的提交中含有其他无关的 commit 怎么办?此时就需要 rebase 出场了。

git rebase

  • 从 master 切 一个 rebase-dev 分支
  • 从 master 切 一个 rebase-dev2 分支
  • 修改 rebase-dev2,然后提交,merge 到 master

image.png

两次提交记录;这里基于前面提到的 git pull 行为,如果我们期望 rebase-dev 的提交不包括 rebase-dev2 的提交,但是从 log 看, rebase-dev 已经在最新 commit 后面了

image.png

git rebase 本质上是需要给 rebase-dev 变基,就是将基线拉到最新 commit 之前,在 rebase-dev 分支下,执行 git rebase master,此时再观察下 log

image.png

可以看到 rebase-dev 已经跑到上面了,下面在 rebase-dev 做修改提交

image.png

可以看下,此时提交就没有 rebase-dev2 的 commit 记录了。

关于 git merge 和 git rebase 的小结

  • git merge:分支代码合并后不会破坏原分支的代码提交记录,但是会产生额外的提交记录并进行两条分支的合并
  • git rebase:不会新增提交记录到目标分支,rebase 后可以将对象分支的提交历史续到目标分支上,形成线性提交历史记录

所以你学废了吗?

作者

卫恒

发布于

2021-11-09

更新于

2022-04-24

许可协议

评论