2. 分支管理

Git 分支操作主要有创建分支、删除分支、列出分支、切换分支、合并分支,提交记录、等操作。

本小节我将学习如下几个关于分支的命令:

命令
说明
git branch
创建分支、删除分支、列出分支。
git switch
切换分支。

git branch 命令

作用: 用于创建分支、删除分支、列出分支。

命令格式

git branch [选项] [新分支名] [提交哈希值]

说明

  1. git branch 命令是显示本地所有分支,在当前的分支前显示星号(*)。
  2. 只给出新分支名则在当前位置创建新分支。
  3. 只给出新分支名和提交哈希值则在指定的提交对象位置创建新分支。

常用选项

选项
说明
-d <分支名>
删除已合并分支。
-D <分支名>
删除未合并分支。
-r
查看远程分支。
-a
查看所有分支,包括远程分支。
-v
查看本地分支的最后一次提交信息。
-vv
查看本地分支的最后一次提交信息(包含跟踪关系)。
--merged
查看已合并到当前分支的分支。
--no-merged
查看未合并到当前分支的分支。
-m <新分支名>
重命名当前分支
-m <旧分支名> <新分支名>
重命名指定分支

示例:

之前的 my_project 工程,其中有两次提交,Git 本地仓库内部结构如下:

                 HEAD
                  |
              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+

1、 查看 my_project 项目中本地分支。

weimingze@mzstudio:~/my_project$ git branch
* master

可见现在只有一个分支 master ,前面的星号(*) 表示当前分支指向 master 分支,即: HEAD 指向 master 分支指针。

2、 查看 my_project 项目中所有分支。

weimingze@mzstudio:~/my_project$ git branch -a
* master
  remotes/origin/master

remotes/origin/master 是远程分支。

3、 查看 my_project 项目中所有分支,并显示最后一次提交信息。

weimingze@mzstudio:~/my_project$ git branch -a -v
* master                5dcccb0 魏明择在当前项目中修改了 README.md 文件,并添加了 website.txt 文件
  remotes/origin/master 5dcccb0 魏明择在当前项目中修改了 README.md 文件,并添加了 website.txt 文件

4、 在当前分支的最后一个提交对象位置创建一个 myb1 的分支。

weimingze@mzstudio:~/my_project$ git branch myb1
weimingze@mzstudio:~/my_project$ git branch
* master
  myb1

此时的仓库内部有两个分支 mastermyb1,其中 HEAD 指向 master 分支指针,结果如下。

                 HEAD
                  |
              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+
                  |
              .--------.
              |  myb1  |
              `--------`

5、 在当前分支的 8cb34d1 这个提交对象位置创建一个 myb2 的分支。

weimingze@mzstudio:~/my_project$ git branch myb2 8cb34d1
weimingze@mzstudio:~/my_project$ git branch
* master
  myb1
  myb2
weimingze@mzstudio:~/my_project$ git branch -v
* master 5dcccb0 魏明择在当前项目中修改了 README.md 文件,并添加了 website.txt 文件
  myb1   5dcccb0 魏明择在当前项目中修改了 README.md 文件,并添加了 website.txt 文件
  myb2   8cb34d1 魏明择在当前项目中添加了 README.md文件

可见当前本地仓库有三个本地分支,其中 myb2 分支指针指向了 8cb34d1 这个提交对象。

                 HEAD
                  |
              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+
    |             |
.--------.    .--------.
|  myb2  |    |  myb1  |
`--------`    `--------`

git switch 命令

作用: 用于切换到某个分支。

命令格式

git switch [选项] 分支名

git switch 的常用选项

选项
说明
-c
切换到当前分支,如果没有此分支则创建分支。
-c <新分支名> <提交哈希值>
在特定的提交对象的位置创建新分支并切换到当前分支。
-
切换到来到次分支前的那个分支。

注意:

  1. Git v2.23 以前的版本需要使用 git checkout 代替 git switch 命令。
  2. 在切换分支之前,你要保证当前工作区是干净的,如果你的工作区不是干净的工作区,则切换会失败。

切换分区后,工作区的内容会被切换后的分支的最后一次提交的内容覆盖。

示例:

1、将当前分支切换到 myb1 分支。

weimingze@mzstudio:~/my_project$ git branch
* master
  myb1
  myb2
weimingze@mzstudio:~/my_project$ ls
README.md  website.txt
weimingze@mzstudio:~/my_project$ git switch myb1
Switched to branch 'myb1'
weimingze@mzstudio:~/my_project$ git branch
  master
* myb1
  myb2
weimingze@mzstudio:~/my_project$ ls
README.md  website.txt

可见,切换前 工作区有两个文件 README.mdwebsite.txt 使用 git switch myb1 成功切换到了 myb1 分支。工作区内容没有变化。原因是此时 master 分支指针和 myb1 分支指针都指向了最后一个提交,切换前的结构如下:

                 HEAD
                  |
              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+
    |             |
.--------.    .--------.
|  myb2  |    |  myb1  |
`--------`    `--------`

切换到 myb1分支后只是 HEAD 指向了 myb1 分支指针。如下图所示:

              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+
    |             |
.--------.    .--------.
|  myb2  |    |  myb1  |
`--------`    `--------`
                  |
                 HEAD

因为这两个分支指针都指向了 5dcccb0 这个提交对象。因此工作区的内容也被恢复到了 5dcccb0 提交时的状态。

2、 切换到 myb2 分支

weimingze@mzstudio:~/my_project$ git switch myb2
Switched to branch 'myb2'
weimingze@mzstudio:~/my_project$ git branch
  master
  myb1
* myb2
weimingze@mzstudio:~/my_project$ ls
README.md

当切换到 myb2 分支后,HEAD 指针指向了 myb2 分支指针。工作区也被恢复成 8cb34d1 提交的状态。状态如下:

              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+
    |             |
.--------.    .--------.
|  myb2  |    |  myb1  |
`--------`    `--------`
    |
   HEAD

3、 删除 myb2 分支。

先要确保你的当前分支不是 myb2 分支,否则删除失败。提示如下:

weimingze@mzstudio:~/my_project$ git branch
  master
  myb1
* myb2
weimingze@mzstudio:~/my_project$ git branch -d myb2
error: cannot delete branch 'myb2' used by worktree at '/home/weimingze/my_project'

下面我们切换当前工作分支为 master 分支,然后删除 myb2 分支。

weimingze@mzstudio:~/my_project$ git switch master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.
weimingze@mzstudio:~/my_project$ git branch
* master
  myb1
  myb2
weimingze@mzstudio:~/my_project$ git branch -d myb2
Deleted branch myb2 (was 8cb34d1).
weimingze@mzstudio:~/my_project$ git branch
* master
  myb1

此时本地仓库恢复到了以下的状态:

                 HEAD
                  |
              .--------.
              | master |
              `--------`
                  |
+-------+     +-------+
|8cb34d1| <-- |5dcccb0|
+-------+     +-------+
                  |
              .--------.
              |  myb1  |
              `--------`

现在之前创建的 myb2 分支被删除了。 myb2 分支指针也就不存在了。