🐙 Git 和 GitHub CLI
基础与高级 Git 命令:版本控制、分支、远程仓库、暂存区、标签,以及 GitHub CLI。
🔹 基本命令
| 命令 | 示例 | 描述 | 
|---|---|---|
| git add | 将文件添加到暂存区 | |
| git add file.txt | 暂存指定文件以便下次提交 | |
| git add . | 暂存当前目录及其子目录中的所有更改 | |
| git add -p | 交互式选择文件的部分更改进行暂存(适合部分提交) | |
| git clone | 克隆一个仓库到新目录 | |
| git clone -b branch_name URL | 只克隆指定分支(而不是默认分支) | |
| git clone --depth 1 URL | 只克隆最新提交,创建浅拷贝以节省时间和空间 | |
| git commit | 将更改记录到仓库 | |
| git commit -m "Initial commit" | 带消息提交,不打开编辑器 | |
| git commit -a -m "Fix bugs" | 暂存并提交所有已修改的已跟踪文件,并添加提交信息 | |
| git commit --amend | 更新最后一次提交(修改消息或包含更多更改) | |
| git commit --fixup abc1234 | 创建一个 fixup 提交,稍后在交互式 rebase 中自动压缩 | |
| git config | 获取和设置仓库或全局配置 | |
| git config --global user.name "Name" | 设置全局 Git 用户名 | |
| git config --global user.email "email@example.com" | 设置全局 Git 邮箱 | |
| git config --list | 列出所有 Git 设置(姓名、邮箱、编辑器等) | |
| git diff | 显示提交之间、提交与工作区之间的更改 | |
| git diff HEAD | 显示自上次提交以来的修改(未暂存) | |
| git diff --staged | 显示下次提交将包含的更改 | |
| git diff --word-diff HEAD~1 | 以单词级别显示差异 | |
| git grep | 在仓库文件中搜索 | |
| git grep "functionName" | 查找所有文件中  | |
| git grep -n "TODO" | 查找包含  | |
| git grep -i "login" | 不区分大小写搜索  | |
| git init | 创建一个新的空 Git 仓库或重新初始化现有仓库 | |
| git init my-project | 在目录 my-project 中初始化新仓库 | |
| git init --bare | 初始化一个裸仓库 | |
| git log | 显示提交日志 | |
| git log --oneline | 以简洁单行格式显示提交历史 | |
| git log --graph --all | 以图形方式显示所有分支的提交记录 | |
| git log -p --stat | 显示提交的补丁和文件更改统计 | |
| git reset | 取消暂存文件,但保留工作目录中的更改 | |
| git reset HEAD file.txt | 从暂存区移除文件(保留编辑内容) | |
| git reset --hard HEAD~1 | 回退到上一个提交并删除所有更改(不可逆!) | |
| git reset --soft HEAD~1 | 撤销上一次提交,但保留更改以便再次提交 | |
| git reset --mixed HEAD~1 | 撤销提交,但将更改保留在工作目录中(未暂存) | |
| git show | 显示各种类型的对象 | |
| git show <commit_hash> | 显示指定提交的更改和消息 | |
| git show HEAD~1 | 显示当前提交之前的提交 | |
| git show --stat | 显示最近一次提交的文件更改摘要 | |
| git status | 显示工作区状态 | |
| git status -s | 以简短格式显示状态 | |
| git status -b | 显示当前分支及文件状态 | 
🌿 分支与合并
| 命令 | 示例 | 描述 | 
|---|---|---|
| git branch | 创建、列出或删除分支 | |
| git branch new-feature | 创建一个名为  | |
| git branch -d old-feature | 删除本地分支  | |
| git checkout | 切换分支或从其他提交恢复文件 | |
| git checkout main | 切换到  | |
| git checkout -b new-branch | 创建并切换到新分支  | |
| git switch | 切换分支( checkout的简化替代方案) | |
| git switch main | 切换到  | |
| git switch -c feature-x | 创建并切换到新分支  | |
| git switch new-feature | 切换到现有分支  | |
| git merge | 将另一个分支的更改合并到当前分支 | |
| git merge new-feature | 将  | |
| git merge --no-ff new-feature | 始终创建合并提交(即使可以快进合并) | |
| git merge --abort | 若出现冲突,取消合并并恢复更改 | |
| git rebase | 将提交移动或重新应用到新的基提交上 | |
| git rebase main | 将你的分支提交重新应用到  | |
| git rebase -i HEAD~3 | 交互式编辑最近 3 次提交 | |
| git rebase --abort | 停止并撤销正在进行的 rebase | |
| git rebase -i --autosquash HEAD~5 | 在交互式 rebase 中自动压缩标记为 fixup 或 squash 的提交 | |
| git cherry-pick | 应用另一个分支的特定提交 | |
| git cherry-pick <hash> | 将某个提交(通过哈希)应用到当前分支 | |
| git cherry-pick --continue | 解决冲突后继续 cherry-pick | |
| git cherry-pick A^..B | 应用从  | 
📡 远程仓库
| 命令 | 示例 | 描述 | 
|---|---|---|
| git remote | 管理远程仓库链接(如 GitHub) | |
| git remote -v | 显示远程名称及其 URL | |
| git remote add origin URL | 添加名为  | |
| git pull | 从远程分支下载并自动合并更改 | |
| git pull origin main | 从远程  | |
| git pull --rebase origin main | 获取并 rebase 当前分支到远程分支,而不是合并 | |
| git push | 将本地更改上传到远程仓库 | |
| git push origin main | 将本地  | |
| git fetch | 从远程下载更改但不合并 | |
| git fetch origin | 获取远程  | |
| git fetch origin main | 仅获取远程的  | |
| git fetch --all | 从所有远程获取更新 | |
| git fetch --prune | 清理已删除的分支 —— 删除本地引用的远程已删除分支 | |
| git fetch --dry-run | 显示将要获取的内容,但不实际下载 | |
| git fetch origin +main | 强制更新本地跟踪分支 ( | 
📦 暂存与清理
| 命令 | 示例 | 描述 | 
|---|---|---|
| git stash | 临时保存未提交的更改(进行中的工作) | |
| git stash | 保存已修改和已暂存的文件,然后将工作区恢复到上次提交 | |
| git stash apply | 重新应用最近一次暂存的更改(暂存仍保留) | |
| git stash pop | 重新应用并删除最近一次暂存 | |
| git stash list | 显示所有暂存的更改列表 | |
| git stash branch feature-fix | 创建一个新分支并应用最近一次暂存 | |
| git clean | 永久删除未跟踪文件(未被 Git 管理) | |
| git clean -f | 删除当前目录中的未跟踪文件 | |
| git clean -fd | 删除未跟踪的文件和文件夹 | |
| git clean -n | 预览将要删除的内容(安全干跑) | 
🏷️ 标签
| 命令 | 示例 | 描述 | 
|---|---|---|
| git tag | 创建、列出或删除标签以标记历史中的特定点(如发布) | |
| git tag -a v1.0 -m "Version 1.0" | 创建带消息的注解标签  | |
| git tag -d v1.0 | 删除本地标签  | |
| git push | 将提交、分支和标签从本地推送到远程仓库 | |
| git push origin --tags | 将所有本地标签推送到远程(适合一次标记多个版本后使用) | |
| git push origin v1.0 | 将指定标签(如  | |
| git push origin :refs/tags/v1.0 | 删除远程标签  | 
🛠️ 冲突解决
| 命令 | 示例 | 描述 | 
|---|---|---|
| git mergetool | 打开可视化工具以帮助解决合并冲突 | |
| git mergetool --tool=meld | 使用指定的合并工具(如 Meld)解决冲突 | |
| git rerere | 让 Git 记住你之前如何解决合并冲突 | |
| git config --global rerere.enabled true | 启用过去冲突解决方案的自动复用 | |
| git rerere status | 显示哪些文件已保存冲突解决方案 | |
| git rerere diff | 显示 Git 保存的供将来复用的更改 | 
⚙️ 高级命令
| 命令 | 示例 | 描述 | 
|---|---|---|
| git bisect | 使用二分查找定位引入错误的提交 | |
| git bisect start | 在已知正常提交和有问题提交之间开始二分查找错误 | |
| git bisect bad | 将当前提交标记为 “bad”(包含错误) | |
| git bisect good <commit> | 将已知正常的提交标记为 “good”(无错误) | |
| git blame | 显示文件每行最后修改者及其提交信息 | |
| git blame file.txt | 显示文件每行的作者和提交信息 | |
| git blame -L 10,20 file.txt | 仅显示第 10 到 20 行的责任信息 | |
| git blame --show-email file.txt | 在行更改旁显示作者的电子邮箱 | |
| git reflog | 查看和管理分支移动及 HEAD 的引用日志 (reflog) | |
| git reflog show main@{1.week.ago} | 查看  | |
| git reflog expire --expire=30.days --dry-run | 预览哪些超过 30 天的 reflog 条目可以清理(不做更改) | |
| git reflog delete HEAD@{2} | 删除特定的 reflog 条目(谨慎使用,可能影响恢复) | |
| git submodule | 添加、初始化、更新或检查子模块(仓库中的仓库) | |
| git submodule add URL path | 将外部仓库作为子模块添加到指定路径 | |
| git submodule update --init | 初始化并下载仓库中列出的所有子模块 | |
| git submodule foreach git pull | 在每个子模块中运行  | |
| git submodule sync --recursive | 在  | |
| git submodule update --remote --merge | 更新子模块到其远程分支的最新提交 | |
| git archive | 从特定提交或分支创建文件归档(zip、tar 等) | |
| git archive --format=zip HEAD > archive.zip | 创建当前项目 HEAD 的 ZIP 归档 | |
| git archive -o release.tar.gz HEAD | 从当前 HEAD 创建压缩的  | |
| git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz | 创建包含  | |
| git gc | 清理不必要的文件并优化仓库性能 | |
| git gc --aggressive | 执行彻底的清理和优化(可能较慢但有效) | |
| git gc --prune=now | 立即删除所有不可达对象(不确定时危险) | |
| git shortlog | 作者及其提交的快速汇总 | |
| git shortlog -e | 显示作者及其电子邮箱列表(如分析谁贡献了多少) | |
| git shortlog -s -n | 显示每个作者的提交次数,按提交数排序 | |
| git shortlog -sne | 同上,但也包含姓名和邮箱 —— 适合详细跟踪活动 | |
| git revert | 创建一个新提交来撤销之前提交的更改,而不改写历史 | |
| git revert HEAD | 通过新提交撤销上一次提交 | |
| git revert <commit_hash> | 通过哈希撤销特定提交,安全地添加一个反向提交 | 
🐙 GitHub CLI
gh让你可以在终端中管理 GitHub。
| 命令 | 示例 | 描述 | 
|---|---|---|
| gh auth login | 与 GitHub 主机进行身份验证,以便 CLI 命令能与您的账户交互 | |
| gh auth login --with-token < mytoken.txt | 使用存储在文件 ( | |
| gh auth login --hostname enterprise.internal | 认证到 GitHub Enterprise 服务器(而不是 github.com) | |
| gh repo clone | 将 GitHub 仓库克隆到本地计算机 | |
| gh repo clone user/repo | 将  | |
| gh repo clone cli/cli -- --depth=1 | 只下载最新提交,创建更小更快的浅拷贝 | |
| gh repo clone cli/cli workspace/cli | 将仓库克隆到自定义文件夹  | |
| gh issue list | 列出 GitHub 仓库中的问题,可按多种条件筛选 | |
| gh issue list --assignee "@me" | 列出分配给你的问题 | |
| gh issue list --state all | 列出所有问题(无论是打开还是关闭) | |
| gh issue list --search "error no:assignee sort:created-asc" | 列出匹配 “error” 的未分配问题,按创建时间升序排序 | |
| gh pr create | 通过 CLI 在 GitHub 上创建拉取请求(PR) | |
| gh pr create --title "..." | 创建一个带指定标题的拉取请求 | |
| gh pr create --project "Roadmap" | 将拉取请求关联到名为 “Roadmap” 的 GitHub 项目 | |
| gh pr create --base develop --head monalisa:feature | 从 fork  | |
| gh repo create | 通过 CLI 创建一个新的 GitHub 仓库 | |
| gh repo create my-project | 在 GitHub 上创建名为  | |
| gh repo create my-project --public --clone | 创建一个公共仓库并在本地克隆 | |
| gh repo create my-project --private --source=. --remote=upstream | 从当前文件夹创建一个私有远程仓库,并添加名为  | 
💡 Git 别名(实用快捷方式)
设置便捷的别名以加快常用 Git 命令:
git config --global alias.br branch                                       # 快捷方式:git branch
git config --global alias.ci commit                                       # 快捷方式:git commit
git config --global alias.co checkout                                     # 快捷方式:git checkout
git config --global alias.graph "log --oneline --graph --all --decorate"  # 漂亮的历史图
git config --global alias.last "log -1 HEAD"                              # 显示最后一次提交
git config --global alias.st status                                       # 快捷方式:git status🚀 专业级高级 Git 命令
| 命令 | 示例 | 描述 | 
|---|---|---|
| git filter-repo | 一个强大高效的工具,用于重写 Git 历史以移除或修改文件、作者或路径;替代 git filter-branch,具有更高速度和安全性 | |
| git filter-repo --path secret.txt --invert-paths | 高效重写仓库历史以移除敏感文件或目录,而不会遇到  | |
| git filter-repo --replace-text replacements.txt | 在整个历史中批量替换字符串或模式(如清理凭据) | |
| git filter-repo --subdirectory-filter src | 将子目录历史提取为新仓库,保留提交元数据 | |
| git worktree | 管理与单个仓库关联的多个工作目录,允许并行在不同分支上工作而无需再次克隆 | |
| git worktree add ../feature feature-branch | 创建附加到同一仓库的工作树,支持并行分支检出 | |
| git worktree list | 列出所有活动工作树、它们的路径和关联分支 | |
| git worktree remove ../feature | 删除不再需要的工作树,安全清理目录 | |
| git replace | 创建临时引用以替换现有对象,支持非破坏性的本地历史修改和测试 | |
| git replace <old_commit> <new_commit> | 在本地仓库中临时交换一个提交用于测试或修补历史,而无需重写 | |
| git replace --list | 显示所有活动的替换引用 | |
| git replace -d <replace_ref> | 删除指定替换引用以恢复原始行为 | |
| git stash | 将未提交的更改临时保存到栈中,允许在未完成的工作间切换上下文 | |
| git stash push -p | 交互式选择部分更改保存到 stash,精细控制保存内容 | |
| git stash push -m "WIP selective stash" | 创建带自定义消息的 stash 以便识别 | |
| git stash apply stash@{2} | 应用指定的 stash 而不删除它 | |
| git rebase | 将提交重新应用到另一基点上,保持更清晰线性的历史并支持交互式编辑 | |
| git rebase --interactive --autosquash | 开始交互式 rebase 会话,自动重排并压缩 fixup 或 squash 提交,简化历史 | |
| git rebase -i --autosquash HEAD~10 | 在推送前自动重排和压缩 fixup/squash 提交,清理提交历史 | |
| git commit --fixup <commit> | 创建一个 fixup 提交,在交互式 rebase 中会被自动压缩 | |
| git commit --squash <commit> | 创建一个 squash 提交,与指定提交合并 | |
| git bisect | 二分查找工具,用于高效定位引入错误的提交,通过测试逐步缩小范围 | |
| git bisect run | 运行测试脚本自动化 bisect,快速定位引入错误的提交 | |
| git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh | 在每个提交上运行测试脚本,加速错误定位 | |
| git bisect visualize | 打开图形化工具可视化 bisect 过程 | |
| git bisect reset | 退出 bisect 模式并返回原始 HEAD | |
| git commit | 带详细选项的提交:修改、签名、fixup、消息定制,以维护高质量历史 | |
| git commit --gpg-sign | 使用 GPG 密钥签署提交,确保加密验证提交的真实性和作者身份 | |
| git commit -S -m "Signed commit" | 用 GPG 密钥加密签名提交,确保完整性和作者验证 | |
| git config --global user.signingkey <key_id> | 全局配置用于签名提交的 GPG 密钥 | |
| git log --show-signature | 验证并显示提交的 GPG 签名信息 | |
| git reflog | 保存 HEAD 和分支更新的日志,对恢复丢失提交和理解本地历史至关重要 | |
| git reset --hard HEAD@{3} | 将当前分支重置到 reflog 中的之前状态,以恢复或撤销更改 | |
| git reflog expire --expire=now --all | 立即过期所有 reflog 条目,清理日志历史(谨慎使用) | 
🧰 专业工作流技巧与自动化
| 主题 | 命令 / 示例 | 解释 & 专业提示 | 
|---|---|---|
| 强力仓库清理 | git gc --aggressive --prune=now | 执行深度垃圾回收并立即修剪不可达对象,用于仓库优化。建议在维护窗口执行 | 
| 并行工作树 | git worktree add ../feature-branch feature | 保持多个工作树以同时进行功能开发,避免重复克隆 | 
| 干净线性历史 | git rebase -i --autosquash | 推送前使用交互式 rebase + autosquash 保持历史清晰可读 | 
| 安全提交 | git commit -S | 用 GPG 签名提交以增强可信度,在许多企业环境中是必需的 | 
| 自动化 Bisect | git bisect run ./test-script.sh | 在 bisect 过程中运行测试脚本,自动化错误定位 | 
| 冲突解决缓存 | git config --global rerere.enabled true | 启用冲突解决方案复用,加快跨 rebase 或合并的重复冲突解决 | 
| 共享别名与钩子 | 在共享仓库或 CI 流水线中存储常用 Git 别名和提交钩子,以强制团队规范并提高效率 | 
附加资源
🧠 提示
不要试图死记硬背。使用 --help,多探索并经常练习:
git help <command>
git status🌐 有用的链接
📘 Git 官方文档 — 所有 Git 命令的详细手册:
https://git-scm.com/docs
📙 Learn Git Branching — 交互式可视化教程,掌握分支概念:
https://learngitbranching.js.org
📕 Pro Git 书籍(免费,作者 Scott Chacon & Ben Straub):
https://git-scm.com/book
📗 Git 速查表(官方简明参考):
https://education.github.com/git-cheat-sheet-education.pdf