跳到内容

元数据卡: 前置知识:ch03-git-commit.md | 预计时间:10 分钟 | 完成标志:能创建分支、切换分支、Fast-forward 合并

第二场战斗:我想做多个实验

你有了存档功能,心里踏实了。但有一个新问题出现了:你想试试一个更大胆的方案——尝试一种全新的锻造工艺。

可是你不敢。你怕把现在这把已经锻好的剑坯砸坏了,整件作品都回不来。现在的成品虽然不算完美但勉强能用——万一新工艺试了不行,连现在的都找不回来。

"要是能有两个平行的工作台就好了,"你自言自语,"一个台子上我继续维护当前这版成品,另一个台子上我随便折腾,就算炸了炉也不影响。"

这时候你需要分支。分支就像时光机上的"平行宇宙开关"。


创建分支

bash
# 创建一个叫 experiment 的分支
git branch experiment

# 切换到 experiment 分支
git switch experiment

# 上面两条命令等价于这一条(创建并切换)
git switch -c experiment

语言: Bash 如何运行: 在已初始化的 Git 项目里执行 预期输出(git branch 列分支):

  master
* experiment

创建分支只是轻量级操作——它只是创建了一个指针。创建一个新分支不会复制任何文件,不会占用额外空间。


在分支上工作

现在你在 experiment 分支上改代码。改了多少行、删了多少文件,master 分支纹丝不动。

bash
# 在 experiment 分支上改东西
echo "print('hello from experiment')" >> main.py
git add main.py
git commit -m "experiment: 添加新的打印逻辑"

改完实验后,你想回 master 看看:

bash
git switch master

回到 master 后发现——main.py 没有刚才那行 print。它完好无损地保留在你离开时的状态。

这就是 Git 分支的意义: 你可以进行多个互不干扰的探索,每个探索是一条独立的时间线。

试试看: 创建一个 try-new-tool 分支,在里面新建一个文件 tool.py,commit,切回 master 确认 tool.py 不存在。


第三场战斗:想把实验成果合并回来

你在实验分支上改了一大堆东西——新锻造工艺验证通过了,之前发现的铸造缺陷也修好了。

现在问题来了:你怎么把实验分支上的所有改进变回主干设计方案的一部分?你不可能把一整份新图纸手抄一遍,重新在 master 上画一遍。

"你画了两版图纸,"工坊主人不知何时站在你背后,"现在你想把第二版的改进加到第一版上。怎么做?"

实验成功了——你想把 experiment 分支的代码合并到 master 里。这就叫合并

bash
# 确保在 master 分支上
git switch master

# 把 experiment 的改动合进来
git merge experiment

语言: Bash 如何运行: 当前在 master 分支,experiment 分支有新的 commit 预期输出(顺利的情况):

Updating a1b2c3d..e5f6g7h
Fast-forward
 main.py | 1 +
 1 file changed 1 insertion(+)

看到 Fast-forward 了吗?这表示 master 自从创建 experiment 分支后没改过任何东西——所以 Git 只需要把 experiment 上的提交"快进"过来就行。这是最简单的情况。

合并前:
master: ●──●──●
                \
experiment:      ●──●──●

合并后(Fast-forward):
master: ●──●──●──●──●

合并完成后,masterexperiment 指向了同一个位置。你可以安全地删除实验分支:

bash
# 合并完成后删除分支
git branch -d experiment

注意: 删除分支不会删除 commit——commit 仍然在历史中。删除的只是一个标签/指针。


查看分支图

想看看你的"平行宇宙"长什么样?用带图形的日志:

bash
git log --graph --oneline --all

预期输出:

* e5f6g7h (HEAD -> master) experiment: 添加新的打印逻辑
* a1b2c3d 初始化 main.py 和 README

如果有多个分支分叉,你会看到 *| 组成的 ASCII 图形。

试试看: 创建两个分支,各自做一次不同内容的 commit,然后切到 master 用 git log --graph --oneline --all 查看。


下一步

Fast-forward 合并是最理想的情况。但现实不是这样的——你和同事改了同一行代码,怎么办?

下一节我们来看 合并冲突——Git 最让新手害怕、但其实不难对付的场景。

继续:合并冲突深度解析

Built with VitePress | Software Systems Atlas