🐙 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