Git 是每个开发者的日常工具,但命令数量多、参数复杂,不常用的命令总是记不住。本文按使用场景分类整理了开发工作中最常用的 Git 命令,每条命令附说明和实际示例,可以直接当速查手册使用,遇到具体场景快速找到对应命令。
不想记命令? 如果你更习惯用自然语言解决问题——直接说"帮我把最近3次提交合并成一个"或"切到 main 分支然后拉取最新代码",EasyClaw 能理解你的意图并直接执行,不需要记任何命令格式。本地运行,安装即用。命令速查手册往下看,两种方式各取所需。
使用这份手册之前
本文不是 Git 入门教程,假设你已经理解 Git 的基本概念(仓库、分支、commit、暂存区)。
命令格式说明:
<必填参数> 用尖括号表示,需替换为实际内容
[可选参数] 用方括号表示,可以省略
# 后面是注释说明
一、仓库初始化与配置
# 在当前目录初始化新仓库
git init
# 克隆远程仓库到本地
git clone <仓库URL>
# 克隆并指定本地目录名
git clone <仓库URL> <目录名>
# 只克隆最近1条 commit 历史(浅克隆,适合大型仓库)
git clone --depth 1 <仓库URL>
# 设置全局用户名和邮箱(首次使用必须配置)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
# 查看所有配置项
git config --list
# 设置默认编辑器为 VS Code
git config --global core.editor "code --wait"
# 设置默认分支名为 main(新仓库)
git config --global init.defaultBranch main
二、日常提交操作
# 查看工作区状态(哪些文件被修改/新增/删除)
git status
# 将单个文件加入暂存区
git add <文件路径>
# 将所有改动加入暂存区
git add .
# 交互式选择文件的部分改动加入暂存区
git add -p
# 提交暂存区内容,并写提交信息
git commit -m "提交描述"
# 跳过暂存区,直接提交所有已追踪文件的改动
git commit -am "提交描述"
# 修改最近一次提交的信息(未 push 时使用)
git commit --amend -m "修正后的提交信息"
# 修改最近一次提交的内容(追加文件到上次 commit)
git add <遗漏的文件>
git commit --amend --no-edit
# 查看提交历史
git log
# 精简格式查看历史(一行一条)
git log --oneline
# 图形化显示分支历史
git log --oneline --graph --all
# 查看某个文件的修改历史
git log --follow -p <文件路径>
三、分支操作
# 查看所有本地分支(当前分支前有 * 号)
git branch
# 查看所有分支(含远程)
git branch -a
# 创建新分支
git branch <分支名>
# 切换到已有分支
git switch <分支名>
# 旧写法(同效果)
git checkout <分支名>
# 创建并切换到新分支
git switch -c <分支名>
# 旧写法
git checkout -b <分支名>
# 从指定 commit 创建新分支
git switch -c <分支名>
# 删除已合并的本地分支
git branch -d <分支名>
# 强制删除分支(未合并也删)
git branch -D <分支名>
# 重命名当前分支
git branch -m <新分支名>
# 合并指定分支到当前分支
git merge <分支名>
# 合并时禁止 fast-forward,保留合并提交记录
git merge --no-ff <分支名>
# 变基(rebase)当前分支到目标分支
git rebase <目标分支>
# 交互式变基,整理最近 N 条 commit
git rebase -i HEAD~
四、远程仓库操作
# 查看远程仓库信息
git remote -v
# 添加远程仓库
git remote add origin <仓库URL>
# 修改远程仓库 URL
git remote set-url origin <新URL>
# 删除远程仓库关联
git remote remove origin
# 拉取远程所有分支的最新信息(不合并)
git fetch
# 拉取并合并到当前分支(= fetch + merge)
git pull
# 拉取并变基(= fetch + rebase,历史更整洁)
git pull --rebase
# 推送当前分支到远程
git push
# 首次推送并建立追踪关系
git push -u origin <分支名>
# 推送所有本地分支
git push --all
# 强制推送(覆盖远程,危险操作,rebase 后使用)
git push --force-with-lease # 推荐,比 --force 更安全
git push --force # 不推荐,可能覆盖他人推送
# 删除远程分支
git push origin --delete <远程分支名>
# 推送本地标签到远程
git push origin <标签名>
git push origin --tags # 推送所有标签
五、撤销与回退
# 撤销工作区某文件的改动(恢复到最近一次 commit 状态)
git restore <文件路径>
# 旧写法
git checkout -- <文件路径>
# 从暂存区取消某文件(保留工作区改动)
git restore --staged <文件路径>
# 旧写法
git reset HEAD <文件路径>
# 回退到指定 commit(保留工作区改动,常用于撤销 commit 但保留代码)
git reset --soft HEAD~1 # 撤销最近1次 commit,改动回到暂存区
git reset --mixed HEAD~1 # 撤销最近1次 commit,改动回到工作区(默认)
git reset --hard HEAD~1 # 撤销最近1次 commit,改动完全丢弃(危险)
# 生成一个"撤销提交"的新 commit(用于已 push 的提交,不改历史)
git revert
# 撤销最近一次 merge
git merge --abort # merge 过程中取消
git reset --hard ORIG_HEAD # merge 完成后回退(未 push)
六、暂存(stash)
# 暂存当前工作区所有改动
git stash
# 暂存并附加描述
git stash push -m "描述信息"
# 暂存包括未追踪文件
git stash -u
# 查看所有暂存列表
git stash list
# 恢复最近一次暂存(保留 stash 记录)
git stash apply
# 恢复指定暂存
git stash apply stash@{2}
# 恢复最近一次暂存并删除记录
git stash pop
# 删除指定暂存记录
git stash drop stash@{1}
# 清空所有暂存
git stash clear
七、标签(tag)
# 查看所有标签
git tag
# 创建轻量标签
git tag <标签名>
# 创建附注标签(推荐,包含元数据)
git tag -a <标签名> -m "标签说明"
# 为历史 commit 打标签
git tag -a <标签名>
# 查看标签详情
git show <标签名>
# 删除本地标签
git tag -d <标签名>
# 删除远程标签
git push origin --delete <标签名>
八、差异比较
# 查看工作区与暂存区的差异
git diff
# 查看暂存区与最近一次 commit 的差异
git diff --staged
# 比较两个分支的差异
git diff <分支A>..<分支B>
# 比较某个文件在两个 commit 间的差异
git diff
# 统计改动文件数和行数(不显示具体内容)
git diff --stat
九、查找与调试
# 在所有文件中搜索字符串
git grep "搜索内容"
# 查看某行代码最后是谁在哪次 commit 中改的
git blame <文件路径>
# 二分法找出引入 Bug 的 commit
git bisect start
git bisect bad # 标记当前 commit 有 Bug
git bisect good
# Git 自动切换到中间 commit,测试后标记 good/bad,直到找到问题 commit
git bisect reset # 结束 bisect
# 找回误删的 commit 或 stash
git reflog
十、子模块(submodule)
# 添加子模块
git submodule add <仓库URL> <路径>
# 初始化并拉取所有子模块
git submodule update --init --recursive
# 更新所有子模块到远程最新版本
git submodule update --remote
# 克隆仓库时同时初始化子模块
git clone --recurse-submodules <仓库URL>
十一、实用别名配置(一次配置,长期受益)
将以下配置加入 ~/.gitconfig 的 [alias] 段:
[alias]
st = status
co = checkout
sw = switch
br = branch
ci = commit
lg = log --oneline --graph --all --decorate
undo = reset --soft HEAD~1
unstage = restore --staged
aliases = config --list | grep alias
配置后可以用 git lg 代替 git log --oneline --graph --all --decorate,大幅提升命令行效率。
高频使用场景快查
场景
命令
临时保存进度去修 Bug
git stash → 修完 → git stash pop
撤销最近一次未推送的 commit
git reset --soft HEAD~1
把某个 commit 的改动应用到当前分支
git cherry-pick
查看是谁改了这行代码
git blame <文件>
找出引入 Bug 的具体 commit
git bisect start/good/bad
删除已合并到 main 的本地分支
git branch --merged main | grep -v main | xargs git branch -d
强制让本地分支和远程一致
git fetch origin && git reset --hard origin/<分支名>
常见问题
Q1:git pull 和 git fetch 有什么区别?
git fetch 只下载远程的最新信息,不修改本地工作区和分支。git pull = git fetch + git merge(或 rebase),会自动将远程改动合并到当前分支。日常开发中推荐先 fetch 查看远程有哪些变化,再决定如何合并,而不是直接 pull。
Q2:git reset --hard 之后能找回丢失的 commit 吗?
可以,在 30 天内。用 git reflog 找到被重置前的 commit hash,然后 git checkout
Q3:merge 和 rebase 应该用哪个?
merge 保留完整的分支历史,产生一个 merge commit;rebase 重写提交历史让其线性,历史更整洁但会修改已有 commit 的 hash。基本原则:已推送到远程的 commit 不要 rebase(会给协作者造成麻烦),本地未推送的 commit 可以自由 rebase 整理。
Q4:.gitignore 添加了文件但还是被追踪了,怎么办?
.gitignore 只对未被追踪的文件生效。如果文件已经被 Git 追踪,需要先从追踪中移除:git rm --cached <文件路径>,然后再 commit 这次变更,之后 .gitignore 才能生效。
Q5:如何同时管理多个 GitHub/GitLab 账号的 SSH Key?
在 ~/.ssh/config 中为不同账号配置不同的 Host 别名和对应私钥,然后在每个仓库的 remote URL 中使用对应的 Host 别名(如 git@github-work:company/repo.git),实现多账号共存。
嫌命令太多记不住?试试用自然语言直接编程
上面这些命令覆盖了 Git 的大多数使用场景,但对于不常写代码、或者只是偶尔需要用 Git 管理文件的人来说,记命令本身就是一道门槛。
如果你想直接用说话的方式完成编程和代码管理,EasyClaw 提供了自然语言编程能力——不需要记 git rebase -i HEAD~3 这样的命令,直接告诉它"帮我把最近3次提交合并成一个",它会理解你的意图并完成操作。
EasyClaw 自然语言编程能做什么:
Git 操作:用说话的方式执行分支创建、合并、回退、变基等操作,不需要记命令参数
代码生成与修改:描述你想要的功能,直接生成对应代码,或对现有代码进行解释和重构
错误排查:把报错信息告诉它,它会分析原因并给出修复方案
项目脚手架:说一句"帮我初始化一个 React 项目并配置 ESLint",自动完成一系列操作
对于已经熟悉 Git 命令的开发者,本文的速查手册是提效工具;对于想降低编程门槛、让 AI 直接帮你处理代码和版本管理的场景,EasyClaw 是值得试试的选择,本地运行,安装即用。
【AI辅助创作声明:本文由 AI 辅助整理与撰写,内容已经过人工审校与调整。】