开发者必备 Git 命令速查表
· 12分钟阅读
Git 是现代软件开发的基石。无论你是独自工作还是与数百人的团队协作,掌握 Git 命令对于高效的版本控制和代码管理都至关重要。
这份全面的速查表涵盖了从基本操作到高级技巧的所有内容。收藏此页面,随时查阅所需的 Git 命令参考。
设置与配置
在开始使用 Git 之前,你需要配置你的身份和偏好设置。这些设置决定了 Git 的行为方式以及你的提交如何归属。
初始配置
在每台机器上运行一次这些命令来设置你的 Git 环境:
# 设置你的姓名和邮箱(必需)
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
# 将默认分支名称设置为 'main'
git config --global init.defaultBranch main
# 启用彩色输出以提高可读性
git config --global color.ui auto
# 设置你偏好的文本编辑器
git config --global core.editor "code --wait" # VS Code
git config --global core.editor "vim" # Vim
git config --global core.editor "nano" # Nano
# 查看所有配置设置
git config --list
# 查看特定配置
git config user.name
git config user.email
--global 标志将设置应用于你机器上的所有仓库。要为单个仓库配置设置,请导航到该仓库并省略 --global 标志。
配置级别
Git 有三个配置级别,每个级别都会覆盖前一个:
| 级别 | 标志 | 位置 | 作用域 |
|---|---|---|---|
| 系统 | --system |
/etc/gitconfig | 机器上的所有用户 |
| 全局 | --global |
~/.gitconfig | 当前用户的所有仓库 |
| 本地 | --local |
.git/config | 仅当前仓库 |
专业提示: 通过在每个仓库中设置本地配置,为工作和个人项目使用不同的邮箱地址。这可以防止意外使用错误的身份提交。
有用的配置选项
# 设置凭据缓存(避免重复输入密码)
git config --global credential.helper cache
git config --global credential.helper 'cache --timeout=3600'
# 启用自动换行符转换
git config --global core.autocrlf true # Windows
git config --global core.autocrlf input # Mac/Linux
# 为常用命令设置别名
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
# 配置合并和差异工具
git config --global merge.tool vimdiff
git config --global diff.tool vimdiff
基本 Git 命令
这些是你每天都会使用的基本命令。在进入高级操作之前先掌握这些。
仓库初始化
# 初始化新的 Git 仓库
git init
# 使用特定分支名称初始化
git init -b main
# 克隆现有仓库
git clone https://github.com/user/repo.git
git clone [email protected]:user/repo.git # SSH
git clone https://github.com/user/repo.git my-folder # 自定义文件夹名称
# 仅克隆最近的历史记录(对大型仓库更快)
git clone --depth 1 https://github.com/user/repo.git
处理更改
# 检查工作目录状态
git status
git status -s # 简短格式
git status -sb # 带分支信息的简短格式
# 暂存文件以供提交
git add filename.js # 单个文件
git add src/ # 整个目录
git add . # 当前目录中的所有更改
git add -A # 整个仓库中的所有更改
git add -p # 交互式暂存(补丁模式)
git add *.js # 所有 JavaScript 文件
# 取消暂存文件
git reset filename.js # 取消暂存特定文件
git reset # 取消暂存所有文件
# 提交暂存的更改
git commit -m "feat: add user authentication"
git commit -am "fix: resolve login bug" # 暂存 + 提交已跟踪文件
git commit --amend # 修改最后一次提交
git commit --amend --no-edit # 修改但不更改消息
# 查看差异
git diff # 未暂存的更改
git diff --staged # 已暂存的更改
git diff HEAD # 自上次提交以来的所有更改
git diff main..feature # 分支之间
git diff --stat # 更改摘要
快速提示: 使用 git add -p 交互式地审查和暂存更改。这非常适合仅提交文件的特定部分,同时保留其他更改未暂存。
删除和移动文件
# 删除文件
git rm filename.js # 从工作目录中删除并暂存删除操作
git rm --cached filename.js # 从 Git 中删除但保留在工作目录中
git rm -r directory/ # 递归删除目录
# 移动或重命名文件
git mv old-name.js new-name.js
git mv src/file.js lib/file.js # 移动到不同目录
当你使用 git mv 或 git rm 时,更改会自动暂存。这比使用常规 shell 命令然后单独暂存更改更方便。
分支与合并
分支是 Git 的杀手级功能。它们允许你同时处理多个功能,而不会干扰主代码库。
分支管理
# 列出分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支(本地 + 远程)
git branch -v # 带最后提交信息
git branch --merged # 已合并到当前分支的分支
git branch --no-merged # 尚未合并的分支
# 创建分支
git branch feature-login # 创建新分支
git checkout -b feature-login # 创建并切换到新分支
git switch -c feature-login # checkout 的现代替代方案
# 切换分支
git checkout main # 切换到 main 分支
git switch main # 现代替代方案
git checkout - # 切换到上一个分支
# 重命名分支
git branch -m old-name new-name # 重命名分支
git branch -M new-name # 强制重命名当前分支
# 删除分支
git branch -d feature-login # 删除已合并的分支
git branch -D feature-login # 强制删除(即使未合并)
git push origin --delete feature-login # 删除远程分支
合并策略
# 合并分支
git merge feature-login # 将 feature-login 合并到当前分支
git merge --no-ff feature-login # 即使快进也创建合并提交
git merge --squash feature-login # 将所有提交压缩为一个
# 中止合并
git merge --abort
# 解决冲突后继续
git merge --continue
| 合并类型 | 命令 | 何时使用 |
|---|---|---|
| 快进 | git merge |
线性历史,无分歧 |
| 非快进 | git merge --no-ff |
保留功能分支历史 |
| 压缩 | git merge --squash |
清理历史,合并所有提交 |
| 变基 | git rebase |
线性历史,重写提交 |
变基
变基通过将你的分支移动到新的基础提交来重写提交历史。这会创建更清晰的线性历史,但应谨慎使用。
# 将当前分支变基到 main
git rebase main
# 交互式变基(编辑、压缩、重新排序提交)
git rebase -i HEAD~3 # 最后 3 次提交
git rebase -i main # 自从从 main 分支以来的所有提交
# 解决冲突后继续
git rebase --continue
# 跳过当前提交
git rebase --skip
# 中止变基
git rebase --abort
专业提示: 永远不要变基已推送到共享分支的提交。变基会重写历史,这可能会给协作者带来严重问题。仅在推送前用于本地清理。
解决合并冲突
当 Git 无法自动合并更改时,你需要手动解决冲突:
- 运行
git status查看哪些文件有冲突 - 打开冲突文件并查找冲突标记(
<<<<<<<、=======、>>>>>>>) - 编辑文件以解决冲突,删除标记
- 使用
git add暂存已解决的文件 - 使用
git commit或git merge --continue完成合并
# 使用合并工具解决冲突
git mergetool
# 接受一方的所有更改
git checkout --ours filename.js # 保留你的版本
git checkout --theirs filename.js # 保留他们的版本
远程操作
远程仓库实现协作。这些命令帮助你将本地工作与 GitHub、GitLab 或 Bitbucket 等远程服务器同步。
管理远程仓库
# 列出远程仓库
git remote
git remote -v # 带 URL
# 添加远程仓库
git remote add origin https://github.com/user/repo.git
git remote add upstream https://github.com/original/repo.git
# 更改远程 URL
git remote set-url origin [email protected]:user/repo.git
# 删除远程仓库
git remote remove origin
# 重命名远程仓库
git remote rename origin upstream
# 显示远程详情
git remote show origin
获取和拉取
# 从远程获取更改(不合并)
git fetch origin
git fetch --all # 从所有远程获取
git fetch --prune # 删除已删除的远程分支
# 拉取更改(获取 + 合并)
git pull origin main
git pull --rebase origin main # 获取 + 变基而不是合并
git pull --ff-only # 仅快进,如果需要合并则失败
# 自动暂存拉取
git pull --autostash
fetch 和 pull 之间的区别很重要。Fetch 下载更改但不修改你的工作目录,而 pull 会自动合并更改。
推送更改
# 推送到远程
git push origin main
git push -u origin feature-login # 设置上游并推送
git push --all # 推送所有分支
git push --tags # 推送所有标签
# 强制推送(谨慎使用!)
git push --force # 覆盖远程历史
git push --force-with-lease # 更安全的强制推送,如果远程已更新则失败
# 删除远程分支
git push origin --delete feature-login
git push origin :feature-login # 替代语法
专业提示: 当需要强制推送时,使用 --force-with-lease 而不是 --force。如果自上次获取以来远程已更新,它可以防止你意外覆盖别人的工作。
跟踪分支
# 设置上游分支
git branch --set-upstream-to=origin/main main
git branch -u origin/main # 简写
# 创建跟踪分支
git checkout -b feature origin/feature
git checkout --track origin/feature # 自动命名
# 查看跟踪关系
git branch -vv
暂存更改
暂存会临时搁置更改,以便你可以处理其他事情而无需提交未完成的工作。
# 暂存当前更改
git stash
git stash save "work in progress on login feature"
git stash -u # 包括未跟踪的文件
git stash -a # 包括未跟踪和忽略的文件
# 列出暂存
git stash list
# 应用暂存的更改
git stash apply # 应用最近的暂存
git stash apply stash@{2} # 应用特定暂存
git stash pop # 应用并从暂存列表中删除
# 查看暂存内容
git stash show
git stash show -p # 显示完整差异
git stash show stash@{1} # 显示特定暂存
# 从暂存创建分支
git stash branch feature-name
# 删除暂存
git stash drop stash@{1} # 删除特定暂存
git stash clear # 删除所有暂存
暂存非常适合