跳到主要内容

Git 常用命令 25 条 + 5 个保命撤销技巧 - 程序员每天都用到的

不是 200 条全收的命令大全。只列我自己一周内真的输了 N 次的 25 条,加 5 个事故现场救命撤销。看完直接拿去用。

发布于 作者 李雷
#git #developer #tutorial

Git 常用命令 25 条 + 5 个保命撤销技巧 - 程序员每天都用到的

我入行 8 年,Git 命令应该敲过 30 万次。但说实话日常真用的也就是固定那 20 多条,剩下的 95% 命令我都是"用的时候 Google 一下"。

这篇不堆 200 条全清单。我打开自己 .zsh_history 拉过去 6 个月所有 git 开头的命令,统计了一下,实际高频就 25 条。这篇就把这 25 条 + 5 个事故救命的撤销姿势讲清楚。

每天都用 (top 10)

git status                          # 看当前修改了什么、哪些文件还没 add
git diff                            # 看具体改了什么 (未 staged 部分)
git diff --cached                   # 看已经 add 但还没 commit 的部分
git add <file>                      # add 单个文件 (尽量不用 git add .)
git commit -m "feat: xxx"           # 提交,m 后面带消息
git pull                            # 拉远端最新
git push                            # 推到远端
git log --oneline -20               # 看最近 20 条提交记录,一行一条
git checkout -b feat/new-thing      # 新建分支并切过去
git branch                          # 看本地所有分支

git status 是我用得最多的命令,平均每个开发日 50 次以上。它就是 Git 的"我在哪",哪怕你已经知道答案也建议养成习惯每次操作前看一眼。

git diff 配合 git status 是 commit 前的 review。提交之前你应该完整看一遍 diff,确认没有把调试用的 console.log 一起提交进去。

分支管理 (top 11 到 18)

git checkout main                   # 切到 main 分支
git switch main                     # 同上,新版命令,推荐
git switch -c feat/xxx              # 新建并切换,等价于 git checkout -b
git branch -d feat/old              # 删本地分支(已合并的)
git branch -D feat/old              # 强删本地分支(未合并的也删)
git push origin feat/xxx            # 第一次推新分支到远端
git push -u origin feat/xxx         # 推并建立 tracking
git fetch --all --prune             # 拉所有远端分支信息,清理本地已删除的

switchcheckout 的关系: switch 是 Git 2.23 之后引入的新命令,专门做分支切换,语义更清晰。checkout 历史上被塞了太多功能 (切分支、检出文件、新建分支)。新代码推荐用 switch + restore 这一对。

--prune 是个好习惯。你的本地经常会残留一堆其实远端已经删掉的分支 tracking 信息,定期 fetch 时带 prune 清理,跑 git branch -r 看远端分支列表才不会眼花。

合并 / rebase (top 19 到 22)

git merge feat/xxx                  # 把 xxx 分支合并到当前分支
git rebase main                     # 把当前分支变基到 main 最新
git rebase -i HEAD~3                # 交互式 rebase 最近 3 个 commit (合并/改信息)
git cherry-pick <hash>              # 把指定 commit 摘到当前分支

merge 和 rebase 哪个好,网上能吵 100 楼。我自己的实践:

  • 公共分支 (main, develop): 严禁 rebase,只能 merge
  • 个人 feature 分支: rebase 让历史更线性,review 的人看得舒服
  • PR 合并到 main: 用 squash merge,一个 feature 一个 commit

rebase -i HEAD~3 是必须掌握的技能。提交之前合并几个"修复 typo""调样式""加注释"的小提交,让历史干净。一个 PR 留 1 到 3 个有意义的 commit,而不是 20 个零碎修改。

stash 和 reset (top 23 到 25)

git stash                           # 临时存起当前未提交修改
git stash pop                       # 取回最近一次 stash
git reset HEAD <file>               # 把 add 进去的文件取消 add (回到 working tree)

stash 的典型场景: 你在 feature/a 上写到一半,产品突然说有个 main 的 bug 要紧急修。这时候你不能直接切分支 (会带着未提交的修改),做法是:

git stash
git switch main
# 修 bug, commit, push
git switch feat/a
git stash pop

刚刚的修改完整回来,继续干活。

5 个保命撤销技巧

事故现场,深呼吸,按下面操作。

1. 刚 commit 完发现写错了消息

git commit --amend -m "正确的消息"

注意: 只能改还没 push 的 commit。已 push 的不要 amend。

2. 刚 commit 完发现少加了一个文件

git add <missing-file>
git commit --amend --no-edit

--no-edit 表示用原来的消息,把刚才落下的文件并到上一个 commit 里。

3. 误删了一个本地分支

git reflog                          # 找到删除前最后一个 commit 的 hash
git checkout -b feat/recovered <hash>

reflog 是 Git 的后悔药,记录了你本地所有 HEAD 变动。30 天内删过的东西都能找回。

4. git reset --hard 误删了本地未提交修改

这个最惨,因为未提交的修改 reflog 也救不回。正确预防: 危险操作前先 git stash 一下,等于自动备份。

如果真的丢了,试试:

git fsck --lost-found

可能能找回被悬空的 blob 对象,然后挑出来。但需要你认得自己代码长什么样。

5. push --force 覆盖了同事的提交

下次记住用:

git push --force-with-lease

这个加了一道防线: 如果远端在你 fetch 之后又被别人推了新 commit,这条命令会拒绝你强推。比 --force 安全 10 倍。

配置一个好用的 alias

我 .gitconfig 里这几条 alias 用了 5 年:

[alias]
    s = status
    co = checkout
    sw = switch
    br = branch
    cm = commit -m
    lg = log --oneline --graph --decorate -20
    last = log -1 HEAD
    unstage = reset HEAD --

之后你敲 git s 就是 git status,git lg 一行带分支图看最近 20 条。手指头能省不少。

想要更全的 cheatsheet 收藏

这 25 条是我个人高频。但实际项目里你总会遇到边缘情况 (submodule、worktree、bisect)。我把这些都整理到了 git-cheatsheet,浏览器加书签随时翻。

如果你也用 Docker,docker-cheatsheet 同样列了我每天用的 30 多条容器命令。Vim 党可以收 vim-cheatsheet,Bash 党收 bash-cheatsheet

一句话总结

Git 不需要背 200 条命令。25 条够你跑完 95% 的日常,5 个撤销姿势够你在出事时不慌。

git-cheatsheet 放在 Chrome 书签栏第一格,下次出事打开就在。


Made by Toolora · Updated 2026-05-26