建站提交历史文章,原文写作时间 2023 年 1 月 11 日前后。

基本操作

1
2
3
4
5
6
7
8
git switch {branch}            # 切换分支
git switch -c {branch} # 新建并切换分支
git branch # 打印分支列表
git branch {branch} # 新建分支
git branch -d {branch} # 删除分支
git branch -D {branch} # 强力删除分支 (如果分支未合并需强力删除)
git branch -M {newName} # 重命名当前分支
git merge {branch} # 快速合并到当前分支 (重点)

删除分支将删除关于分支的所有信息,包含 reflog ,这意味着 -D 强力删除后将无法访问分支的任何相关信息。

分支合并

git merge 用于快速合并两个分支,如果两个分支没有同时更改一个文件,分支合并可以立即完成。合并结果即为两个文件的差异叠加。但是如果两个分支同时更改同一文件(称为 冲突),快速合并无法完成,分支将进入 merging 状态,此时需要你手动合并。手动合并从 git merge 开始到 git commit 结束。

假设你遇到了一个冲突:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建 Version1 分支
$ git switch -c version1
$ cat readme.md
This is version 1 # 手动修改
$ git commit -a -m "Version1"
$ git switch master
# 创建 Version2
$ git switch -c version2
$ cat readme.md
This is version 2 # 手动修改
$ git commit -a -m "Version2"
$ git switch version1
# Now wating for merging.

你需要解决这个复杂的冲突:

1
2
3
4
5
6
7
8
9
10
# 合并分支 :(
$ git merge version2 # 快速合并失败,状态栏显示: (version1|MERGING)
$ cat readme.md # 自动修改: 提示两者差异
...
$ git status # 查看待合并文件层差异
...
$ cat readme.md
NEW Version: Version 3 # 手动修改
$ git commit -a -m "New Version"
# 合并完成 :) # 状态栏恢复: (version1)

现在我们来查看一下成果:

1
2
3
4
5
6
7
8
$ git log --pretty=oneline --graph version1 # 显示合并图形结构
* a063a88... (HEAD -> version1) New Version
|\
| * f1ddb61... (version2) Version2
* | 5ee6131... version1
|/
* 6707dbc... (master) new addition
* d641665... init

如果中途想要放弃合并,可以使用:

1
git merge --abort

管理策略

  • 项目的 master 分支应该是稳定的。
  • 项目合作主要在 dev 分支进行。
  • 每个开发人员有独立的分支,如 jamhus-tao
  • 如图:

  • 此外,每个 BUG 可以有临时的分支,如 issue_101
  • 创建废弃分支,它应该有详细的名字,如 jamhus-tao_discarded_230111
  • 创建 cur 分支,用于在临时需要时在各个分支上自由跳跃。