为了账号安全,请及时绑定邮箱和手机立即绑定

合并分支

标签:
Git

基础合并

首先,我们创建并切换到 hotfix 分支:

$ git checkout -b hotfix
Switched to branch 'hotfix'

图片描述

然后,在 hotfix 分支进行修改并提交一次,如图所示,hotfix 分支随着工作的进展向前推进:

图片描述

最后,在保证修改正确的前提下,将 hotfix 分支合并回 main 分支来部署到线上:

$ git checkout main
$ git merge hotfix
Updating ca5ebf0..5b7de6e
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)

图片描述

Sourcetree 截图显示,由于 main 分支所指向的提交,是 hotfix 分支提交的直接上游,所以 Git 只是简单的将指针向前移动。
换句话说,当合并两个分支时,如果顺着一个分支走下去(例子中 hotfix 分支)能够到达另一个分支(例子中 main 分支),那么 Git 在合并两者时,只会简单的将指针向前推进。
这种情况下的合并没有需要解决的冲突,因此会出现 “Fast-forward”。
超前1一个版本的意思是本地分支,相比远程分支多了一次提交,将 main 分支推送到 origin 服务器即可:

$ git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 261 bytes | 261.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/AttitudeToLife/git-practise.git
   ca5ebf0..5b7de6e  main -> main

图片描述

三方合并以及合并冲突的处理

首先,我们创建 iss52 和 iss53 分支:

git branch iss52
git branch iss53  

图片描述

然后,在 iss52 分支进行修改并提交一次,切换至 main 分支合并 iss52 分支内容:

$ git checkout iss52
$ git add .
$ git commit -m'修改iss52'
$ git checkout main
$ git merge iss52

图片描述

接下来,在 iss53 分支进行修改并提交:

$ git checkout iss53
$ git add .
$ git commit -m'修改iss53'

图片描述

如果 iss53 上的工作已经完成,需要将其内容合并入 main 分支。
这与之前合并 hotfix 分支不太一样,main 分支所在提交并不在 iss53 分支所在提交的上游,换句话说,iss53 分支没有包括 iss52 分支的内容(此时,main 分支与 iss52 分支指向同一提交)。
此时进行合并,其实会涉及到三方内容,两个分支的末端所指的快照(C2 和 C3)以及这两个分支的共同上游(C1),如果合并没有产生冲突,GIT 会帮助我们做这种三方合并,不需要手动做额外的工作。
比较常见的做法是,等到在 iss53 分支完成工作后,先拉取 iss52 所做的修改(通过 git merge main 将 main 分支合并入 iss53 分支),然后再将其合并回 main 分支。

$ git checkout iss53
$ git merge main
$ git checkout main
$ git merge iss53

图片描述

Git 将此次三方合并的结果做了一次新的提交并指向它。
但是,如果两个不同的分支,对同一文件做了不同的修改,就会产生合并冲突,Git 会暂停下来,需要去手动解决冲突。

$ git checkout iss53
$ git merge main
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

可以使用 git status 命令来查看未合并的文件(Unmerged paths 下面):

$ git status
On branch iss53
Your branch is up to date with 'origin/iss53'.

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

打开包含冲突的文件,看起来像下面这样(VSCode 截图):

图片描述

由 ======= 分割为两部分,上半部分是当前所在分支,即 iss53 分支,下半部分是 main 分支,可以选择两部分中的一个,也可以保留双方的更改。
如果感觉不够直观,也可以启动 VSCode 另一种合并工具(点击“在合并编辑器中解析”):

图片描述

图片描述

解决冲突之后,点击“完成合并”即可,Git 就会将它标记为冲突已解决:

图片描述

再次运行 git status 来确认所有的合并冲突是否已被解决:

$ git status
On branch iss53
Your branch is up to date with 'origin/iss53'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   README.md

在确认所有有冲突的的文件都已经解决并且暂存了,就可以输入 git commit 来完成合并提交。

$ git commit -m'Merge branch 'main' into iss53'
[iss53 91a08e6] Merge branch main into iss53

图片描述

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
1.4万
获赞与收藏
860

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消