Git 命令 作用、常用选项、示例、何时使用与注意事项指南
说明:Git 的命令很多(尤其是 plumbing 层),这里覆盖了“所有常用 + 重要高级命令”。某些非常罕见或极底层的 plumbing 我也列出并简短说明,便于有经验者参考。
一、入门与基础概念(必读)
- 工作区(Working Directory):你看到的文件树。
- 暂存区(Index/Staging Area):
git add放入的快照,下一次 commit 的内容来自这里。 - 本地仓库(.git):提交记录和对象存储。
- 远程仓库(remote):例如
origin,用于协作。 - 提交(commit):记录快照,包含元数据(作者、时间、父提交)。
二、配置与身份(必做)
git config — 管理 Git 行为与身份
-
作用:设置用户名、邮箱、别名、差异工具、credential helper 等。
-
常用:
git config --global user.name "Your Name"git config --global user.email "you@example.com"git config --global core.editor "code --wait"git config --list
-
备注:
--system、--global、--local(仓库)优先级:local > global > system。
三、仓库初始化与克隆
git init
-
作用:在当前目录创建
.git,把目录变成 Git 仓库。 -
示例:
git init或git init myrepo
-
何时用:创建新项目仓库。
-
注意:不会创建远程关联。
git clone
-
作用:从远程仓库拷贝完整仓库(含历史)到本地并自动设置
origin。 -
常用:
git clone https://.../repo.gitgit clone --depth 1 <url>(浅克隆,仅最新提交)git clone -b branchname <url>(克隆并检出指定分支)
-
注意:大仓库或 LFS 文件可能需要额外选项。
四、查看状态与差异(工作流核心)
git status
- 作用:显示工作区/暂存区状态(modified, staged, untracked)。
- 示例:
git status -s(短格式)
git add
-
作用:把文件快照放入暂存区(Index)。
-
常用:
git add filegit add .(添加当前目录全部变化,包括新文件)git add -p(交互式按片段选择更改)
-
注意:
add是将当前版本快照放到 index,不是直接提交。
git diff
-
作用:比较改变
-
常用:
git diff(工作区 vs 暂存区)git diff --staged/git diff --cached(暂存区 vs 最近一次提交)git diff <commit1> <commit2>
-
-U,--word-diff等用于格式化输出。
git rm / git mv
git rm file:删除并标记删除(会在下次 commit 生效)git mv old new:重命名(等同于mv+git add/rm)
五、提交(commit)与日志(history)
git commit
-
作用:把暂存区快照写入本地仓库,生成新的提交对象。
-
常用:
git commit -m "message"git commit -a -m "msg"(跳过git add,自动暂存已追踪文件的更改)git commit --amend(修改最近一次提交—用于修改提交信息或合并新增更改)
-
注意:
--amend会改变历史,已 push 的提交应谨慎改动。
git log
-
作用:查看提交历史。
-
常用:
git log --oneline --graph --decorate --all(漂亮树状视图)git log -p(显示每次提交的 diff)git log --since="2 weeks ago" --author="Alice"
-
讲解:
--graph很适合查看分支/合并结构。
git show
- 作用:显示单次提交详情(patch、元数据)
- 示例:
git show 7a1b2c3
git blame
- 作用:对于文件的每一行显示最后改动的提交/作者(定位责任)
- 示例:
git blame -L 1,120 file.c(只看前120行)
六、撤销/恢复(非常重要)
这类命令能破坏历史或本地改动,务必小心。
git restore(新命令,替代某些 checkout 用法)
-
恢复文件到 HEAD 或某提交状态:
git restore file(把工作区文件恢复为 HEAD 的版本)git restore --staged file(从暂存区移除,但保留工作区修改)
git reset
-
作用:移动当前分支的 HEAD 指针,可选择是否更改暂存与工作区。
-
模式:
--soft <commit>:只移动 HEAD,保留暂存区与工作区(适合合并提交但保留改动以重新 commit)--mixed <commit>(默认):移动 HEAD 并重写暂存区,但保留工作区(撤销已暂存)--hard <commit>:移动 HEAD、重写暂存区和工作区(彻底回退,危险)
-
示例:
git reset --hard HEAD~1
git revert
- 作用:创建一个新的提交来反向应用指定 commit 的改动(安全用于已推送的历史)
- 示例:
git revert 1234abcd
git clean
- 作用:删除未跟踪文件
- 常用:
git clean -fd(删除未追踪目录),-x包括忽略文件 - 注意:危险,先用
-n预览。
七、分支管理(核心协作手段)
git branch
- 查看:
git branch(当前分支有*) - 创建:
git branch feature - 删除:
git branch -d feature(若未合并会失败),强制:-D
git switch / git checkout
git switch <branch>(显式切换分支)git switch -c <branch>(创建并切换)- 旧式:
git checkout <branch>(既能切分支也能检出文件/commit,功能混杂)
git merge
- 合并其他分支到当前分支。
- 示例:
git merge feature(若冲突,手动解决后git add并git commit) - 合并策略:
--no-ff(强制保留 merge commit)
git rebase
-
变基,把当前分支的提交“移动”到目标分支之上,保持直线历史。
-
常用:
git rebase develop- 交互式:
git rebase -i HEAD~5(编辑、合并、删除提交)
-
注意:对已 push 的分支做 rebase 会重写历史,需要团队协调。
git cherry-pick
- 作用:把某个提交复制(应用)到当前分支(不会拷贝分支)
- 示例:
git cherry-pick 1a2b3c
八、远程仓库(pull/push/fetch 等)
git remote
- 查看远程:
git remote -v - 添加:
git remote add origin <url> - 删除:
git remote remove origin
git fetch
- 拉取远程更新到本地(不会自动合并)
git fetch origin或git fetch --all
git pull
git fetch+ 自动merge(默认)或rebase(git config pull.rebase true)- 示例:
git pull origin main或git pull --rebase
git push
-
推送分支到远程:
git push origin main- 首次推送并设置上游:
git push -u origin feature
-
强制推送(危险):
git push --force或--force-with-lease(推荐后者更安全)
九、标签(发布/版本管理)
git tag
- 轻量标签:
git tag v1.0 - 注释标签:
git tag -a v1.0 -m "release" - 推送标签:
git push origin v1.0或git push origin --tags - 删除本地:
git tag -d v1.0,删除远程:git push origin :refs/tags/v1.0
十、暂存与临时保存(stash)
git stash
-
临时保存工作区改动(并把工作区恢复到干净状态)
-
命令:
git stash(保存)git stash listgit stash apply(应用,但保留 stash)git stash pop(应用并移除 stash)git stash push -m "msg" --include-untracked
-
场景:切分支修紧急 bug,但不想提交当前未完成工作。
十一、子模块(submodule)
git submodule
- 添加:
git submodule add <repo> path - 初始化:
git submodule init - 更新(拉取并检出):
git submodule update --init --recursive - 在 CI 常见命令:
git submodule update --init --recursive --remote - 注意:子模块本质是父仓库跟踪一个具体的提交哈希,管理复杂,常见陷阱包括:忘记
--init、本地修改阻止 checkout、LFS 问题等。
十二、Git LFS(大文件)
- 安装与初始化:
git lfs install - 跟踪类型:
git lfs track "*.bin"(修改.gitattributes) - 拉取 LFS 对象:
git lfs pull - 常见问题:证书/权限/代理会导致
smudge filter lfs failed,需要配置http.sslCAInfo或GIT_LFS_SKIP_SMUDGE=1等。
十三、打包/导出/补丁
git archive
-
将某个 commit/tree 导出为 tar/zip:
git archive --format=tar HEAD | gzip > project.tar.gz
git format-patch / git am
- 生成邮件补丁:
git format-patch origin/main(生成 .patch 文件) - 应用补丁:
git am <0001-something.patch>
git apply
- 将补丁应用到工作区(不创建 commit):
git apply patch.diff
十四、审查/排查工具
git bisect
-
二分查找引入 bug 的提交:
git bisect startgit bisect bad(当前为坏)git bisect good <commit>- 之后 Git 会 checkout 中间提交,你测试并
git bisect good/bad,直到定位到引入问题的 commit。
git fsck
- 检查对象库完整性:
git fsck --full
git reflog
- 查看 HEAD 与引用的变动历史(即便分支被删,提交哈希仍可见):
git reflog
git blame
- 每行责任追踪(见上)
十五、高级重写历史(危险区)
git rebase -i
- 交互式变基,合并/修改/重新排序提交,是清理历史的强大工具。
- 注意:变基会 rewrite history,不要在公共分支对外推送后随意变基。
git filter-branch(已被弃用,推荐 git filter-repo)
-
重写历史(修改文件路径/删除敏感信息),示例(旧方式):
git filter-branch --tree-filter 'rm -f password.txt' -- --all
-
推荐使用
git filter-repo(更快/更安全)。
十六、低层 plumbing(供高级用户/脚本调用)
git hash-object -w file:把文件写入对象库,返回哈希。git cat-file -t <hash>/git cat-file -p <hash>:查看对象类型/内容。git update-index:直接操作索引(暂存区)。git rev-parse:把 refs 转成哈希,脚本里常用:git rev-parse --abbrev-ref HEADgit ls-tree:查看 tree 对象内容。git for-each-ref:列 refs(脚本用)。
十七、工作树(worktree)
git worktree
-
允许在同一仓库并行检出多个 HEAD(无需多次 clone)
-
示例:
git worktree add ../worktree-branch feature(在上层创建新目录并检出 feature)
-
场景:同时编译两个分支、review 代码时非常实用。
十八、钩子(hooks)
- Git hooks 位于
.git/hooks,可以触发脚本(如pre-commit,pre-push,post-commit,pre-receive等)。 - 常见用法:代码风格检查(pre-commit)、运行单元测试(pre-push)、CI 集成(server-side hooks)。
- 注意:默认示例文件为
.sample,需要复制并赋可执行权限。
十九、别名(Aliases)
-
提升效率:
git config --global alias.st status,之后git st就相当于git status。 -
常见别名:
git config --global alias.co checkoutgit config --global alias.br branchgit config --global alias.ci commitgit config --global alias.lg "log --oneline --graph --decorate"
二十、常见工作流与最佳实践(建议)
- 每次提交保持单一职责:一个 commit 做一件事,提交信息要清晰(主题行 + 空行 + 说明)。
- 使用 feature 分支开发,PR/MR 进行代码审查(避免直接在 main 上开发)。
- 使用
--force-with-lease替代--force,防止覆盖别人新推的更改。 - 在变更历史之前与团队沟通(rebase 会 rewrite 历史)。
- 为大文件使用 Git LFS,并在 CI 中注意 LFS 对 agent 的依赖。
- 脚本/自动化中尽量使用 porcelain(常用)命令和
rev-parse等安全解析。
二十一、常见场景命令速查(便于copy-paste)
-
初始化:
git initgit clone <url>
-
提交:
git add .git commit -m "msg"
-
分支:
git checkout -b featuregit branch -d feature
-
合并/变基:
git merge featuregit rebase develop
-
远程:
git fetchgit pull --rebasegit push -u origin feature
-
恢复:
git restore filegit reset --hard HEAD~1git revert <commit>
-
子模块/LFS:
git submodule update --init --recursivegit lfs install && git lfs pull
-
查历史/定位:
git log --oneline --graph --decorategit blame filegit bisect start…git bisect good/bad
二十二、常见误区与注意点(常见坑)
- 用
git pull不知道会merge还是rebase:推荐git pull --rebase或配置pull.rebase true。 - 在公共分支做
git commit --amend或rebase后强推,会破坏别人的历史。 git reset --hard与git clean -fdx会彻底删除未保存内容,先用git status/git stash。- 误用
git filter-branch导致仓库变大或出错,使用git filter-repo替代。 - LFS 文件下载失败常由证书、权限或代理导致,不是仓库内容本身坏掉。
二十三、学习与排查建议
- 熟练掌握
status、add、commit、log、diff、branch、checkout/switch、merge、rebase、reset、stash。 - 经常使用
--oneline --graph观察分支结构。 - CI 环境中把
git lfs install放到构建前步骤。 - 需要做历史清理时,先在本地或备份仓库做实验再应用到远程。
