Git 分支管理完全指南:branch/checkout/merge/rebase
Introduction
分支是 Git 最强大的功能之一,它允许你在不影响主线代码的情况下开发新功能或修复问题。掌握分支管理是 Git 进阶的必经之路。本文详细介绍 Git 分支的创建、切换、合并与变基操作,助你高效管理代码版本。
基础语法
# 查看分支
git branch # 查看本地分支(当前分支前有 * 标记)
git branch -a # 查看所有分支(包括远程)
git branch -v # 查看分支及最新提交
创建分支
git branch <分支名> # 创建新分支(不切换)
git checkout -b <分支名> # 创建并切换到新分支
git switch -c <分支名> # 同上,Git 2.23+ 推荐语法
切换分支
git checkout <分支名> # 切换到已有分支
git switch <分支名> # 同上,Git 2.23+ 推荐语法
删除分支
git branch -d <分支名> # 安全删除(已合并)
git branch -D <分支名> # 强制删除(未合并也删除)
合并分支
git merge <分支名> # 将指定分支合并到当前分支
git merge --no-ff <分支名> # 禁用快进合并,保留分支历史
变基(Rebase)
git rebase <目标分支> # 将当前分支变基到目标分支
git rebase -i HEAD~<n> # 交互式变基,修改最近 n 条提交
stash 暂存工作区
git stash # 暂存当前工作区
git stash pop # 恢复暂存并删除
git stash list # 查看暂存列表
完整代码示例
# ===== Git 分支管理实战 =====
1. 初始化仓库并创建初始提交
git init branch-demo
cd branch-demo
echo "# 分支演示项目" > README.md
git add . && git commit -m "init project"
2. 创建并切换到功能分支
git checkout -b feature/login
输出:Switched to a new branch feature/login
3. 在功能分支上开发
echo "登录功能开发中" > login.py
git add . && git commit -m "feat: add login module"
echo "验证逻辑" >> login.py
git add . && git commit -m "feat: add validation logic"
4. 查看分支状态
git branch
master
* feature/login (* 表示当前分支)
5. 切回主分支并创建修复分支
git checkout master
git checkout -b hotfix/fix-bug
echo "修复了严重bug" >> bug.py
git add . && git commit -m "fix: resolve critical bug"
6. 将修复合并到主分支
git checkout master
git merge hotfix/fix-bug
输出:Merge made by the ort strategy.
7. 删除修复分支
git branch -d hotfix/fix-bug
8. 切换回功能分支,继续开发
git checkout feature/login
echo "数据库连接" >> login.py
git add . && git commit -m "feat: add database connection"
9. 将功能分支合并到主分支(使用 --no-ff 保留分支历史)
git checkout master
git merge --no-ff feature/login
会触发编辑器,输入合并提交信息
10. 使用 rebase 同步主分支更新
git checkout feature/login
git rebase master
变基后,feature/login 的提交会移植到 master 最新提交之后
11. 处理变基中的冲突
如果冲突:
git status # 查看冲突文件
手动编辑冲突文件,删除冲突标记
git add <冲突文件>
git rebase --continue # 继续变基
或 git rebase --abort 取消变基
12. 使用 stash 暂存工作区
git checkout feature/login
echo "半成品代码" >> temp.py
git stash # 暂存工作区
git checkout master # 切换分支处理紧急任务
... 处理紧急任务 ...
git checkout feature/login
git stash pop # 恢复暂存的工作区
13. 查看分支图
git log --graph --oneline --all
输出分支合并和变基的历史图形
echo "分支管理完成!"
常见问题
Q1: merge 和 rebase 有什么区别?应该用哪个?
git merge 将两个分支的提交合并成一个合并提交,保留完整的分支历史,不会修改提交记录,适合团队协作和公共分支。git rebase 将当前分支的提交移植到目标分支之后,产生线性历史,但会重写提交记录。重要规则:不要对已推送到远程的提交进行 rebase,这会导致协作问题。
Q2: 如何删除远程分支?
本地删除分支后,远程分支需要用 git push origin --delete <分支名> 删除。或者在 GitHub/GitLab 网页上删除。建议使用 -d 而不是 -D 删除本地分支,Git 会防止误删未合并的分支。
Q3: 发生合并冲突怎么办?
冲突发生时,Git 会在文件中添加冲突标记(<<<<<<<、=======、>>>>>>>)。手动编辑文件,删除冲突标记并保留需要的代码,然后 git add <文件> 和 git commit 完成合并。使用 git merge --abort 可以取消合并。
Q4: HEAD 是什么?如何利用它回退?
HEAD 是指向当前分支最新提交的指针。git checkout HEAD~1 可以查看上一个提交(分离 HEAD 状态)。git checkout -b <分支名> HEAD~3 可以基于倒数第3个提交创建新分支。
延伸阅读
- Git 分支新建与合并 - 官方教程
- Git 变基详解 - 深入理解 rebase
- A successful Git branching model - Git Flow 分支模型