Git基础07 — 分支管理

简介

一家公司,不管是做 web 开发产品还是app开发产品,极少数是一个人来完成的。拿 JD 电商为例,这样一个庞大的系统涉及到的远不止这些,根据 JD 自己的说法,其投入的研发人员超1.8w人(不含外包)。

每个开发人员都负责自己的那部分模块的代码,并将修改后的代码提交到主分支之外的分支上,负责人再将修改后的代码进行合并。一些 bug、功能、性能等不能直接在稳定产品 master 主分支上面进行操作,这会影响业务的运行,因此我们需要分支,这也是 Git 的 "杀手锏"。简单来说,分支有3个好处:

  1. 与稳定的产品进行隔离,任何操作不影响业务的稳定性,通过代码 review 后,可合并到主分支上;
  2. 方便进行功能拓展与 bug 调试;
  3. 模块化的多人协同开发,提升开发效率;

正常来说,大多数情况下使用 Git 都会有这样的分支:

  • master – 主分支,主要是正式版稳定版的分支
  • develop – 开发分支,更新和变动最为频繁的分支,正常情况下开发都在develop分支上
  • release – 预发行版分支,代表一个版本的功能已经大致完成,需要有相关人员进行功能测试
  • features – 功能分支,包含每个程序员开发的功能

分支的相关命令

涉及到的命令有:

  1. git branch – 分支的创建、删除、查看
  2. git switch – 新版本中进行分支的切换
  3. git checkout – 旧版本中进行分支的切换

git branch

该命令可以对分支进行创建、删除与查看

  1. 查看本地库的所有分支

    PS > git branch
    * master
    new-branch

    用 "*" 标识,表示当前位于这个本地分支上。

  2. 查看远程库的所有分支

    PS > git branch -r
  3. 查看所有本地库与远程库的所有分支

    PS > git branch -a
  4. 创建分支(在 master 分支的 8a77771 基础上创建分支)

    PS > git branch
    * master
    new-branch
    
    PS > git log --oneline
    8a77771 (HEAD -> master) 修改后的lab-file文件
    f20abbc lab-file初始内容
    47d9368 tmp-file.txt --> Tmp-File.txt
    ae6cc9d First commit
    9a70355 测试文件
    
    PS > git branch b1
    
    # 切换分支
    PS > git switch b1
    Switched to branch 'b1'
    
    PS > git log --oneline
    8a77771 (HEAD -> b1, master) 修改后的lab-file文件
    f20abbc lab-file初始内容
    47d9368 tmp-file.txt --> Tmp-File.txt
    ae6cc9d First commit
    9a70355 测试文件
  5. 删除分支

    • -d – 该分支必须合并到其上游分支才能使用该选项进行删除。支持在一条命令上删除多个分支
    • -D – 无论该分支是否合并到上游分支,都强制将其删除。支持在一条命令上删除多个分支
    PS > git branch -d <branch-name> ...
    
    PS > git branch -D <branch-name> ...

git switch

  1. 切换分支

    PS > git switch <branch-name>
  2. 创建新分支且切换到新分支

    PS > git switch -c <branch-name>

    如前面文档中提到的,当切换分支后:

    HEAD 指向新的分支指针,分支指针指向最新的提交,此时 HEAD ‌依然通过分支指针间接指向最新提交。

git checkout

  1. 切换分支

    PS > git checkout <branch-name>
  2. 创建新分支且切换到新分支

    PS > git checkout -b <branch-name>

示例

首先将以前演示环境中的多余分支删除:

PS > git branch -a
* b1
master
new-branch

# 只保留 master 分支
PS > git switch master
PS > git branch -D b1 new-branch

我们可以演示从分支创建、合并到删除的一个完整过程:

PS > git log --oneline
8a77771 (HEAD -> master) 修改后的lab-file文件
f20abbc lab-file初始内容
47d9368 tmp-file.txt --> Tmp-File.txt
ae6cc9d First commit
9a70355 测试文件

# 在 8a77771 基础上新创建分支
PS > git switch -c newb1
Switched to a new branch 'newb1'

PS > git branch
  master
* newb1

PS > git log --oneline
8a77771 (HEAD -> newb1, master) 修改后的lab-file文件
f20abbc lab-file初始内容
47d9368 tmp-file.txt --> Tmp-File.txt
ae6cc9d First commit
9a70355 测试文件

# 在 newb1 分支上创建新文件并写入文件内容
PS > new-Item start.log
PS > echo "GNU/Linux" > .\start.log

# 切换到 master 分支
PS > git switch master
Switched to branch 'master'

PS > ls

    Directory: E:\git-test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---            2025/3/9    21:31             39 lab-file.txt
-a---           2025/3/12    15:38             11 start.log    ← 在其他分支上创建的新文件也可以在主分支上显示
-a---            2025/3/9    21:31             12 Tmp-File.txt

# 在这两个分支中,该文件的状态都是一样的 —— 工作在工作区,文件状态为未跟踪:
PS > git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        start.log

nothing added to commit but untracked files present (use "git add" to track)

PS > git switch newb1

PS > git status
On branch newb1
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        start.log

nothing added to commit but untracked files present (use "git add" to track)

# 在 newb1 分支中进行提交
PS > git add ./
PS > git commit -m "newb1分支中的第一个新文件"

# 一旦进行提交,主分支 master 的状态为:
PS > git switch master
Switched to branch 'master'

PS > git status
On branch master
nothing to commit, working tree clean

PS > ls

    Directory: E:\git-test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---            2025/3/9    21:31             39 lab-file.txt
-a---            2025/3/9    21:31             12 Tmp-File.txt

# 将 newb1 分支的文件变更合并到 master 上
## 这里的合并采用的是 merge 方式,他还有一个兄弟,被称为 rebase,这里先不展开
PS > git merge newb1
Updating 8a77771..4be932e
Fast-forward
 start.log | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 start.log

PS > ls

    Directory: E:\git-test

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---            2025/3/9    21:31             39 lab-file.txt
-a---           2025/3/12    17:08             11 start.log
-a---            2025/3/9    21:31             12 Tmp-File.txt

# 将 newb1 分支中的修改合并到了 master 分支中,此时就不需要 newb1 分支了
PS > git branch -d newb1
Deleted branch newb1 (was 4be932e).

PS > git branch
* master

PS > git log --oneline
4be932e (HEAD -> master) newb1分支中的第一个新文件
8a77771 修改后的lab-file文件
f20abbc lab-file初始内容
47d9368 tmp-file.txt --> Tmp-File.txt
ae6cc9d First commit
9a70355 测试文件

使用 merge 方式进行合并时要注意,该方式是将其他分支所做的修改合并在当前活跃分支上,换言之,您必须首先切换到要合并的分支上才能进行下一步的 merge 操作(如 git switch master && git merge newb1)。

Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇