工作区 working tree:你当前正在改的文件现场暂存区 index:准备放进下一次提交的内容提交 commit:一个可追踪、可审查、可回滚的历史节点分支 branch:一条独立推进的开发线远端 remote:团队共享仓库入口,默认名通常是 origingit status -sb:开工第一眼,先看分支和改动状态git log --oneline --graph --decorate -20:第二眼,先看最近历史结构现代入口 switch/restore:Git 2.23+ 推荐;老项目里仍会见到 checkout# 开工前先看工作台和时间线
git status -sb
git branch --show-current
git log --oneline --graph --decorate -20statusdifflog refloggit init:初始化当前目录为仓库git clone <url>:从远端克隆完整仓库git config --global user.name "Your Name":设置作者名git config --global user.email "you@example.com":设置作者邮箱git branch -M main:统一默认分支名git remote add origin <url>:给本地仓库补远端git push -u origin main:第一次推送并建立 upstream# 本地已有项目,接入 Git
git init
git add .
git commit -m "chore: bootstrap project"
git branch -M main
git remote add origin https://github.com/your-org/your-repo.git
git push -u origin maingit fetch origin:先拿远端最新状态,但先不改当前工作区git switch main:回到主线git pull --ff-only:快进更新,避免无意生成 merge commitgit switch -c feat/xxx:基于最新主线开任务分支git add -p:按 hunk 精细暂存,适合拆提交git commit -m "feat: ...":提交一个明确阶段结果git push -u origin feat/xxx:首次推分支git fetch origin
git switch main
git pull --ff-only
git switch -c feat/login-form
git status -sb
git diff
git add -p
git commit -m "feat: add login form validation"
git push -u origin feat/login-formgit stash push -m "wip: xxx":临时寄存当前工作区和暂存区git stash push --staged:只寄存 staged 的部分git stash list:看可恢复的现场列表git switch -c fix/xxx:新开热修分支git stash pop:取回并删除最近 stashgit stash apply stash@{1}:只恢复,不删除git worktree add ../repo-hotfix -b fix/xxx origin/main:长时间并行任务时,比 stash 更稳git status -sb
git stash push -m "wip: login form"
git switch main
git pull --ff-only
git switch -c fix/login-500
git add .
git commit -m "fix: handle empty login payload"
git push -u origin fix/login-500
git switch feat/login-form
git stash popgit commit --amend:改上一条提交的内容或 messagegit restore --staged <file>:把文件从暂存区拿下来git rebase -i origin/main:交互式整理多个提交squash fixup:折叠零碎补丁reword:只改提交说明git push --force-with-lease:改写历史后再安全推远端git add src/auth/login.js
git commit --amend --no-edit
git fetch origin
git rebase -i origin/main
git push --force-with-leasegit fetch origin:更新远端跟踪分支,但不改当前分支git log --oneline --graph HEAD..origin/main:看远端比我多了什么git log --oneline --graph origin/main..HEAD:看我本地领先哪些提交git rebase origin/main:功能分支追主线时常用git pull --rebase:fetch + rebase 合并成一步git merge --no-ff feature-x:需要保留 merge 节点时显式使用git fetch origin
git log --oneline --graph --decorate HEAD..origin/main
git rebase origin/maingit restore <file>:丢弃工作区对文件的未暂存修改git restore --staged <file>:从暂存区拿下来,但保留工作区内容git reset --soft HEAD~1:撤销最近提交,保留 staged 状态git reset --mixed HEAD~1:撤销最近提交,改动回到工作区git revert <commit>:用新提交回滚旧提交,适合公共分支git reflog:后悔药入口,找回 reset/rebase 前的位置git reset --soft HEAD~1
git revert abc1234
git reflog
git reset --hard HEAD@{2}git tag -a v1.8.0 -m "release: v1.8.0":创建附注标签git push origin v1.8.0:单独推标签git push --tags:批量推所有本地标签git cherry-pick <commit>:把某次提交摘到当前分支git cherry-pick -x <commit>:补丁回迁时保留来源git branch --contains <commit>:检查某提交已在哪些分支里git switch main
git pull --ff-only
git tag -a v1.8.0 -m "release: v1.8.0"
git push origin main
git push origin v1.8.0
git switch release/1.8
git cherry-pick -x abc1234git submodule add <url> <path>:把外部项目接进当前仓库git submodule status:查看子模块当前指针状态git clone --recursive <main-repo-url>:克隆主仓库时顺便拉全子模块git submodule update --init --recursive:克隆后补初始化与递归拉取git submodule update --remote <path/to/submodule>:只更新某一个子模块git submodule update --remote:更新所有子模块git pull --recurse-submodules:主仓库和子模块一起拉git rm <path> .gitmodules:移除子模块,随后还要清理# 添加子模块后,记得把主仓库里的指针提交出去
git submodule add https://github.com/example/lib-a libs/lib-a
git add .gitmodules libs/lib-a
git commit -m "chore: add lib-a submodule"
# 克隆后补齐子模块
git clone --recursive <main-repo-url>
# 或者
git submodule update --init --recursive
# 只更新某个子模块
git submodule update --remote libs/lib-a
git add libs/lib-a
git commit -m "chore: bump lib-a submodule"git add git commit--recursive update --init --recursive配置与身份:config、作者信息、默认行为仓库入口:仓库初始化、克隆和远端配置子模块协作:添加、初始化、更新与同步子模块看状态:工作区、暂存区和提交差异做提交:暂存、提交、补提和改写上一条提交分支协作:分支创建、切换、合并、变基同步远端:抓取、拉取、推送救现场:临时寄存、并行工作树、恢复、重置、reflog排障发布:日志、追责、二分、标签、补丁搬运git config --global user.name "Your Name":设置全局作者名git config --global user.email "you@example.com":设置全局作者邮箱git config --global init.defaultBranch main:新仓库默认分支默认用 maingit config --global core.editor "code --wait":设置提交信息编辑器git 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 --list:查看当前生效配置git config --show-origin --list:连配置来源文件一起看git config --local user.email "team@example.com":只改当前仓库本地配置git 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 init:初始化普通仓库git init --bare repo.git:初始化裸仓库git clone <url>:克隆完整仓库git clone -b <branch> <url>:克隆并直接切到指定分支git clone --depth 1 <url>:浅克隆,仅拉最近历史git clone --filter=blob:none <url>:部分克隆,省流量git clone --recurse-submodules <url>:克隆时递归拉子模块git remote -v:查看远端列表git remote add origin <url>:添加远端git remote set-url origin <new-url>:修改远端地址git remote rename origin upstream:重命名远端git rev-parse --show-toplevel:看仓库根目录git status:查看完整状态git status -sb:简洁状态,最常用git diff:工作区 vs 暂存区git diff --staged HEAD:暂存区 vsgit diff HEAD HEAD:工作区整体 vsgit diff --stat:只看变更统计git diff --name-only:只看改了哪些文件git add <file>:暂存指定文件git add .:暂存当前目录下新增和修改git add -A:暂存所有改动,包括删除git add -u:只暂存已跟踪文件的改动git add -p:交互式按块暂存git restore --staged <file>:取消暂存git restore <file>:丢弃工作区未暂存修改| git status -s 标记 | 含义 |
|---|---|
| M | 已修改 |
| A | 新增 |
| D | 删除 |
| R | 重命名 |
| ?? | 未跟踪文件 |
git commit -m "feat: ...":创建提交git commit -am "fix: ...":已跟踪文件可直接 add+commitgit commit --amend:修改最近一次提交git commit --amend --no-edit:不改 message,只补内容git commit --allow-empty -m "chore: trigger":建一个空提交git commit --fixup <commit>:配合 autosquash 整理历史git log:标准历史git log --oneline --graph --decorate --all:图形化最常用组合git log -n 20:只看最近 20 条git log --stat:连文件统计一起看git log -p:连 patch 一起看git log --author="name":按作者筛git log --since="2 weeks ago":按时间筛git log -- <path>:只看某文件/目录历史git show <commit>:看某次提交的 patchgit show <commit>:path/to/file:看某次提交里的文件内容git branch:列本地分支git branch -a:列本地 + 远端分支git branch -r:只列远端分支git branch <name>:创建分支git branch -m <new-name>:重命名当前分支git branch -d <name>:删除已合并分支git branch -D <name>:强制删除分支git switch <branch>:切换分支git switch -c <branch>:创建并切换git switch -:回到上一个分支git checkout <branch>:老写法,仍常见git merge <branch>:合并指定分支git merge --no-ff <branch>:即使能快进也保留 merge commitgit merge --squash <branch>:把多个提交压成一个再提交git merge --abort:放弃当前 mergegit rebase <branch>:把当前分支变基到目标分支git rebase -i HEAD~5:交互式整理最近 5 个提交git rebase --continue:冲突解决后继续git rebase --abort:取消本次 rebasegit rebase --skip:跳过当前提交| rebase -i 动作 | 含义 |
|---|---|
| pick | 保留提交 |
| reword | 只改提交说明 |
| edit | 停下来手动修改 |
| squash | 合并并保留说明 |
| fixup | 合并并丢弃说明 |
| drop | 删除提交 |
git fetch:拉取所有远端更新到本地跟踪分支git fetch origin main:只拉某远端某分支git fetch --prune:同步并清理已删除远端分支git pull:fetch + mergegit pull --ff-only:只允许快进git pull --rebase:fetch + rebasegit push:推到默认 upstreamgit push origin <branch>:推指定分支git push -u origin <branch>:首次推并设置 upstreamgit push --force-with-lease:安全强推git push origin --delete <branch>:删除远端分支git remote show origin:查看远端详细信息git stash:快速寄存当前工作git stash push -m "wip: xxx":带说明寄存git stash push -u:连未跟踪文件一起寄存git stash list:查看 stash 列表git stash show -p stash@{0}:看 stash patchgit stash apply:应用但不删除git stash pop:应用并删除git stash drop stash@{0}:删除一条 stashgit worktree list:查看额外工作树git worktree add ../repo-hotfix -b fix/login-500 origin/main:新开一个目录并切到新分支git worktree remove ../repo-hotfix:删除工作树git reset --soft HEAD~1:撤销最近提交,保留 stagedgit reset --mixed HEAD~1:撤销最近提交,改动回工作区git reset --hard HEAD~1:彻底回滚到上一提交,危险git revert <commit>:新建反向提交git reflog:查看本地引用移动历史| reset 模式 | 提交指针 | 暂存区 | 工作区 |
|---|---|---|---|
| --soft | 回退 | 保留 | 保留 |
| --mixed | 回退 | 重置 | 保留 |
| --hard | 回退 | 重置 | 重置 |
git tag:列所有标签git tag -a v1.0.0 -m "release: v1.0.0":创建附注标签git push origin v1.0.0:推单个标签git push --tags:推全部标签git cherry-pick <commit>:摘一条提交到当前分支git cherry-pick -x <commit>:在提交说明里写入来源git blame <file>:看每行最后修改提交git grep -n "keyword":在仓库里搜关键字git bisect start:开始二分git bisect good <commit>:标记好版本git bisect bad <commit>:标记坏版本git bisect reset:结束二分git check-ignore -v <file>:看某文件为什么被忽略git clean -fdn:预览将删除的未跟踪文件git clean -fd:删除未跟踪文件和目录git archive --format=zip HEAD -o repo.zip:导出当前源码快照# 常见 .gitignore
node_modules/
dist/
.env.local
*.log
coverage/