结合实际演示讲讲Git中merge和rebase的区别 | 青训营笔记

329 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

最近在写项目开发规范的约定文档,正好看到有在做 Github 开源项目的 UP 分享了自己的 Github 工作流,并且使用的是 rebase 而非 merge,所以今天做个实验并整理下二者的区别。

先写一个 Go 的 Demo。

 import "fmt"
 ​
 func main() {
     fmt.Println("初始化")
 }

然后在命令行依次输入以下命令。

 git init
 git add .
 git commit -m "init"

再查看下 git 的日志

 git log
 commit 4057cdafbda63554c835c72a1569f05ea0cd7954 (HEAD -> master)

写点代码

 func main() {
     fmt.Println("初始化")
     fmt.Println("master分支更新1")
 }

提交,重复的命令这里就不演示了。

然后创建两个新分支出来,分别进行两次更新提交

 git checkout -b merge

image-20230226113416429.png

进行 merge

 git merge merge

运行结果

 Updating 3ada9b8..2b63009
 Fast-forward
  main.go | 2 ++
  1 file changed, 2 insertions(+)

image-20230226120249800.png

可以看到 master 的指针和 merge 的合并了,整体分支结构还是没有变化。

再执行 rebase

 git rebase rebase

代码会提示有冲突,按照提示信息解决完冲突再提交一次即可。

 "git add/rm <conflicted_files>", then run "git rebase --continue".

然后点击右下角的提示的继续 Rebase

image-20230226120957846.png

可以发现整个 rebase 分支的结构已经被接在了 master 分支之后。

当然因为是在 master 分支下执行的,可能看不太出来,我们切换到 merge 分支后再 rebase 一下 master。

 git rebase master

image-20230226121518641.png

可以看到原来的 merge 分支结构已经消失了,merge 分支接在了 master 分支之后。

总结:

如果当前分支为个人分支 branch,执行 git merge/rebase master 命令。

merge 会保留 branch 的结构,仅将两个分支的最新节点进行合并。

rebase 会将当前分支的提交完全复制 master 的最新提交之后,branch 的分支结构会消失。

也就是说,实际选用哪个命令,就看需不需要保留原来的分支结构

由于团队协作中想保留分支结构方便回溯,最后还是觉得使用 merge 更好。