0007-Git不完全操作指南之本地操作3——merge

概念

我们现在已经了解了分支的概念,也知道了要如何新建分支了。当我们在开发新功能时,通常会先创建一个新分支,在这个新分支的基础上开发,当功能开发并测试完毕,准备上线时,就需要将这个分支合并会主分支,让主分支包含所有的变更。那么,我们要如何合并分支呢?今天我们要学习的merge就是合并分支的其中一种方式。

merge命令在 Git 中合并两个分支时会产生一个特殊的提交记录,它有两个父节点。翻译成自然语言相当于:"我要把这两个父节点本身及它们所有的祖先都包含进来。"

图示

我们准备了两个分支,每个分支上各有一个独有的提交。这意味着没有一个分支包含了我们修改的所有内容。咱们通过合并这两个分支来解决这个问题。

如下图,我们要把 bugFix 合并到 main 里。

执行以下命令:

bash 复制代码
git merge bugFix

从上图我们可以发现,我们在执行了merge命令后,产生了一条新的提交记录C4,并且我们main分支的指针指向了该提交记录,我们在讲分支时说过,分支其实就是简单的一个指向某个提交的指针,当main分支指向了C4提交之后,因为C4提交已经包含了我们这个仓库中所有的提交了,也就意味着main分支已经包含了所有的提交了。

如果此时我们想让bugFix分支也合并一下main分支,让bugFix分支也包含所有变更要怎么操作呢?

bash 复制代码
git checkout bugFix
git merge main

此时由于main分支本身就包含了所有提交,因此只需要将bugFix的指针直接指向C4提交,即main所指向的提交记录即可。

从上面的图示中,我们也可以看到,merge操作也有一个弊端,就是会产生一条新的提交记录C4,并且产生了一条分叉。这条记录是一个合并历史。即我们实际上更改了git的提交线,在里面增加了一条提交记录。那么,有没有一种方法,能让我们不产生新的提交记录就能够让目标分支包含所有变更,让我们的主分支的提交记录看起来足够清爽呢?答案是有的。我们可以用rebase实现,这个我们下一节再详说,不然就喧宾夺主了。

常用命令

bash 复制代码
# 将目标分支合并到当前分支
git merge bugFix

# 将合并过来的分支的所有提交记录合并成一条
git merge --squash bugFix

# 执行上述命令后,无论你再bugFix分支上有多少条当前分支上没有的提交记录,在合并时,都会
# 合并成一条,这样,我们当前分支就不会包含一堆bugFix分支的中间临时提交记录,只会有一个
# 最终的提交记录,看起来会干爽很多

# 显示执行合并时产生的新的提交记录的提交信息。
git merge -e "merge: bugFix into main"

# 如果在合并过程中发生了冲突,那么有以下两种处理方式
# 1. 不想继续合并了,想要终止合并
git merge --abort
# 2. 已经解决了冲突了,继续合并
git merge --continue
相关推荐
wxr06161 天前
git无法克隆
git
cooldream20091 天前
Git 拒绝推送(Push Rejected)问题全解析与解决方案实战指南
git
wxr06161 天前
GIT无法push
git·gitee
装不满的克莱因瓶1 天前
【踩坑】IDEA提交Git .gitignore忽略文件不起作用
java·git·.gitignore·踩坑
cos1 天前
Fork 主题如何更新?基于 Ink 构建主题更新 CLI 工具
前端·javascript·git
OpenMiniServer2 天前
当 AI 成为 Git 里的一个“人”
人工智能·git
Carry3452 天前
不清楚的 .gitignore
前端·git
番茄灭世神2 天前
Git入门使用学习
git·gitee·软件工程·计算机专业入门
南_山无梅落2 天前
团队协作高频Git实用手册(项目实战版)
git·团队开发
就叫飞六吧2 天前
git提取当前分支指定文件历史版本
git