配置与身份:config、作者信息、默认行为仓库入口:仓库初始化、克隆和远端配置看状态:工作区、暂存区和提交差异做提交:暂存、提交、补提和改写上一条提交分支协作:分支创建、切换、合并、变基同步远端:抓取、拉取、推送救现场:临时寄存、并行工作树、恢复、重置、reflog排障发布:日志、追责、二分、标签、补丁搬运git config --global user.name "Your Name":设置全局作者名git config --global user.email "you@example.com":设置全局作者邮箱git config --local user.email "team@example.com":只改当前仓库本地配置git config --global --list:查看当前生效配置git config --show-origin --list:连配置来源文件一起看git config --list --show-scope:显示配置作用域(global/local/system)git config --edit:编辑全局配置git config --global --unset user.name:删除某项配置git config --global --unset-all:删除某项所有配置git config --global core.editor "code --wait":设置提交信息编辑器git config --global --edit:编辑配置文件git config --global core.autocrlf true:Windows 自动转换 CRLFgit config --global core.autocrlf input:Unix/Mac 保留 LFgit config --global init.defaultBranch main:新仓库默认分支用 maingit config --global pull.rebase false:pull 默认走 mergegit config --global pull.rebase true:pull 默认走 rebasegit config --global rebase.autoStash true:rebase 前自动 stash 工作区git config --global fetch.prune true:fetch 时顺手清理已删除远端分支git config --global push.autoSetupRemote true:首次推分支自动建立 upstreamgit config --global alias.st "status -sb"
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.unstage "restore --staged --"
git config --global alias.visual "log --oneline --graph"
git config --global alias.amend "commit --amend --no-edit"git init:初始化普通仓库git init --bare repo.git:初始化裸仓库(无工作区)git init -b main:初始化并设置默认分支为 main(Git 2.28+)git init --initial-branch=main:同上,完整写法git clone <url>:克隆完整仓库到当前目录git clone <url> <dir>:克隆到指定目录git clone -b <branch> <url>:克隆并直接切到指定分支git clone --depth 1 <url>:浅克隆,仅拉最近历史git clone --depth 1 <url> --branch <tag>:浅克隆指定 taggit clone --filter=blob:none <url>:部分克隆,只下载必要对象git clone --single-branch <url>:只克隆单个分支历史git clone --no-checkout <url>:克隆但不检出任何分支git clone --recurse-submodules <url>:克隆时递归拉子模块git remote -v:查看远端列表(含 URL)git remote add origin <url>:添加远端git remote set-url origin <new-url>:修改远端地址git remote rename origin upstream:重命名远端git remote remove origin:删除远端git remote show origin:查看远端详细信息git remote prune origin:清理已删除的远端分支引用git remote get-url origin:只看远端 URLgit remote set-url origin <url> --push:只修改 push URLgit rev-parse --show-toplevel:看仓库根目录git rev-parse --git-dir:看 .git 目录位置git remote get-url --push origin:查看 push URLgit status:查看完整状态git status -sb:简洁状态,最常用git status --short:同 -s,简洁格式git status -u:显示未跟踪文件详情git status --ignored:同时显示被忽略的文件| git status -s 标记 | 含义 |
|---|---|
| M | 已修改(工作区) |
| MM | 已修改并已暂存 |
| A | 新增(已暂存) |
| D | 删除(已暂存) |
| R | 重命名 |
| ?? | 未跟踪文件 |
| !! | 被忽略的文件 |
git diff:工作区 vs 暂存区git diff --staged:暂存区 vs HEADgit diff HEAD:工作区整体 vs HEADgit diff <commit>:工作区 vs 指定提交git diff <commit> <commit>:两提交对比git diff <branch> <branch>:两分支对比git diff --stat:只看变更统计git diff --name-only:只看改了哪些文件git diff --name-status:显示 A/M/D 等状态git diff --compact-summary:显示文件统计摘要git diff -w:忽略空白字符差异git diff --exit-code:相同返回 0,不同返回 1git diff -b:忽略空白字符数量变化git add <file>:暂存指定文件git add .:暂存当前目录下新增和修改git add -A:暂存所有改动,包括删除git add -u:只暂存已跟踪文件的改动git add -p:交互式按块暂存git add -N <file>:标记文件为 intent-to-add(后续可单独 commit)git add -v:显示详细操作信息git add --dry-run <file>:预览但不实际暂存git restore <file>:丢弃工作区未暂存修改git restore --staged <file>:取消暂存,保留工作区内容git restore -S <file>:同 --stagedgit restore --source=HEAD~1 <file>:从指定提交恢复文件git restore --source=HEAD -- path/to/file:恢复到 HEAD 版本git checkout -- <file>:丢弃工作区修改(老写法)git checkout <branch> -- <file>:从某分支恢复文件到工作区git commit -m "feat: ...":创建提交git commit -am "fix: ...":已跟踪文件可直接 add+commitgit commit --amend:修改最近一次提交git commit --amend --no-edit:不改 message,只补内容git commit --amend -m "new message":改 messagegit commit --allow-empty -m "chore: trigger":建一个空提交git commit --dry-run:预览提交结果,不实际提交git commit --verbose:显示提交详情git commit --signoff:添加 Signed-off-by 行git commit -S<GPG-key>:GPG 签名提交git commit --fixup <commit>:创建 fixup 提交(需配合 --autosquash)git commit --squash <commit>:创建 squash 提交git commit --no-verify:跳过 hook 验证git log:标准历史git log --oneline:单行简洁格式git log --oneline --graph:图形化分支历史git log --oneline --graph --decorate:加分支名装饰git log --oneline --graph --decorate --all:显示所有分支git log -n 20:只看最近 20 条git log --stat:连文件统计一起看git log -p:连 patch 一起看git log -p <file>:看某文件的改动历史git log --author="name":按作者筛选git log --since="2 weeks ago":按时间筛选git log --until="2024-01-01":截止时间git log --after="2024-01-01":起始时间git log -- <path>:只看某文件/目录历史git log --follow <file>:追踪文件重命名历史git log --diff-filter=M -- <path>:只显示 M(修改)的提交git log --diff-filter=A -- <path>:只显示 A(新增)的提交git log --grep="keyword":按提交 message 搜索git log --format="%h %an %s":自定义输出格式git log --name-only:只显示变更文件名git log --name-status:显示变更文件的状态(A/M/D)git show <commit>:看某次提交的 patchgit show <commit> --stat:看提交统计git show <commit>:path/to/file:看某次提交里的文件内容git show :/<message>:通过 message 找提交git shortlog:按作者分组统计提交数git shortlog -sn:只显示提交数和作者名git shortlog --since="2 weeks ago":按时间筛选git describe:输出版本描述(基于最近 tag)git describe --tags:基于所有标签git describe --always:即使没有 tag 也显示git describe --abbrev=7:缩短 commit hash 长度git branch:列本地分支git branch -a:列本地 + 远端分支git branch -r:只列远端分支git branch <name>:创建分支git branch -m <new-name>:重命名当前分支git branch -m <old> <new>:重命名指定分支git branch -d <name>:删除已合并分支git branch -D <name>:强制删除分支git branch -f <branch> <commit>:强制重置分支到某提交git branch -l <branch>:创建并开启 refloggit branch -vv:查看分支追踪关系git branch --track <branch> origin/main:创建追踪分支git branch --no-track <branch>:不追踪远程分支git branch --contains <commit>:检查某提交在哪些分支git branch --merged:显示已合并到当前分支的git branch --no-merged:显示未合并到当前分支的git switch <branch>:切换分支git switch -c <branch>:创建并切换git switch -C <branch>:强制创建并切换(覆盖)git switch -:回到上一个分支git switch --orphan <branch>:创建孤儿分支(无历史)git switch --detach <branch>:以 detached HEAD 状态检出git checkout <branch>:切换分支git checkout -b <branch>:创建并切换git checkout --detach <branch>:detached HEAD 状态检出git checkout -:回到上一个分支git merge <branch>:合并指定分支git merge --no-ff <branch>:即使能快进也创建 merge commitgit merge --ff <branch>:只做快进,不创建 commitgit merge --squash <branch>:压扁所有提交为一个 merge commitgit merge --abort:放弃当前合并git merge --continue:冲突解决后继续合并git merge --no-commit <branch>:合并但不自动提交(保留工作进度)git merge -m "message":指定 merge commit messagegit merge --edit:合并后编辑 messagegit merge --no-edit:不编辑,自动完成git rebase <branch>:把当前分支变基到目标分支git rebase -i HEAD~5:交互式整理最近 5 个提交git rebase -i <branch>:交互式整理从分叉点至今的提交git rebase --onto <new> <old>:从 old 变基到 newgit rebase --continue:冲突解决后继续git rebase --abort:取消本次 rebasegit rebase --skip:跳过当前提交git rebase --autosquash:自动应用 fixup/squash 标记git rebase --no-autosquash:禁用自动 squashgit rebase -p:保留 merge commit(不推荐)git rebase -x <cmd>:每个提交执行命令| rebase -i 动作 | 效果 |
|---|---|
| pick | 保留提交 |
| reword | 只改提交说明 |
| edit | 停下来手动修改 |
| squash | 合并,保留说明 |
| fixup | 合并,丢弃说明 |
| drop | 删除提交 |
git fetch:拉取所有远端更新到本地跟踪分支git fetch origin:只从 origin 拉取git fetch origin main:只拉某远端某分支git fetch --prune:同步并清理已删除远端分支git fetch --tags:拉取所有标签git fetch --no-tags:不拉取标签git fetch --depth=10:限制拉取深度git fetch --deepen=10:深化浅克隆git fetch --unshallow:把浅克隆转完整git fetch --all:拉取所有远端git fetch origin +<branch>:强制更新分支git pull:fetch + mergegit pull --ff-only:只允许快进,有冲突则失败git pull --rebase:fetch + rebasegit pull --no-rebase:强制 mergegit pull --autostash:rebase 前自动 stashgit pull --no-autostash:禁用自动 stashgit pull --edit:拉取后编辑 commit messagegit pull --no-edit:不编辑,自动完成 mergegit push:推到默认 upstreamgit push origin <branch>:推指定分支git push -u origin <branch>:首次推并建立 upstreamgit push --set-upstream-to=origin/main:修改上游分支git push --force-with-lease:安全强推git push --force-with-lease origin <branch>:对指定分支安全强推git push --force:强制推送(危险)git push --tags:推送所有标签git push origin --delete <branch>:删除远端分支git push -d origin <branch>:同上,简写git push --dry-run:预览推送结果git push --follow-tags:推送时自动推送关联标签git push --atomic:原子性推送(全部成功或全部失败)git push origin +main:强制推送(覆盖远端 main)git remote show origin:查看远端详细信息git stash:快速寄存当前工作git stash push -m "wip: xxx":带说明寄存git stash push -u:连未跟踪文件一起寄存git stash push --staged:只寄存 staged 的部分git stash -k:寄存并保持暂存区不变git stash --keep-index:同 -kgit stash list:查看 stash 列表git stash show:查看最近一条 stash 统计git stash show -p stash@{0}:看 stash patchgit stash apply:应用但不删除git stash apply stash@{1}:应用指定 stashgit stash pop:应用并删除最近 stashgit stash pop stash@{2}:应用并删除指定 stashgit stash drop stash@{0}:删除一条 stashgit stash clear:清空所有 stashgit stash branch <name>:从 stash 创建新分支git worktree list:列出所有 worktreegit worktree list --porcelain:机器友好的输出格式git worktree add <path> -b <branch>:新目录 + 新分支git worktree add <path> -b <branch> origin/main:基于远端分支创建git worktree add <path> <commit>:检出到具体 commitgit worktree remove <path>:安全删除(检查未提交变更)git worktree remove --force <path>:强制删除git worktree remove <path> --reason "...":记录删除原因(2.40+)git worktree lock <path> -m "reason":锁定防止修改/删除git worktree unlock <path>:解除锁定git worktree move <old> <new>:移动 worktree 目录(2.40+)git worktree prune:清理失效 worktree 引用git worktree repair:修复 worktree 配置错误git reset --soft HEAD~1:撤销最近提交,保留 stagedgit reset --mixed HEAD~1:撤销最近提交,改动回工作区git reset --hard HEAD~1:彻底回滚到上一提交(危险)git reset --soft <commit>:重置到指定提交git reset --mixed <commit>:默认行为git reset --hard <commit>:危险git reset HEAD -- <file>:取消暂存某文件git reset --merge HEAD~1:重置并保留 merge 状态| reset 模式 | HEAD | 暂存区 | 工作区 |
|---|---|---|---|
| --soft | 回退 | 保留 | 保留 |
| --mixed | 回退 | 重置 | 保留 |
| --hard | 回退 | 重置 | 重置 |
git revert <commit>:新建反向提交,回滚指定提交git revert -n <commit>:回滚但不自动提交git revert --no-edit:不编辑 messagegit revert -m 1 <merge-commit>:回滚 merge commitgit reflog:查看本地引用移动历史git reflog --date=relative:显示相对时间git reflog --all:查看所有引用的 refloggit reflog expire:清理过期的 reflog 条目git reflog show HEAD:只看 HEAD 的 refloggit tag:列所有标签git tag -l "v1.*":列出匹配模式的标签git tag --list "v1.*":同 -lgit tag -a v1.0.0 -m "release: v1.0.0":创建附注标签git tag -a v1.0.0 <commit>:给指定提交打标签git tag -s v1.0.0 -m "signed":创建 GPG 签名标签git tag -d v1.0.0:删除本地标签git tag --delete v1.0.0:同 -dgit tag -v v1.0.0:验证签名标签git tag --points-at <commit>:显示某提交上的所有标签git tag --sort=version:refname:按版本排序git push origin v1.0.0:推单个标签git push origin --delete v1.0.0:删除远端标签git push --tags:推所有标签git push origin --follow-tags:只推带注释的标签git cherry-pick <commit>:摘一条提交到当前分支git cherry-pick -x <commit>:保留来源信息git cherry-pick -n <commit>:摘取但不要自动提交git cherry-pick --no-commit <commit>:同 -ngit cherry-pick --quit:放弃继续 cherry-pickgit cherry-pick --continue:解决冲突后继续git cherry-pick --abort:取消并恢复到之前状态git cherry-pick <commit-A>..<commit-B>:摘取 A 到 B 之间的所有提交(不含 A)git cherry-pick <commit-A>^..<commit-B>:摘取 A 到 B 之间的所有提交(含 A)git blame <file>:看每行最后修改提交git blame -L <start>,<end> <file>:只看指定行范围git blame -l:显示完整 commit hashgit blame -t:显示时间戳git blame --ignore-rev <commit>:忽略某次修订的修改git blame --ignore-revs-file <file>:从文件读取忽略列表git grep "keyword":在仓库里搜索git grep -n "keyword":显示行号git grep -c "keyword":显示每个文件的匹配数git grep -l "keyword":只显示文件名git grep -i "keyword":忽略大小写git grep -v "keyword":反向匹配git grep -E "pattern":扩展正则git grep -G "pattern":基本正则git grep --name-only:只显示文件名git grep --count:同 -cgit grep -p <pattern> -- <path>:只在指定路径搜索git grep -W:显示匹配的完整单词git bisect start:开始二分定位git bisect good <commit>:标记好版本git bisect bad <commit>:标记坏版本git bisect bad:默认 HEAD 为坏版本git bisect reset:结束二分git bisect skip:跳过当前提交git bisect --first-parent:只沿第一父链搜索git bisect --no-checkout:不检出,直接指定 good/badgit clean -fdn:预览将删除的未跟踪文件git clean -fd:删除未跟踪文件和目录git clean -n:同 --dry-run,预览git clean --dry-run:预览但不删除git clean -f:删除未跟踪文件git clean -df:删除文件和目录git clean -x:包含被 .gitignore 忽略的文件git clean -X:只删除被忽略的文件git clean -q:静默模式git clean -e <pattern>:排除匹配的文件# 常见 .gitignore
node_modules/
dist/
.env.local
*.log
coverage/
.DS_Store
*.swpgit check-ignore -v <file>:看某文件为什么被忽略git add -f <file>:强制添加被忽略的文件git archive HEAD --format=zip -o repo.zip:导出当前源码快照git archive --format=tar.gz HEAD -o repo.tar.gz:导出 tar.gzgit archive v1.0.0 | tar -xzf -:导出指定 taggit verify-commit <commit>:验证 commit 的 GPG 签名git verify-tag <tag>:验证 tag 的 GPG 签名