
从入门到精通的 Git 学习手册 更新日期2026-07-18 目录Git 基础概念常用命令详解分支管理策略协作工作流高级技巧常见问题与解决方案命令速查表一、Git 基础概念1.1 什么是 GitGit 是一个分布式版本控制系统由 Linus Torvalds 于 2005 年创建。与集中式版本控制如 SVN不同每个开发者本地都有完整的代码仓库副本。1.2 三个核心区域┌─────────────────────────────────────────────────────────────┐ │ 工作区 (Working Directory) │ │ 你实际编辑文件的地方 │ └────────────────────┬────────────────────────────────────────┘ │ git add ▼ ┌─────────────────────────────────────────────────────────────┐ │ 暂存区 (Staging Area / Index) │ │ 即将提交的更改清单 │ └────────────────────┬────────────────────────────────────────┘ │ git commit ▼ ┌─────────────────────────────────────────────────────────────┐ │ 本地仓库 (Local Repository) │ │ .git 目录保存所有历史版本 │ └────────────────────┬────────────────────────────────────────┘ │ git push ▼ ┌─────────────────────────────────────────────────────────────┐ │ 远程仓库 (Remote Repository) │ │ GitHub / GitLab / Gitee 等 │ └─────────────────────────────────────────────────────────────┘1.3 三种文件状态状态说明Modified文件已修改但未添加到暂存区Staged文件已添加到暂存区等待提交Committed文件已提交到本地仓库1.4 关键概念概念说明SHA-1 哈希Git 用 40 位十六进制数唯一标识每次提交HEAD指向当前分支最新提交的指针远程仓库托管在服务器上的仓库副本索引Index暂存区的技术名称对象数据库.git/objects 中存储所有版本数据二、常用命令详解2.1 初始化与配置# 初始化一个新的 Git 仓库 git init # 配置用户名和邮箱提交时会记录 git config --global user.name Your Name git config --global user.email youremail.com # 查看配置 git config --list # 配置默认分支名 git config --global init.defaultBranch main # 配置别名提高效率 git config --global alias.co checkout git config --global alias.br branch git config --global alias.st status git config --global alias.lg log --oneline --graph --all2.2 基本操作# 查看仓库状态 git status git status -s # 精简模式 # 添加文件到暂存区 git add filename.txt # 添加单个文件 git add . # 添加所有更改 git add *.py # 添加所有 Python 文件 # 提交更改 git commit -m 提交信息 git commit -am 跳过暂存区提交 # 仅对已跟踪文件有效 git commit --amend # 修改最近一次提交信息 git commit --amend --no-edit # 不修改信息只补充遗漏 # 查看提交历史 git log git log --oneline # 单行显示 git log --graph # 图形化显示 git log --oneline --graph --all # 最常用组合 git log -p # 显示差异详情 git log --authorname # 按作者筛选2.3 文件操作# 比较差异 git diff # 工作区 vs 暂存区 git diff --staged # 暂存区 vs 最后一次提交 git diff HEAD # 工作区 vs 最后一次提交 git diff commit1 commit2 # 比较两次提交 # 撤销操作 git restore filename.txt # 撤销工作区的修改 git restore --staged filename # 从暂存区移除保留修改 git reset HEAD~1 # 撤销最后一次提交保留更改 git reset --hard HEAD~1 # 撤销最后一次提交丢弃更改 git reset --soft HEAD~1 # 撤销提交将更改放回暂存区 # 删除和移动 git rm filename.txt # 删除文件并记录到暂存区 git mv old.txt new.txt # 重命名文件2.4 远程仓库操作# 克隆远程仓库 git clone https://github.com/user/repo.git git clone --depth 1 url # 浅克隆只克隆最新版本速度快 # 管理远程仓库 git remote -v # 查看远程仓库列表 git remote add origin url # 添加远程仓库 git remote remove origin # 移除远程仓库 git remote rename old new # 重命名远程仓库 # 推送与拉取 git push origin main # 推送到远程 git push -u origin main # 设置上游并推送 git push --force # 强制推送慎用 git push origin --delete branch # 删除远程分支 git pull # git fetch git merge git pull --rebase # git fetch git rebase git fetch # 只拉取不合并 git fetch --prune # 拉取并清理已删除的远程分支三、分支管理策略3.1 分支操作# 查看分支 git branch # 本地分支列表 git branch -r # 远程分支列表 git branch -a # 所有分支 # 创建分支 git branch feature-login # 创建分支 git checkout -b feature-login # 创建并切换 git switch -c feature-login # 同上新版 Git # 切换分支 git checkout main # 切换分支 git switch main # 同上新版 Git # 删除分支 git branch -d feature-login # 删除已合并的分支 git branch -D feature-login # 强制删除未合并的分支3.2 合并与变基# 合并Merge git checkout main git merge feature-login # 将 feature-login 合并到 main # 变基Rebase—— 使历史更线性 git checkout feature-login git rebase main # 将 feature 分支变基到 main 之上 # 交互式变基整理提交历史 git rebase -i HEAD~3 # 合并/修改最近 3 次提交Merge vs Rebase 对比Merge: main: A---B---C---D \ / feature: E---F Rebase: main: A---B---C---D \ feature: E---FMergeRebase历史保留完整分支历史线性历史更清晰安全性安全不会重写历史有风险可能重写历史冲突处理一次性解决每个提交依次解决适用场景公共分支本地或私有分支3.3 经典分支模型Git Flow适用大型项目master ──────●──────────●──────────● \ / \ / develop ●────●──●────●──●────●──● \ / \ / feature ●──●──● ●──●分支用途main生产环境代码随时可部署develop开发主分支feature/*功能开发分支release/*发布准备分支hotfix/*紧急修复分支GitHub Flow适用持续部署main ───●───●───●───●───●───●───● \ / \ / feature ●──● ●──●从 main 创建 feature 分支开发完成后提交 Pull Request代码审查后合并回 main合并即部署四、协作工作流4.1 Pull Request 流程DeveloperGitHubLocal主仓库ReviewerFork 主仓库Clone 到本地创建功能分支开发并提交Push 到 fork 仓库创建 Pull Request代码审查提出修改意见修改代码推送更新Merge PRDeveloperGitHubLocal主仓库Reviewer4.2 解决冲突# 当合并发生冲突时 git merge feature-branch # 输出CONFLICT in filename.txt # 查看冲突文件 git status # 手动编辑冲突文件后 # HEAD # 你的代码 # # 对方的代码 # feature-branch # 标记为已解决 git add filename.txt # 完成合并 git commit4.3 代码审查清单功能是否按预期工作代码风格是否一致是否有足够的测试是否有安全隐患是否有优雅的错误处理是否有清楚的提交信息4.4 提交信息规范Conventional Commitstype(scope): description [optional body] [optional footer]Type说明feat新功能fix修复 Bugdocs文档变更style代码格式不影响功能refactor重构test测试相关chore构建/工具相关perf性能优化示例feat(login): add OAuth2 authentication Implement Google and GitHub OAuth login flow. Add refresh token rotation for security. Closes #123五、高级技巧5.1 Stash —— 临时保存工作# 暂存当前修改 git stash git stash save WIP: fixing login bug # 查看暂存列表 git stash list # 恢复暂存 git stash pop # 恢复并删除 git stash apply # 恢复但不删除 git stash apply stash{2} # 恢复指定暂存 # 删除暂存 git stash drop stash{0} # 删除指定暂存 git stash clear # 清空所有暂存5.2 Cherry-pick —— 精选提交# 将某个提交应用到当前分支 git cherry-pick commit-hash # 应用多个提交 git cherry-pick hash1 hash2 hash3 # 只应用更改但不提交 git cherry-pick -n commit-hash5.3 Reflog —— 后悔药# 查看所有 HEAD 移动记录 git reflog # 恢复到丢失的提交 git reset --hard HEAD{2} # 恢复被删除的分支 git checkout -b recovered-branch HEAD{id}5.4 Bisect —— 二分查找 Bug# 开始二分查找 git bisect start # 标记当前版本为有问题 git bisect bad # 标记某个历史版本为没问题 git bisect good commit-hash # Git 会检出中间版本你测试后标记 git bisect good # 或 git bisect bad # 找到第一个有问题的提交后 git bisect reset5.5 子模块与子树# 添加子模块 git submodule add repo-url path/to/submodule # 初始化和更新子模块 git submodule init git submodule update # 克隆包含子模块的仓库 git clone --recurse-submodules repo-url # 更新所有子模块 git submodule update --remote5.6 Git Hooks在.git/hooks/目录下放置可执行脚本Hook触发时机pre-commit提交前用于运行 lint/testscommit-msg提交后用于验证提交信息pre-push推送前用于运行测试post-merge合并后用于更新依赖# .git/hooks/pre-commit 示例 #!/bin/sh npm run lint if [ $? -ne 0 ]; then echo Lint failed, commit aborted exit 1 fi5.7 实用配置# 忽略文件权限变化 git config core.fileMode false # 自动转换换行符Windows 团队协作 git config core.autocrlf true # 启用颜色输出 git config color.ui auto # 配置合并工具 git config merge.tool vscode git config mergetool.vscode.cmd code --wait $MERGED # Git 忽略全局配置 git config --global core.excludesFile ~/.gitignore_global六、常见问题与解决方案6.1 提交信息写错了# 修改最近一次提交信息 git commit --amend -m 正确的提交信息 # 修改更早的提交信息需要交互式变基 git rebase -i HEAD~3 # 将 pick 改为 reword保存后修改信息6.2 不小心提交到错误的分支# 方法一Cherry-pick # 1. 记录刚提交的 hash git log --oneline -1 # 2. 切换到正确分支 git checkout correct-branch # 3. 应用那个提交 git cherry-pick commit-hash # 4. 回到错误分支撤销提交 git checkout wrong-branch git reset HEAD~1 # 方法二Reset 后重新提交更简单 git reset HEAD~1 git stash git checkout correct-branch git stash pop git add . git commit -m msg6.3 误删了文件或分支# 恢复误删的文件 git checkout HEAD -- filename.txt # 恢复被删除的分支 git reflog # 找到分支最后一次提交的 hash git checkout -b recovered-branch hash6.4 合并冲突恐惧症# 放弃当前合并 git merge --abort # 使用可视化工具解决冲突 git mergetool # 接受对方的版本 git checkout --ours filename.txt # 保留当前分支的 git checkout --theirs filename.txt # 保留合并进来的6.5 大文件误提交# 使用 BFG Repo-Cleaner推荐 java -jar bfg.jar --delete-files *.zip # 或者使用 git filter-branch git filter-branch --tree-filter rm -f *.zip HEAD # 强制推送清理后的历史 git push --force6.6 撤销已推送的提交# 安全方式创建一个反向提交 git revert commit-hash git push # 危险方式强制推送不要用于公共分支 git reset --hard HEAD~1 git push --force-with-lease # 比 --force 更安全七、命令速查表7.1 高频命令速查git status # 查看状态 git add . # 暂存所有 git commit -m # 提交 git push # 推送 git pull # 拉取 git log --oneline # 查看历史 git diff # 查看差异 git branch # 查看分支 git checkout -b # 创建并切换 git merge # 合并 git stash # 暂存 git reset # 撤销 git revert # 反向提交7.2 极简工作流程# 日常开发 git pull # 拉取最新代码 git checkout -b feat/my-feature # 创建功能分支 # ... 开发代码 ... git add . # 暂存修改 git commit -m feat: add new feature # 提交 git push -u origin feat/my-feature # 推送 # 同步 main 最新代码 git checkout main git pull git checkout feat/my-feature git rebase main # 或 git merge main # ... 解决冲突如果有 ... git push --force-with-lease # 创建 PR 并合并后 git checkout main git pull git branch -d feat/my-feature # 删除本地分支7.3 .gitignore 通用模板# Python __pycache__/ *.py[cod] *.egg-info/ .venv/ venv/ # Node node_modules/ npm-debug.log* dist/ .next/ # IDE .vscode/ .idea/ *.swp *.swo # OS .DS_Store Thumbs.db # Environment .env .env.local # Build build/ dist/ *.exe *.dll *.so # Logs *.log logs/7.4 Git 内部原理简述.git/ ├── HEAD # 指向当前分支如 ref: refs/heads/main ├── config # 仓库配置 ├── objects/ # Git 对象数据库 │ ├── blobs/ # 文件内容 │ ├── trees/ # 目录结构 │ └── commits/ # 提交对象 ├── refs/ │ ├── heads/ # 本地分支 │ └── remotes/ # 远程分支 └── index # 暂存区二进制文件 学习路线阶段内容建议时间入门安装 基础命令add/commit/push/pull1-2 天基础分支 合并 远程仓库协作1 周进阶Rebase Cherry-pick Stash 冲突解决1 周高级Reflog Bisect Hooks 子模块持续学习 推荐资源官方文档Git SCM交互式学习Learn Git BranchingPro Git 书籍Git可视化工具GitHub Desktop, Sourcetree在线练习Oh My Git!核心思想Git 不是恶魔它只是记录历史多提交少后悔频繁提交是你的朋友公共历史不要改写私有历史随便整理reflog 是你的最后防线Happy Coding!