2. 分支管理
Git 分支操作主要有创建分支、删除分支、列出分支、切换分支、合并分支,提交记录、等操作。
本小节我将学习如下几个关于分支的命令:
git branchgit switchgit branch 命令
作用: 用于创建分支、删除分支、列出分支。
命令格式
git branch [选项] [新分支名] [提交哈希值]
说明
git branch命令是显示本地所有分支,在当前的分支前显示星号(*)。- 只给出新分支名则在当前位置创建新分支。
- 只给出新分支名和提交哈希值则在指定的提交对象位置创建新分支。
常用选项
-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
此时的仓库内部有两个分支 master 和 myb1,其中 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 <新分支名> <提交哈希值>-注意:
- Git v2.23 以前的版本需要使用
git checkout代替git switch命令。 - 在切换分支之前,你要保证当前工作区是干净的,如果你的工作区不是干净的工作区,则切换会失败。
切换分区后,工作区的内容会被切换后的分支的最后一次提交的内容覆盖。
示例:
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.md 和 website.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 分支指针也就不存在了。