在线工具集

Git 命令大全:从入门到团队协作

Git 已经成为现代软件开发的标准版本控制工具。无论你是独立开发者还是大型团队的一员,掌握 Git 都是必不可少的技能。从最基础的 commit 到复杂的 rebase,从单人开发到多人协作,本文通过系统的命令梳理和实战场景,帮你成为 Git 高手。

Git 基础概念回顾

在深入命令之前,理解 Git 的三个核心区域至关重要:

大多数 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 个提交

在编辑器中,你可以:

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(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 是适合大型团队和版本化软件的分支策略,定义了不同分支的用途:

典型工作流:

# 从 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 命令只是第一步,重要的是养成良好的开发习惯:写清晰的提交消息、使用有意义的分支名、定期推送备份、遵守团队规范。Git 的强大在于它的灵活性和撤销能力——大胆尝试新东西,因为几乎所有修改都可以恢复。最后,记住:如果不确定,先 commit 再折腾。