Git 常用命令与工作流
pull、fetch、rebase、merge 命令及 Git Flow 工作流
问题
解释 Git 中 pull、fetch、rebase、merge 命令的区别,以及 Git Flow 工作流的使用。
解答
fetch vs pull
# fetch: 只下载远程更新,不合并
git fetch origin main
# 查看远程分支的更新
git log HEAD..origin/main
# pull: 下载并合并(相当于 fetch + merge)
git pull origin main
# pull 使用 rebase 方式合并
git pull --rebase origin main
merge vs rebase
# === merge: 创建合并提交,保留分支历史 ===
git checkout main
git merge feature
# 合并后的历史(有分叉):
# A---B---C feature
# / \
# D---E---F---G main (G 是合并提交)
# === rebase: 变基,线性历史 ===
git checkout feature
git rebase main
# 变基后的历史(线性):
# D---E---F---A'---B'---C' feature
# |
# main
交互式 rebase
# 修改最近 3 次提交
git rebase -i HEAD~3
# 在编辑器中可以:
# pick - 保留提交
# reword - 修改提交信息
# edit - 修改提交内容
# squash - 合并到上一个提交
# drop - 删除提交
# 示例:合并多个提交为一个
pick abc1234 feat: add user login
squash def5678 fix: login bug
squash ghi9012 fix: another bug
Git Flow 工作流
# 主要分支
# main - 生产环境代码
# develop - 开发分支
# 辅助分支
# feature/* - 功能开发
# release/* - 发布准备
# hotfix/* - 紧急修复
# === 开发新功能 ===
git checkout develop
git checkout -b feature/user-auth
# 开发完成后合并回 develop
git checkout develop
git merge --no-ff feature/user-auth
git branch -d feature/user-auth
# === 准备发布 ===
git checkout develop
git checkout -b release/1.0.0
# 修复发布前的 bug...
# 完成后合并到 main 和 develop
git checkout main
git merge --no-ff release/1.0.0
git tag -a v1.0.0 -m "Release 1.0.0"
git checkout develop
git merge --no-ff release/1.0.0
git branch -d release/1.0.0
# === 紧急修复 ===
git checkout main
git checkout -b hotfix/login-crash
# 修复完成后合并到 main 和 develop
git checkout main
git merge --no-ff hotfix/login-crash
git tag -a v1.0.1 -m "Hotfix 1.0.1"
git checkout develop
git merge --no-ff hotfix/login-crash
git branch -d hotfix/login-crash
常用场景命令
# 撤销工作区修改
git checkout -- <file>
git restore <file> # Git 2.23+
# 撤销暂存
git reset HEAD <file>
git restore --staged <file> # Git 2.23+
# 撤销提交(保留修改)
git reset --soft HEAD~1
# 撤销提交(丢弃修改)
git reset --hard HEAD~1
# 修改最后一次提交
git commit --amend
# 暂存当前工作
git stash
git stash pop
# 查看某次提交的修改
git show <commit>
# 查找引入 bug 的提交
git bisect start
git bisect bad # 当前版本有 bug
git bisect good v1.0.0 # 这个版本没问题
# Git 会二分查找,每次告诉它 good 或 bad
关键点
- fetch vs pull:fetch 只下载不合并,pull = fetch + merge
- merge vs rebase:merge 保留分支历史,rebase 产生线性历史
- rebase 黄金法则:不要对已推送的公共分支执行 rebase
- Git Flow 分支:main(生产)、develop(开发)、feature(功能)、release(发布)、hotfix(修复)
- —no-ff:合并时强制创建合并提交,保留分支信息
目录