🐙 Git 和 GitHub CLI

Multilingual DevOps cheat sheet: Linux, Docker, Git, Kubernetes, Helm, Terraform, practical scenarios & templates.
发布于

2025年8月31日

基础与高级 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"

查找所有文件中 functionName 的引用

git grep -n "TODO"

查找包含 TODO 的行并显示行号(有助于查找代码注释)

git grep -i "login"

不区分大小写搜索 login(匹配 LoginLOGINlogin 等)

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

创建一个名为 new-feature 的新分支

git branch -d old-feature

删除本地分支 old-feature

git checkout 切换分支或从其他提交恢复文件
git checkout main

切换到 main 分支

git checkout -b new-branch

创建并切换到新分支 new-branch

git switch 切换分支(checkout 的简化替代方案)
git switch main

切换到 main 分支

git switch -c feature-x

创建并切换到新分支 feature-x

git switch new-feature

切换到现有分支 new-feature

git merge 将另一个分支的更改合并到当前分支
git merge new-feature

new-feature 分支合并到当前分支

git merge --no-ff new-feature

始终创建合并提交(即使可以快进合并)

git merge --abort

若出现冲突,取消合并并恢复更改

git rebase 将提交移动或重新应用到新的基提交上
git rebase main

将你的分支提交重新应用到 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

应用从 A(不含)到 B(含)的提交范围

📡 远程仓库

命令

示例

描述

git remote 管理远程仓库链接(如 GitHub)
git remote -v

显示远程名称及其 URL

git remote add origin URL

添加名为 origin 的远程仓库

git pull 从远程分支下载并自动合并更改
git pull origin main

从远程 main 分支获取并合并到当前分支

git pull --rebase origin main

获取并 rebase 当前分支到远程分支,而不是合并

git push 将本地更改上传到远程仓库
git push origin main

将本地 main 分支推送到远程 origin

git fetch 从远程下载更改但不合并
git fetch origin

获取远程 origin 的所有更新,但不应用

git fetch origin main

仅获取远程的 main 分支

git fetch --all

从所有远程获取更新

git fetch --prune

清理已删除的分支 —— 删除本地引用的远程已删除分支

git fetch --dry-run

显示将要获取的内容,但不实际下载

git fetch origin +main

强制更新本地跟踪分支 (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"

创建带消息的注解标签 v1.0(保存为完整 Git 对象,适合发布)

git tag -d v1.0

删除本地标签 v1.0(不影响远程)

git push 将提交、分支和标签从本地推送到远程仓库
git push origin --tags

将所有本地标签推送到远程(适合一次标记多个版本后使用)

git push origin v1.0

将指定标签(如 v1.0)推送到远程仓库

git push origin :refs/tags/v1.0

删除远程标签 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}

查看 main 分支一周前的指向

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 pull 以更新到最新提交

git submodule sync --recursive

.gitmodules 文件更改后同步子模块 URL

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 创建压缩的 .tar.gz 归档

git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz

创建包含 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

使用存储在文件 (mytoken.txt) 中的个人访问令牌进行认证

gh auth login --hostname enterprise.internal

认证到 GitHub Enterprise 服务器(而不是 github.com)

gh repo clone 将 GitHub 仓库克隆到本地计算机
gh repo clone user/repo

user 拥有的仓库 repo 克隆到名为 repo 的文件夹

gh repo clone cli/cli -- --depth=1

只下载最新提交,创建更小更快的浅拷贝

gh repo clone cli/cli workspace/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 monalisa 中的 feature 分支创建一个 PR,目标为 develop 分支

gh repo create 通过 CLI 创建一个新的 GitHub 仓库
gh repo create my-project

在 GitHub 上创建名为 my-project 的新仓库(随后有交互式提示)

gh repo create my-project --public --clone

创建一个公共仓库并在本地克隆

gh repo create my-project --private --source=. --remote=upstream

从当前文件夹创建一个私有远程仓库,并添加名为 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-branch 的性能问题。谨慎使用

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