跳到主要内容

Git 命令速查

填一次,命令跟着变

命令列表

点行首图标复制
65 条

起步与配置(6)

  • git config --global user.name " wuqing "

    设置全局提交用户名(没配过时第一次 commit 会被拦住)

    只给当前仓库配就把 `--global` 换成 `--local`;三个作用域由近到远是 local > global > system,就近的说了算

  • git config --list --show-origin

    列出当前生效的全部配置,并标出每条来自哪个文件

    「我明明配了怎么不生效」先看这条:多半是同名配置被更近的作用域盖掉了

  • git init

    把当前目录初始化成一个 git 仓库(生成 `.git` 目录)

    `-b` 要 git 2.28+;不写就用 git 的默认分支名,跟随版本可能是 master 也可能是 main

  • git clone https://github.com/toolvcn/www.toolv.cn.git

    把远程仓库完整克隆到本地同名目录

    `--depth 1` 是浅克隆,体积小得多,但历史不完整、也不能直接切老提交(要补全历史得 `git fetch --unshallow`)

  • git clone -b main https://github.com/toolvcn/www.toolv.cn.git

    克隆时直接检出指定分支,不必先克隆再切换

    只写 `-b` 仍是完整克隆(所有分支都拉下来);再加 `--single-branch` 才只拉这一个分支

  • git config --global alias.st status

    给常用命令起别名,之后敲 `git st` 就等于 `git status`

    别名只是本机配置,不会跟着仓库走;换台机器要在那边重配一次

暂存与提交(9)

  • git status

    看工作区与暂存区各有哪些改动、当前在哪个分支

    红字是未暂存、绿字是已暂存;提交前扫一眼这条,能省掉大半「提交错东西」的后悔

  • git add .

    把当前目录下的全部改动加入暂存区(含新增与删除)

    被 `.gitignore` 忽略的文件不会被带上;新版 git 里 `git add .` 与 `git add -A` 等价

  • git add src/lib/tools.ts

    只暂存指定的文件(想把提交拆小、只提这一部分时用)

    通配也认,如 `git add "src/routes/*/README.md"`;路径带空格要加引号

  • git add -p

    交互式逐块挑选要暂存的改动(同一个文件也能只提一部分)

    每个 hunk 按键选择:`y` 暂存 / `n` 跳过 / `s` 再拆细 / `e` 手工编辑 / `q` 退出

  • git commit -m " fix(tools): 修首页卡片间距 "

    把暂存区的内容提交成一个新提交

    `-a` 只自动暂存**已跟踪**文件的改动,新建的文件仍要先 `git add` 一次

  • git commit --amend --no-edit

    把刚漏掉的文件补进上一次提交,提交信息不变

    **只对还没 push 的提交用**:amend 会换掉提交哈希,推送过的再 amend 就得强推

    谨慎
  • git diff

    看工作区相对暂存区的逐行改动

    `git diff` 只含未暂存部分;已经 `git add` 过的改动要用 `--staged` 才看得到

  • git rm --cached src/lib/tools.ts

    让文件停止被 git 跟踪,但保留在磁盘上

    典型场景:文件已经提交过才补 `.gitignore`,得先用这条让它退出跟踪,否则忽略规则对它无效

  • git restore --staged src/lib/tools.ts

    把文件移出暂存区,改动本身仍留在工作区

    老教程里的 `git reset HEAD <文件>` 是同一件事的旧写法

分支与合并(9)

  • git branch

    列出本地分支,当前分支前面带 `*`

  • git switch -c main

    新建一个分支并立即切过去

    `git switch` 是 git 2.23 引入的,只管切分支;`git checkout -b` 是等价的老写法(checkout 还兼管还原文件,容易混)

  • git switch main

    切换到已有分支

    有未提交改动且和新分支冲突时会拦住你 —— 先 commit 或 `git stash` 再切

  • git branch -d main

    删除已经合并过的本地分支

    `-d` 会拦住「还没合并」的分支,确认确实不要了再用 `-D`;删掉的提交并非立刻消失,还能从 `git reflog` 捞回来

    谨慎
  • git merge main

    把指定分支合并进当前分支

    冲突时先编辑冲突文件、`git add` 后再 `git merge --continue`;想整个放弃就 `git merge --abort`

  • git rebase main

    把当前分支的提交搬到目标分支之上,历史更平直

    **会改写提交哈希**:只对还没推到共享分支的本地提交用。`rebase -i` 里 `pick` / `squash` / `reword` / `drop` 可重排、合并、改信息

    谨慎
  • git cherry-pick 31d037b

    把某一个提交单独摘到当前分支(不等整条分支合并)

    摘过来的是**一个新的、哈希不同的提交**(内容相同);冲突处理与 merge 一样:解决后 `git add` + `git cherry-pick --continue`

  • git branch -m main

    重命名当前分支(不在分支上时要再给一个旧名参数)

    只改本地名字;远程那份要用 `push` 推新名 + `push --delete` 删旧名,别人才看不到旧分支

  • git branch --set-upstream-to= origin / main

    把本地分支与远程分支关联起来,之后 `git pull` / `git push` 可以不带参数

    关联关系存在本地配置里;`git branch -vv` 能看出每个分支在跟踪谁

远程与同步(8)

  • git remote -v

    列出已配置的远程仓库及其地址(fetch / push 各一行)

  • git remote add origin https://github.com/toolvcn/www.toolv.cn.git

    给本地仓库添加一个远程地址

    `origin` 只是约定俗成的名字;同一个仓库同时接 github / cnb / gitlab 很常见,起个能区分的名字即可

  • git fetch origin

    拉取远程更新到本地引用,但不动工作区与当前分支

    想先看看远程有什么新东西、又不想动自己的工作区,用这条最稳;`--prune` 会删掉本地那些远程已不存在的分支引用

  • git pull

    拉取远程更新并合并进当前分支(等于 fetch + merge)

    当前分支没设关联时,要连同远程名与分支名一起写,例如 `git pull origin main`

  • git push

    把本地提交推到远程(分支已有关联时这么写最省事)

    `-u` 只在首次需要:它把本地分支和 `remote/branch` 关联起来,之后直接 `git push` 就行

  • git push --force-with-lease

    安全强推:远程被别人更新过就直接拒绝

    只有「自己刚 rebase / amend 过、且确认没人基于这个分支干活」时才强推。`--force` 无条件覆盖远程,`--force-with-lease` 能挡住别人刚推上去的提交

    危险
  • git push origin --delete main

    删除远程分支

    这里删的只是远程那个引用;本地分支还在,要一起删用 `git branch -d`

    谨慎
  • git remote set-url origin https://github.com/toolvcn/www.toolv.cn.git

    修改远程地址(仓库迁移、https 换 ssh 最常用)

    从 https 换成 ssh 免密推送,就是改 `origin` 的地址;改完 `git remote -v` 核对一下

历史与查看(8)

  • git log --oneline --graph --decorate --all

    一行一条的提交图,带分支名与标签标记

  • git log --oneline -- src/lib/tools.ts

    只看某个文件的提交历史

    `--` 不能省:它把「文件名」和前面的分支 / 路径参数隔开,否则文件名会被当成分支名

  • git log --oneline --author=" wuqing "

    只看某个人提交的记录

  • git log --oneline --grep=" fix(tools): 修首页卡片间距 "

    按提交信息里的关键词找提交

    默认区分大小写,加 `-i` 忽略;只想搜某人的再加 `--author`

  • git show 31d037b

    看某次提交的完整信息与逐行改动

    `git show 提交:路径` 打印的是那次提交里该文件的整份内容,不是 diff

  • git blame src/lib/tools.ts

    逐行标出最后改这行的人与提交

    结果里带 `^` 的行是文件创建时就有的;大文件配 `-L` 限定范围,不然刷屏

  • git reflog

    看本机 HEAD 的移动记录(reset / rebase 丢提交时的救命稻草)

    默认保留 90 天。找到目标哈希后,`git branch <新分支名> <哈希>` 或 `git reset --hard <哈希>` 就能回去 —— 这也是删分支后的兜底

  • git shortlog -sn

    按提交数排名列出贡献者

撤销与回退(7)

  • git restore src/lib/tools.ts

    丢弃这个文件在工作区的改动,回到暂存区 / 提交里的样子

    **手动改的内容会直接没,且这条撤销不了**;老写法是 `git checkout -- <文件>`

    危险
  • git restore .

    丢弃所有未暂存的改动

    只影响未暂存的改动;已经 `git add` 的内容不受影响,要一起丢先 `git restore --staged .`

    危险
  • git reset --soft HEAD~1

    撤销最近一次提交,改动退回暂存区(重新组织后再提交)

    `--soft` 保留暂存、默认(mixed)退回工作区、`--hard` **连同改动一起丢**。已经 push 的提交别用 reset,改用 `git revert`

    谨慎
  • git revert 31d037b

    生成一个「反向提交」来抵消某次提交,不改写历史

    `revert` 不动已有历史,所以**推送过的提交也能安全撤销**;代价是历史里会多出一条提交

  • git restore --source= 31d037b -- src/lib/tools.ts

    把文件换成指定提交里的那份(旧版本内容覆盖到工作区)

    只改工作区、不自动暂存,可以放心看一眼再决定要不要 `git add`

  • git clean -fd

    删除工作区里所有未跟踪的文件与目录

    **`-f` 才是真的删、`-n` 只预览**。默认不动被 `.gitignore` 忽略的文件,加 `-x` 会连它们一起删(构建产物、本地配置都会没)

    危险
  • git reset --hard origin / main

    把本地分支硬重置成远程的样子,彻底与远程一致

    **本地未推送的提交与未提交的改动都会没**;执行前先确认 `git status` 干净,或先 `git stash` 存一份

    危险

暂存工作区(6)

  • git stash push -m " fix(tools): 修首页卡片间距 "

    把当前未提交的改动收进暂存栈,工作区恢复干净

    默认只收已跟踪文件的改动;新建的文件要加 `-u`(untracked)才会一起收进 stash

  • git stash list

    列出暂存栈里的每一条

    每条前面是 `stash@{n}`,越新的 n 越小;这串名字可以直接填进 `pop` / `apply` / `show`

  • git stash pop

    取出最近一条 stash 应用回来,并从栈里删掉它

    `pop` 取完就删(失败时不删);只想试一下、不确定要不要保留,用 `apply`

  • git stash show -p

    看最近一条 stash 里的具体改动

    默认只列文件、不显示 diff,加 `-p` 才展开逐行改动

  • git stash drop

    丢掉最近一条 stash

    被 drop 的 stash 不在任何分支上,只能用 `git reflog` 或 `git fsck --unreachable` 试着找回

    谨慎
  • git stash branch main

    用最近一条 stash 新建分支,并在新分支上把它应用出来

    典型场景:stash 里的改动和切过去的分支冲突,这条比直接 `pop` 省事 —— 应用完 stash 会自动出栈

标签与发布(5)

  • git tag v1.0.0

    在当前提交打一个轻量标签

    轻量标签只是一个指向提交的引用;要写说明、要挂签名就用 `-a`(附注标签),发布版本建议用后者

  • git tag -n

    列出所有标签,并带上每个标签的说明

    `--sort=-v:refname` 按版本号语义排序,`v1.10.0` 会正确排在 `v1.9.0` 前面(字典序会排反)

  • git describe --tags

    描述当前提交离最近的标签有多远,常用于生成版本号

    输出形如 `v1.0.0-5-g31d037b`:距最近标签 5 个提交、当前提交短哈希;CI 里常拿它当版本串

  • git push origin v1.0.0

    把某个标签推到远程

    `git push` **不会**顺手推标签,得显式推;一次推全部标签可能带上本地实验用的标签,注意筛选

  • git tag -d v1.0.0

    删除本地标签

    本地与远程的标签是**两份**,要分别删;`push --delete` 删的是远程那份

    谨慎

高级与排错(7)

  • git worktree add ../www.toolv.cn main

    把另一个分支检出到独立目录,同一仓库同时开两个分支干活

    比再 clone 一份省磁盘、共享同一套对象库;用完 `git worktree remove <目录>` 收尾,别直接 `rm -rf`

  • git submodule update --init --recursive

    补齐子模块内容(仓库带 submodule 时克隆后必跑)

    子模块目录克隆后是空的、只有一个 gitlink,就是这个命令没跑;clone 时加 `--recurse-submodules` 可免这步

  • git bisect start

    开始二分查找:定位是哪次提交引入了 bug

    流程:`start` → 标一个 `good` 与一个 `bad` → git 自动切到中间提交,反复标 good / bad → 查完 `git bisect reset` 回到原分支

  • git gc --prune=now

    清理并压缩仓库对象,回收 `.git` 占用的空间

    `--prune=now` 会**立刻**清掉不可达对象 —— 刚 `reset --hard` 丢掉的提交会彻底找不回;不确定就先不加这个参数

    谨慎
  • git fsck --lost-found

    扫描丢失的对象,把找到的悬空内容写进 `.git/lost-found/`

    兜底比 `git reflog` 更底层(reflog 过期后还能试它),代价是只得到一堆哈希,要自己 `git show` 认领

  • git check-ignore -v src/lib/tools.ts

    查一个文件是被哪条 `.gitignore` 规则忽略的

    输出会带「文件:行号:模式」,一眼看出是哪一层 gitignore 命中的;没被忽略则什么都不输出

  • git archive --format=zip -o release.zip v1.0.0

    把某个标签对应的代码打包成 zip(不含 `.git` 目录)

    导出的就是那份快照、与工作区无关;比 `git clone` 再删 `.git` 干净,适合交付源码包

命令里加绿底的是你填的值,纯绿字是示例值;本页不执行任何命令,复制到自己的仓库里运行。