Git 命令速查
命令列表
点行首图标复制起步与配置(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` 干净,适合交付源码包
命令里加绿底的是你填的值,纯绿字是示例值;本页不执行任何命令,复制到自己的仓库里运行。