Git 常用命令与工作流

pull、fetch、rebase、merge 命令及 Git Flow 工作流

问题

解释 Git 中 pullfetchrebasemerge 命令的区别,以及 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:合并时强制创建合并提交,保留分支信息