git 中 merge 和 rebase 小记
作为一线工程师的你,对于 git一定不会陌生,git 作为一个开源的分布式版本控制系统,有着广泛的用户基础。git 使用有很多可视化的工具,idea 自身也大多都集成了 git 套件,如下:
不过相比于这些可视化工具,我更喜欢使用命令行的方式。
本篇背景也是源于实际工作,一个同学遇到的问题是:他从 master 分支自己拉了一个开发分支,但是由于时间很长,所以在提交之前他执行了:
1 | git pull |
然后 push ,当提交 mr 时发现,自己的提交里有很多别人的 commit 记录。ok,这里背景交代清楚,我们通过一个实际的 case 来看看。
git pull 发生了什么?
- 从 master 分支切出一个 dev 分支
- 切到 master 分支,代码修改,然后提交
- 切回 dev ,执行 git pull
在执行 git pull
之前,先看下 git log
执行 git pull
之后
所以可以非常明显的看到,git pull 操作中有把 master merge 到当前 dev,实际上 git pull 是下面两个指令的整合:
1 | git pull = git fetch + git merge |
那既然是 merge,所以 dev 中后续的提交,都会带上此次 merge 的 commit 记录;
这就是那位同学遇到的问题。如果我们不想让自己的提交中含有其他无关的 commit 怎么办?此时就需要 rebase 出场了。
git rebase
- 从 master 切 一个 rebase-dev 分支
- 从 master 切 一个 rebase-dev2 分支
- 修改 rebase-dev2,然后提交,merge 到 master
两次提交记录;这里基于前面提到的 git pull 行为,如果我们期望 rebase-dev 的提交不包括 rebase-dev2 的提交,但是从 log 看, rebase-dev 已经在最新 commit 后面了
git rebase 本质上是需要给 rebase-dev 变基,就是将基线拉到最新 commit 之前,在 rebase-dev 分支下,执行 git rebase master
,此时再观察下 log
可以看到 rebase-dev 已经跑到上面了,下面在 rebase-dev 做修改提交
可以看下,此时提交就没有 rebase-dev2 的 commit 记录了。
关于 git merge 和 git rebase 的小结
- git merge:分支代码合并后不会破坏原分支的代码提交记录,但是会产生额外的提交记录并进行两条分支的合并
- git rebase:不会新增提交记录到目标分支,rebase 后可以将对象分支的提交历史续到目标分支上,形成线性提交历史记录
所以你学废了吗?
git 中 merge 和 rebase 小记
http://www.glmapper.com/2021/11/09/git/git-cmd-rebase-merge/