最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

【Git#2】分支管理的基本操作

网站源码admin3浏览0评论

【Git#2】分支管理的基本操作

一、理解分支

Git 的分支机制堪称现代软件开发中的"时空操纵术"。想象你同时拥有多个互不干扰的独立时间线:

  • 在「main」时间线中,你正在构建稳定的 C++ 核心模块
  • 突然分支出「dev-feature」时间线,你开始尝试用 JAVA 实现创新功能
  • 在另一个「hotfix」时间线里,你紧急修复生产环境的 Bug

这些平行时间线独立演进互不影响,直到你施展 Git 的"时空融合"魔法(某个时间点进行合并):

代码语言:javascript代码运行次数:0运行复制
git checkout main
git merge dev-feature

此刻,JAVA 新功能与 C++ 核心模块完美融合,而所有的 Bug 修复也自然同步到所有时间线,如同完成了一次优雅的量子纠缠!

在这里插入图片描述

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就可以理解为是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即 master分支。再来理解一下HEAD,HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD 指向的就是当前分支。

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长,而 HEAD 只要一直指向 master 分支即可指向当前分支。

通过查看当前的版本库,我们也能清晰的理出思路:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/HEAD
ref: refs/heads/master
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/refs/heads/master
f312a54103b258bc87e264410543e2ea86afe009

二、创建分支

Git 支持我们查看或创建其他分支,在这里我们来创建第一个自己的分支 dev ,对应的命令为:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git branch      # 查看当前本地所有分支
* master 
lighthouse@VM-8-10-ubuntu:gitcode$ git branch dev  # 新建分支 dev
lighthouse@VM-8-10-ubuntu:gitcode$ git branch 
  dev
* master

当我们创建新的分支后,Git新建了一个指针叫 dev,* 表示当前 HEAD 指向的分支是 master 分支。另外,可以通过目录结构发现,新的 dev 分支:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ ls .git/refs/heads/
dev  master
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/refs/heads/*
f312a54103b258bc87e264410543e2ea86afe009
f312a54103b258bc87e264410543e2ea86afe009

发现目前 dev 和 master 指向同一个修改。并且也可以验证下 HEAD 目前是指向 master 的。

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/HEAD
ref: refs/heads/master

总结如下:

image-20250408191901815

三、切换分支

在实际开发中,使用 git checkout 来进行分支切换,示例如下:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout dev
Switched to branch 'dev'
lighthouse@VM-8-10-ubuntu:gitcode$ git branch
* dev
  master
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/HEAD
ref: refs/heads/dev
image-20250408192311973

我们发现 HEAD 已经指向了 dev,就表示我们已经成功的切换到了 dev 上!

接下来,在 dev 分支下修改 book 文件,新增一行内容,并进行一次提交操作:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write aaa for new branch
lighthouse@VM-8-10-ubuntu:gitcode$ git add book
lighthouse@VM-8-10-ubuntu:gitcode$ git commit -m "modify book"
[dev 33a5368] modify book
 1 file changed, 1 insertion(+)

现在,dev 分支的工作完成,我们就可以切换回 master 分支:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout master
Switched to branch 'master'
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3

切换回 master 分支后,发现 book 文件中新增的内容不见了!!赶紧再切回 dev 看看:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout dev
Switched to branch 'dev'
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write aaa for new branch

在 dev 分支上,内容还在。为什么会出现这个现象呢?我们来看看 dev分支和 master分支指向,发现两者指向的提交是不一样的:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/refs/heads/dev
33a53689ebaf34f0534a53b8d81b6ecc3223a334
lighthouse@VM-8-10-ubuntu:gitcode$ cat .git/refs/heads/master
f312a54103b258bc87e264410543e2ea86afe009

看到这里就能明白了,因为我们是在dev分支上提交的,而master分支此刻的提交点并没有变,此时的状态如图如下所示

image-20250408194101683

当切换到 master 分支之时,HEAD 就指向了 master,当然看不到提交了!

四、合并分支

为了在 master 主分支上能看到新的提交,就需要将 dev 分支合并到 master 分支,示例如下:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git branch
* dev
  master
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout master # 切换到 master 进行合并
Switched to branch 'master'
lighthouse@VM-8-10-ubuntu:gitcode$ git merge dev # 合并 dev 分支
Updating f312a54..33a5368
Fast-forward
 book | 1 +
 1 file changed, 1 insertion(+)
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write aaa for new branch
  • git merge 命令用于合并指定分支到当前分支。合并后,master就能看到 dev分支提交的内容了

此时的状态如图如下所示。

image-20250408194414098

Fast-forward 代表“快进模式””,也就是直接把master指向dev的当前提交,所以合并速度非常快。 当然,也不是每次合并都能 Fast-forward,我们后面会讲其他方式的合并。

五、删除分支

合并完成后,dev 分支对于我们来说就没用了,那么 dev 分支 就可以被删除掉,注意如果当前正处于某分支下,就不能删除当前分支,如:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git branch
* dev
  master
lighthouse@VM-8-10-ubuntu:gitcode$ git branch -d dev
error: Cannot delete branch 'dev' checked out at '/home/lighthouse/code/gitcode'

而可以在其他分支下删除当前分支,如:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout master
Switched to branch 'master'
lighthouse@VM-8-10-ubuntu:gitcode$ git branch -d dev
Deleted branch dev (was 33a5368).
lighthouse@VM-8-10-ubuntu:gitcode$ git branch
* master

此时状态如图下所示:

image-20250408195158274

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

六、合并冲突

可是,在实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的问题

为了演示这问题,创建一个新的分支 dev1,并切换至目标分支,我们可以使用 git checkout -b dev1 -步完成创建并切换的动作,示例如下:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout -b dev1
Switched to a new branch 'dev1'
lighthouse@VM-8-10-ubuntu:gitcode$ git branch
* dev1
  master

dev1 分支下修改 book 文件,更改文件内容如下,并进行一次提交,如:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write bbb for new branch # 将 aaa 改为 bbb
lighthouse@VM-8-10-ubuntu:gitcode$ git add .
lighthouse@VM-8-10-ubuntu:gitcode$ git commit -m "modify book"
[dev1 da3c3b1] modify book
 1 file changed, 1 insertion(+), 1 deletion(-)

切换至 master 分支,观察 book 文件内容

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git checkout master
Switched to branch 'master'
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write aaa for new branch
  • 按照上面所讲的,切换回来之后文件内容就变成了老的版本

但是如果此时在 master 分支上,对文件再次进行修改并且提交,如下:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write ccc for new branch # 将 aaa 改为 ccc
lighthouse@VM-8-10-ubuntu:gitcode$ git add .
lighthouse@VM-8-10-ubuntu:gitcode$ git commit -m "modify book"
[master fc26892] modift book
 1 file changed, 1 insertion(+), 1 deletion(-)

现在,此时 master 分支 和 dev1 分支各自都分别有新的提交,如下:

image-20250408200254867

这种情况下,Git 只能试图把各自的修改合并起来,但这种合并就可能会有冲突,如下所示:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git merge dev1
Auto-merging book
CONFLICT (content): Merge conflict in book
Automatic merge failed; fix conflicts and then commit the result.
lighthouse@VM-8-10-ubuntu:gitcode$ git status
On branch master
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:   book

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

发现 book 文件有冲突后,可以直接查看文件内容,要说的是 Git 会用 <<<<<<<=======>>>>>>> 来标记出不同分支的冲突内容,如下所示:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
<<<<<<< HEAD
write ccc for new branch # 将 aaa 改为 ccc
=======
write bbb for new branch # 将 aaa 改为 bbb
>>>>>>> dev1

此时解决办法如下:

  • 手动调整冲突代码,并且需要 再次提交修正后结果
代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ cat book
Hello Island1314
Hello World
hello version1
hello version2
hello version3
write bbb for new branch
lighthouse@VM-8-10-ubuntu:gitcode$ git add .
lighthouse@VM-8-10-ubuntu:gitcode$ git commit -m "merge book"
[master cb7ce27] merge book

此时冲突就解决完成了,此时状态变成如下:

image-20250408200757506

用带参数的 git log也可以看到分支的合并情况,如下:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git log --graph --pretty=oneline --abbrev-commit
*   cb7ce27 (HEAD -> master) merge book
|\  
| * da3c3b1 (dev1) modify book
* | fc26892 modify book
|/  
* 33a5368 modify book
* f312a54 delete file
* b2030bb 删除测试
* c0117bd add version3
* 6c506d8 add version2
* 6af6d8b add version1
* b2f0ee2 add modify Book file
* dc24b53 commit my first file

最后,不要忘记 dev1 分支使用完毕后就可以删除了:

代码语言:javascript代码运行次数:0运行复制
lighthouse@VM-8-10-ubuntu:gitcode$ git branch -d dev1
Deleted branch dev1 (was da3c3b1).
lighthouse@VM-8-10-ubuntu:gitcode$ git branch
* master
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-04-21,如有侵权请联系 cloudcommunity@tencent 删除ubuntubranch工作管理git
发布评论

评论列表(0)

  1. 暂无评论