内容纲要

🗂 | 查看 Git 专题可浏览更多内容


使用分支意味着可以把工作从开发主线上分离开来,以免影响开发主线。

有两种常见的 Git 分支的使用场景,或者说工作流:长期分支(Long-Running Branches)主题分支(Topic Branches)

长期分支(Long-Running Branches)存于在项目的整个生命周期,代表了在整个项目生命周期的一种状态。以开发项目为例:将主分支定位为最高等级的分支,仅用于保存产品代码。如此一来主分支可以直接用来上线于生产环境,然后新建的开发分支(它衍生于主分支)专门用于开发、测试等等,待稳定后合并于主分支。

主题分支(Topic Branches)就是基于某种主题的分支,例如着手开发一个新的功能的或是修复错误时,都应该对应不同的主题建立一个新的分支。这也是最常见的做法,特别是对于团队协作时你在本地的分支远程仓库并不可见,就可以尝试更多的方案择优选择,当多人协作时也可以避免提交冲突。

查看分支

到目前为止都是在初始的主分支(master)上作业(「master」是 Git 仓库初始化时默认创建的分支,其实和其他分支没什么不同)。

因为🥱无聊的政治正确,国外开始兴起用「main」来替代「master」的运动,所以你可能在一些平台或项目看到「main」而不是「master」…

想要查看 Git 的分支:

$ git branch

# 显示每个分支最新的 Commit ID 和提交信息
$ git branch -v

# 显示所有远程和本地的分支:
$ git branch -a

创建分支

假设当前只有一个分支 master,里面只有一个文稿文件 README.md,它的内容是这样的:

Git 简史

同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代.

你接到一个编号为 3 的反馈说该项目的格式和标点符号都不对,需要修改。

那开始着手进行修改吧,首先创建一个名为 iss3 的分支:

# git branch <branch-name>
# 创建名为 iss3 的分支
$ git branch iss3

如果想要创建并立即切换到所创建的分支可以这样:

# 创建名为 iss3 的分支并切换过去
$ git switch -c iss3
# 在旧版本 Git 中普遍使用签出(checkout)命令:
$ git checkout -b iss3

切换分支

切换到指定分支可以使用 git switch 命令:

# 切换至 iss3 分支
$ git switch iss3
# 如果想快速从哪来回哪去,如从 master 切换到 iss3,现在想快速回 master,可以使用 -
$ git switch -

# 在旧版本 Git 中普遍使用签出 checkout 命令,注意这里没有 -d 选项
$ git checkout master

合并分支

切换到 iss3 后提交了两次提交,将 README.md 进行修改成了这样:

## Git 简史

同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。

两次提交为:

  1. 修正格式 – 第一行的修改,加上了标题
  2. 修正标点符号 – 第二杭的修改,使用中文标点;

修改完成后,将修改内容合并到 master 分支:

# 首先切换回 master 分支
$ git switch master

此时 master 分支下的 README.md 文件还是未修改的,在工作时可以随时创建一个新分区来实践一些新想法。

现在合并指定分支 iss3 到当前分支 master

$ git merge iss3

删除分支

合并后 iss3 分支就可以删除了

# 删除已合并分支
# git branch -d <branch-name>
$ git branch -d iss3

合并的几种方式

fast-forward

一般情况下 git merge 是使用「快速合并(fast-forward)」,以刚才的例子为例,使用命令:

$ git reflog
a50e9f5 (HEAD -> master, iss3) [email protected]{0}: merge iss3: Fast-forward
e8f2bbc [email protected]{1}: checkout: moving from iss3 to master
a50e9f5 (HEAD -> master, iss3) [email protected]{2}: commit: 修正标点符号
0aadb9c [email protected]{3}: commit: 修正格式
e8f2bbc [email protected]{4}: checkout: moving from master to iss3
e8f2bbc [email protected]{5}: commit: 添加内容初稿
160218c [email protected]{6}: commit (initial): 添加说明文件
$ git log --graph --pretty=short
* commit a50e9f525347c53317a2b5386c4f1a8ed81ce786 (HEAD -> master, iss3)
| Author: Conners Hua <[email protected]>
|
|     修正标点符号
|
* commit 0aadb9cc5cd0a4286b19efc9c6506c54b9658967
| Author: Conners Hua <[email protected]>
|
|     修正格式
|
* commit e8f2bbc62fd170cbf7c574d681643d717fd5a053
| Author: Conners Hua <[email protected]>
|
|     添加内容初稿
|
* commit 160218c2425705eff8d2d5de173629f1c33ee423
  Author: Conners Hua <[email protected]>

      添加说明文件

可以看到 master 分支的提交历史中也有 iss3 的提交历史。

除了 fast-forward 还有另外几种方式:

–no-ff

如果合并时使用的是 git merge --no-ff <branch-name>,那么使用命令 git log --graph --pretty=short

*   commit f4c4ec661856d02e306c035a10f28ad3b055e11a (HEAD -> master)
|\  Merge: e8f2bbc a50e9f5
| | Author: Conners Hua <[email protected]>
| |
| |     合并 'iss3' 分支,修正文稿内容
| |
| * commit a50e9f525347c53317a2b5386c4f1a8ed81ce786 (iss3)
| | Author: Conners Hua <[email protected]>
| |
| |     修正标点符号
| |
| * commit 0aadb9cc5cd0a4286b19efc9c6506c54b9658967
|/  Author: Conners Hua <[email protected]>
|
|       修正格式
|
* commit e8f2bbc62fd170cbf7c574d681643d717fd5a053
| Author: Conners Hua <[email protected]>
|
|     添加内容初稿
|
* commit 160218c2425705eff8d2d5de173629f1c33ee423
  Author: Conners Hua <[email protected]>

      添加说明文件

使用 --no-ffmaster 的提交历史虽然可以看到 iss3 的提交历史,但是注意最左侧的线,它清晰的显示这部分的提交是来自于另一条分支。

–squash

如果合并时使用的是 git merge --squash <branch-name>,那么使用命令 git log --graph --pretty=short 时你会发现没有新的提交,因为此时来自 iss3 分支的修改内容直接存到 master 分支的工作区和暂存区。

这时候需要手动的提交:

$ git commit -m '合并 iss3 分支,修正文稿内容'

然后再查看下历史

git log --graph --pretty=short
* commit a1c313d85cbc517aa37b5ada8a553ce65eb8e91f (HEAD -> master)
| Author: Conners Hua <[email protected]>
|
|     合并 iss3 分支,修正文稿内容
|
* commit e8f2bbc62fd170cbf7c574d681643d717fd5a053
| Author: Conners Hua <[email protected]>
|
|     添加内容初稿
|
* commit 160218c2425705eff8d2d5de173629f1c33ee423
  Author: Conners Hua <[email protected]>

      添加说明文件

使用 --squash 可以让其他分支的最新改动直接存到当前分支的工作区和暂存区,然后再进行提交,并且不会显示被合并分支的提交历史。

小结

关于分支:

  • 查看分支使用命令 git branch,可以加上 -a-v 选项,或两个选项一起使用 -av
  • 创建分支使用命令 git branch <分支名>,如果想要创建后立即切换到新创建的分支,可以使用命令 git switch -c <分支名>
  • 切换分支可以使用命令 git switch <分支名>,切换后快速返回切换前的分支可以使用命令 git switch -
  • 合并分支需先切换至要合并到的分支,然后使用命令 git merge <分支名>
  • 合并后删除已合并的分支使用命令 git branch -d <分支名>,若想删除未合并的分支使用命令 git branch -D <分支名>

关于合并:

  • fast-forward:会在当前分支添加被合并分支的提交历史;
  • --no-ff:清晰的显示哪些提交来自被合并分支的提交历史;
  • --squash:将被合并分支的修改直接存到工作区及暂存区,然后手动的进行提交,这样当前分支的提交历史不会参杂被合并分支的提交历史;