Git 命令速查表

可搜索的 Git 速查表,覆盖初始化配置、日常提交循环、分支、远程仓库、历史查看与撤销恢复,每条命令均可一键复制。

四十九条值得记住的 Git 命令。 在命令名与说明中同时筛选,找到需要的一条直接复制。按初始化、日常工作流、分支、远程、历史与撤销分组整理。

读懂你每天都在用的 Git 命令

速查表的真正用途

Git 的常用命令有一百多个,但大多数工程师每天真正使用的只有二三十个,其余的一年也用不了几次。速查表并不能替代对 Git 模型的理解,它的价值在于:把你本来就懂的命令放在一次按键的距离内,而不是一个浏览器标签页加三条搜索结果之外。

本页的参考表按真实工作顺序分组:初始化仓库、每天要跑几十遍的提交循环、分支操作、与远程仓库交互、查看历史,以及出问题后的补救。在筛选框中输入内容,命令文本和说明会同时被搜索,因此输入「stash」「force」或「撤销」都能立刻定位到相关条目。每一行都带有复制按钮——毕竟手敲一条含 --force-with-lease 的命令,正是打错字的高发场景。

命令背后的心智模型

只要记住三个位置,几乎所有 Git 命令都能讲通。工作区是你在编辑器里看到的磁盘文件;索引(也叫暂存区)是你正在为下一次提交组装的快照;仓库则是已经记录下来、不可变的提交链。git add 把内容从工作区送进索引,git commit 把索引变成一次新提交,而 git restore 则把内容往回推。

第二个概念是分支,它比看上去简单得多:分支只是一个指向某次提交的可移动指针,HEAD 则指向你当前所在的分支。创建分支几乎零成本,因为它只写入一个包含 40 位哈希的小文件。正因如此,git switch -c 便宜到可以为一个五分钟的小试验专门开一个分支。

合并与变基都是在整合两个分支的工作,差别在于记录方式。合并保留双方历史并新增一次连接提交,忠实但会形成交织的图。变基则重写你的提交,让它们看起来像是直接写在对方分支之上,历史变成一条直线,但提交哈希会改变——这也正是「绝不要对别人已经拉取过的提交做变基」这条规矩的由来。

出问题时如何补救

关于 Git 最值得记住的一点是:它极少真正弄丢已提交的内容。只要改动在某个时刻被提交过,git reflog 就能给出哈希,再用 git switch -c rescue <hash> 即可找回。这张安全网覆盖了变基失败、提交后误执行 reset --hard,以及删得过于果断的分支。

真正危险的操作是那些触碰未提交内容的命令:git reset --hard、对已修改文件执行 git checkout --,以及 git clean -fd。这些改动从未被记录,reflog 自然也无从指向。值得养成的习惯是:在临时分支上尽早、频繁地提交,或者在试验前先 git stash push。事后被压缩掉的提交毫无成本,而一下午未提交的工作是找不回来的。

在共享分支上,优先使用 git revert 而不是重写历史,它会新增一次抵消旧改动的提交,别人的克隆仍然有效。--force-with-lease 请只用于自己的特性分支;它明显比裸的 --force 安全:如果远程在你上次 fetch 之后发生了移动,它会直接拒绝执行,而这恰恰是裸强推会悄无声息毁掉同事提交的情形。

自研实现。速查表本身只是纯数据,由少量原生 JavaScript 渲染与过滤;你输入的内容不会发送到任何地方。

常见问题

这些命令在 Windows、macOS 和 Linux 上都能用吗?
都能用。所有条目都是原生 Git 命令,在三个平台上行为一致,无论你使用 PowerShell、命令提示符、终端还是任意 Linux shell。可能感到差异的只有换行符处理(由 core.autocrlf 控制),以及含空格参数的引号写法。
git switch 和 git checkout 有什么区别?
git checkout 历史上承担了两件不相关的工作:切换分支和恢复文件。Git 2.23 把它们拆分为负责分支的 git switch 和负责文件的 git restore。checkout 仍然可用且未被废弃,但 switch 和 restore 语义更清晰,也更难误用。
什么时候该用变基而不是合并?
当你的特性分支尚未推送时,可以把它变基到最新的 main 上,让历史保持线性、便于代码评审。如果分支是共享的、提交已经推送,或者你希望历史如实体现两条并行开发线,就应该使用合并。
误删的提交要怎么找回?
执行 git reflog 查看 HEAD 曾经指向的所有位置,找到目标提交的哈希,然后运行 git switch -c rescue <hash>。无论提交是因变基失败、硬重置还是删除分支而丢失,只要垃圾回收尚未执行都能找回,通常至少有 30 天的窗口期。
git push --force-with-lease 真的比 --force 安全吗?
确实明显更安全。裸的 --force 会无条件覆盖远程分支;--force-with-lease 会先检查远程是否仍停在你上次 fetch 到的那次提交上,若期间有人推送则直接中止——而这正是强推会毁掉同事工作的场景。
我在筛选框里输入的内容会离开浏览器吗?
不会。速查表只是嵌在页面里的一小块数据,筛选逻辑是纯 JavaScript 字符串匹配。页面加载完成之后,不存在任何请求、埋点或服务端参与。