Git 命令大全:从入门到团队协作
Git 已经成为现代软件开发的标准版本控制工具。无论你是独立开发者还是大型团队的一员,掌握 Git 都是必不可少的技能。从最基础的 commit 到复杂的 rebase,从单人开发到多人协作,本文通过系统的命令梳理和实战场景,帮你成为 Git 高手。
Git 基础概念回顾
在深入命令之前,理解 Git 的三个核心区域至关重要:
- 工作区(Working Directory):你的本地文件夹,进行代码编辑的地方
- 暂存区(Staging Area / Index):临时存储已修改但未提交的文件
- 仓库区(Repository):提交历史的完整记录,分为本地和远程
大多数 Git 工作流就是在这三个区域之间移动:编辑文件(工作区)→ 暂存改动(暂存区)→ 提交历史(仓库区)→ 推送到远程。理解这个流程,后续的命令都会迎刃而解。
仓库初始化和克隆
git init — 初始化本地仓库
在现有项目目录中创建新的 Git 仓库:
git init # 当前目录变成 Git 仓库
git init my-project # 创建新目录并初始化为 Git 仓库 git clone — 克隆远程仓库
下载整个项目历史到本地:
git clone https://github.com/user/repo.git
git clone [email protected]:user/repo.git # 使用 SSH 暂存与提交
git add — 将文件添加到暂存区
准备文件以提交,可以逐个添加或添加所有修改:
git add src/app.js # 添加单个文件
git add src/ # 添加整个目录
git add -A # 添加所有修改(推荐:包括删除)
git add . # 添加当前目录修改(可能遗漏删除) git commit — 提交暂存区的文件
创建一个新的提交,永久记录更改:
git commit -m "feat: add user login" # 带消息的提交
git commit -am "fix: typo in README" # 自动暂存已跟踪文件并提交
git commit --amend # 修改最后一次提交 git status — 查看工作区状态
检查哪些文件被修改、暂存或未跟踪:
git status # 详细状态
git status -s # 简短格式 git diff — 查看改动内容
比较工作区和暂存区,或两个提交之间的差异:
git diff # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 最后一次提交
git diff main..feature # 两个分支的差异 分支管理
git branch — 列出和创建分支
查看所有分支,创建新分支:
git branch # 列出本地分支
git branch -a # 列出所有分支(包括远程)
git branch feature/user-auth # 创建新分支 git checkout — 切换分支(旧方法)
切换到另一个分支,创建并切换:
git checkout main
git checkout -b feature/new-api # 创建并立即切换到新分支 git switch — 切换分支(新方法,推荐)
更清晰的语法,相比 checkout 更直观:
git switch main
git switch -c feature/payment # 创建并切换 git merge — 合并分支
将一个分支的更改集成到当前分支:
git merge feature/user-auth # 快进或合并提交
git merge --no-ff feature/api # 强制创建合并提交 git rebase — 变基,改写历史
将当前分支的提交重新应用到另一个分支之上,创建更线性的历史:
git rebase main # 将当前分支变基到 main
git rebase -i HEAD~3 # 交互变基,编辑最后 3 个提交 git branch -d — 删除分支
删除已合并的分支,或强制删除:
git branch -d feature/old # 删除已合并分支
git branch -D feature/old # 强制删除(未合并) 查看历史
git log — 查看提交历史
查看谁何时做了什么更改:
git log # 详细提交历史
git log --oneline # 单行格式,简洁
git log --graph --all --decorate # 可视化分支历史 git show — 查看特定提交的详情
显示某个提交的完整改动:
git show HEAD # 显示最后一次提交
git show abc123ef # 显示指定提交 git blame — 逐行查看提交历史
找出每一行代码是谁、何时写的(调试的救星):
git blame src/main.js 撤销和恢复
git reset — 撤销暂存或重置提交
取消暂存文件,重置到之前的状态:
git reset HEAD file.js # 取消暂存单个文件
git reset --soft HEAD~1 # 撤销最后一次提交,保留更改
git reset --hard HEAD~1 # 彻底删除最后一次提交和更改 git revert — 创建新的提交来撤销更改
安全的撤销方式,不改写历史(推荐用于共享分支):
git revert HEAD # 撤销最后一次提交
git revert abc123ef # 撤销指定提交 git stash — 临时保存修改
快速保存工作区的未提交更改,切换到其他分支:
git stash # 保存当前修改
git stash pop # 恢复最后一次保存
git stash list # 列出所有保存
git stash drop # 删除保存 远程仓库操作
git remote — 管理远程仓库
查看和添加远程地址:
git remote -v # 显示所有远程仓库
git remote add origin https://github.com/user/repo.git
git remote set-url origin [email protected]:user/repo.git git push — 推送本地分支到远程
上传你的提交到远程仓库:
git push origin main # 推送 main 分支
git push -u origin feature/api # 推送并设置上游分支
git push --all # 推送所有分支 git pull — 拉取远程更新
下载远程更新并自动合并(git fetch + git merge):
git pull # 拉取默认分支
git pull origin main --rebase # 用 rebase 而不是 merge git fetch — 只下载,不合并
获取远程更新,但保留本地修改:
git fetch origin # 获取远程所有分支
git fetch --all # 获取所有远程的所有分支 标签和版本
git tag — 创建版本标签
为重要提交创建标签,通常用于版本发布:
git tag v1.0.0 # 轻量级标签
git tag -a v1.0.0 -m "Release 1.0" # 带注解的标签
git push origin v1.0.0 # 推送标签到远程 高级协作技巧
git cherry-pick — 复制指定提交
从一个分支选择特定提交应用到另一个分支:
git cherry-pick abc123ef # 复制单个提交
git cherry-pick main..feature # 复制一个范围内的提交 git rebase -i — 交互式变基
编辑、重新排序或压缩提交历史(在推送前非常有用):
git rebase -i HEAD~5 # 编辑最后 5 个提交 在编辑器中,你可以:
pick— 保留此提交reword— 保留提交,但编辑提交消息squash— 将此提交合并到前一个提交drop— 删除此提交
git submodule — 管理子仓库
在一个仓库中嵌入另一个仓库:
git submodule add https://github.com/user/lib.git libs/lib
git clone --recurse-submodules https://github.com/user/project.git 配置和别名
git config — 配置 Git
设置用户信息、默认编辑器等:
git config user.name "Your Name"
git config user.email "[email protected]"
git config --global user.name "Your Name" # 全局配置 创建常用别名提高效率:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.lg "log --graph --oneline --all" .gitignore 文件
告诉 Git 哪些文件不需要跟踪(如依赖、日志、密钥)。在项目根目录创建 .gitignore 文件:
# 依赖文件夹
node_modules/
.venv/
__pycache__/
# 构建输出
dist/
build/
# 环境变量
.env
.env.local
# 编辑器配置
.vscode/
.idea/
# 日志
*.log
logs/ 提交规范(Conventional Commits)
团队协作的关键是统一的提交消息格式。Conventional Commits 是业界推荐的标准:
<type>(<scope>): <subject>
<body>
<footer> 类型(type)包括:
feat— 新功能fix— 修复 bugdocs— 文档更新style— 代码格式(不影响逻辑)refactor— 代码重构test— 添加或修改测试chore— 依赖更新、工具配置等
示例:
feat(auth): add JWT token refresh endpoint
Implement automatic token refresh mechanism that:
- Checks token expiration before each API call
- Issues new token if expired
- Retries failed request with new token
Fixes #123 GitFlow 工作流
GitFlow 是适合大型团队和版本化软件的分支策略,定义了不同分支的用途:
- main(或 master):生产环境,每个提交都对应一个版本发布
- develop:开发环境,集成各功能分支
- feature/xxx:功能开发分支,从 develop 切出
- release/xxx:版本发布分支,用于修复发布前的 bug
- hotfix/xxx:紧急修复分支,从 main 切出用于生产环境紧急修复
典型工作流:
# 从 develop 创建功能分支
git switch -c feature/user-dashboard develop
# 开发完成后推送
git push -u origin feature/user-dashboard
# 在 GitHub 上发起 Pull Request
# 等待 review 和合并到 develop
# 发布新版本
git switch -c release/1.2.0 develop
# 修复版本相关问题
git merge release/1.2.0 main
git tag v1.2.0
# 紧急 bug 修复(仅生产环境)
git switch -c hotfix/critical-bug main
# 修复后合并回 main 和 develop 常见问题解决
问:不小心 git push 了错误的代码怎么办?
使用 git revert(推荐)或 git reset --hard + git push --force-with-lease。revert 更安全,因为它保留了历史记录。
问:如何撤销一个已推送的提交?
# 方案 1:使用 revert(推荐)
git revert abc123ef
git push
# 方案 2:强制推送(仅在共享前)
git reset --hard HEAD~1
git push --force-with-lease 问:合并时发生冲突怎么办?
Git 会在冲突文件中标记冲突部分(用 <<<<<<<、=======、>>>>>>> 分隔)。手动编辑文件解决冲突,然后:
git add resolved-file.js
git commit -m "resolve merge conflict" 问:如何恢复已删除的分支?
git reflog # 查看所有引用操作
git checkout -b recovered-branch abc123ef 性能提示
- 定期整理仓库:
git gc压缩对象数据库 - 使用浅克隆加快克隆:
git clone --depth=1 URL - 避免大文件提交: 使用 Git LFS(Large File Storage)
- 定期清理本地分支:
git branch --merged | grep -v "main" | xargs git branch -d
总结
掌握 Git 命令只是第一步,重要的是养成良好的开发习惯:写清晰的提交消息、使用有意义的分支名、定期推送备份、遵守团队规范。Git 的强大在于它的灵活性和撤销能力——大胆尝试新东西,因为几乎所有修改都可以恢复。最后,记住:如果不确定,先 commit 再折腾。