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 initgit init myrepo
  • 何时用:创建新项目仓库。

  • 注意:不会创建远程关联。

git clone

  • 作用:从远程仓库拷贝完整仓库(含历史)到本地并自动设置 origin

  • 常用:

    • git clone https://.../repo.git
    • git clone --depth 1 <url>(浅克隆,仅最新提交)
    • git clone -b branchname <url>(克隆并检出指定分支)
  • 注意:大仓库或 LFS 文件可能需要额外选项。

四、查看状态与差异(工作流核心)

git status

  • 作用:显示工作区/暂存区状态(modified, staged, untracked)。
  • 示例:git status -s(短格式)

git add

  • 作用:把文件快照放入暂存区(Index)。

  • 常用:

    • git add file
    • git 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 addgit 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 origingit fetch --all

git pull

  • git fetch + 自动 merge(默认)或 rebasegit config pull.rebase true
  • 示例:git pull origin maingit 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.0git push origin --tags
  • 删除本地:git tag -d v1.0,删除远程:git push origin :refs/tags/v1.0

十、暂存与临时保存(stash)

git stash

  • 临时保存工作区改动(并把工作区恢复到干净状态)

  • 命令:

    • git stash(保存)
    • git stash list
    • git 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.sslCAInfoGIT_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 start
    • git 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 HEAD
  • git 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 checkout
    • git config --global alias.br branch
    • git config --global alias.ci commit
    • git 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 init
    • git clone <url>
  • 提交:

    • git add .
    • git commit -m "msg"
  • 分支:

    • git checkout -b feature
    • git branch -d feature
  • 合并/变基:

    • git merge feature
    • git rebase develop
  • 远程:

    • git fetch
    • git pull --rebase
    • git push -u origin feature
  • 恢复:

    • git restore file
    • git reset --hard HEAD~1
    • git revert <commit>
  • 子模块/LFS:

    • git submodule update --init --recursive
    • git lfs install && git lfs pull
  • 查历史/定位:

    • git log --oneline --graph --decorate
    • git blame file
    • git bisect start ... git bisect good/bad

二十二、常见误区与注意点(常见坑)

  • git pull 不知道会 merge 还是 rebase:推荐 git pull --rebase 或配置 pull.rebase true
  • 在公共分支做 git commit --amendrebase 后强推,会破坏别人的历史。
  • git reset --hardgit clean -fdx 会彻底删除未保存内容,先用 git status/git stash
  • 误用 git filter-branch 导致仓库变大或出错,使用 git filter-repo 替代。
  • LFS 文件下载失败常由证书、权限或代理导致,不是仓库内容本身坏掉。

二十三、学习与排查建议

  • 熟练掌握 statusaddcommitlogdiffbranchcheckout/switchmergerebaseresetstash
  • 经常使用 --oneline --graph 观察分支结构。
  • CI 环境中把 git lfs install 放到构建前步骤。
  • 需要做历史清理时,先在本地或备份仓库做实验再应用到远程。

相关推荐
呆萌的代Ma2 小时前
Git不强行推送,撤销最近几次的提交
git
透明的玻璃杯5 小时前
git应用
git
炸炸鱼.6 小时前
Git+Jenkins实战(一):从零搭建自动化发布与回滚系统(附完整代码)
git·jenkins
言6669 小时前
要忽略前端依赖包node_modules的文件在目录下 git暂存区消失
git
胡小禾10 小时前
Git Worktree
git
程序员小羊!10 小时前
18 GIt
git
怣疯knight10 小时前
Git 本地分支关联远程分支 常用命令汇总
git
ANNENBERG10 小时前
git分支开发管理
git
坤坤藤椒牛肉面10 小时前
GIT的使用
git
w32963627111 小时前
使用 OpenCode 在 Windows 上加速安装 Playwright 的完整指南
windows·git