背景与动机
Git 分支用来隔离不同开发线。日常开发中,常见做法是从主分支切出功能分支,在功能分支提交代码,完成后再合并回主分支。
分支管理最容易出问题的地方不是命令本身,而是执行命令时站错了分支。
核心原理拆解
1. 分支本质是指向提交的引用
可以把 Git 分支理解成一个名字,它指向某个 commit。随着你在这个分支上继续提交,这个名字会向新的 commit 移动。
当前工作区所在位置由 HEAD 指示。切换分支时,Git 会更新 HEAD,并把工作区内容切换到目标分支对应的文件状态。
2. git branch:查看、创建、删除分支
查看本地分支:
git branch查看本地和远程分支:
git branch -a创建新分支:
git branch <branch-name>删除已经合并的本地分支:
git branch -d <branch-name>强制删除本地分支:
git branch -D <branch-name>-D 会丢弃该分支上未合并的提交引用,使用前要确认这些提交确实不需要了。
3. git switch:切换分支
新版本 Git 更推荐用 git switch 切换分支:
git switch <branch-name>创建并切换到新分支:
git switch -c <branch-name>旧写法也仍然常见:
git checkout <branch-name>git checkout -b <branch-name>可以简单记成:切分支优先用 switch,恢复文件优先用 restore,旧项目里看到 checkout 也要能读懂。
4. git merge:把指定分支合并到当前分支
git merge 把指定分支合并到当前分支:
git merge <branch-to-merge-from>例如,要把 feature/login 合并到 main:
git switch maingit merge feature/login重点是:merge 的目标永远是“当前所在分支”。如果站错分支,就会把代码合并到错误的位置。
5. 冲突解决流程
如果两个分支修改了同一位置,Git 可能无法自动判断保留哪一边,于是产生冲突。
冲突文件里会出现类似标记:
<<<<<<< HEAD当前分支内容=======被合并分支内容>>>>>>> feature/login解决冲突的流程:
# 1. 打开冲突文件,手动整理成最终想要的内容
# 2. 标记冲突已解决git add <resolved-file>
# 3. 完成合并提交git commit解决冲突只是修改文件内容。Git 需要你用 git add 告诉它“这个冲突已经处理好了”。
常见工作流示例
从主分支创建功能分支
git switch maingit pullgit switch -c feature/login合并功能分支
git switch maingit pullgit merge feature/login合并后删除本地功能分支
git branch -d feature/login如果删除失败,通常说明 Git 判断这个分支还没有被当前分支合并。不要马上用 -D,先确认提交是否还需要保留。
常见陷阱
1. 没看当前分支就 merge
合并前先看:
git status -sb确认当前分支是目标分支,再执行 git merge。
2. 工作区不干净就切分支
如果当前有未提交修改,切分支可能失败,或者把改动带到另一个分支。切换前最好先提交、stash,或者明确丢弃。
3. 冲突解决后忘记重新 add
手动改完冲突文件后,还要执行:
git add <resolved-file>否则 Git 仍然认为冲突没有解决。
一句话总结
分支管理的关键是:先确认自己站在哪个分支,再决定要创建、切换、合并还是删除。