由 git-sim 绘制的可自定义动画版 Git 速查表

Lobsters Hottest 工具

摘要

Initial Commit 与 git-sim 合作推出了一个可自定义的动画版 Git 速查表,涵盖仓库创建、配置、分支、合并、rebase 等常用命令,并以可视化方式演示每条命令的效果与安全等级。

<p><a href="https://lobste.rs/s/uzkcmh/animated_customizable_git_cheat_sheet">评论</a></p>
查看原文
查看缓存全文

缓存时间: 2026/10/04 17:02

# 动画版 Git 速查表 | 学习 Git 来源:https://initialcommit.com/learn/git/animated-cheat-sheet 安全 不会丢失任何内容 警告 会重写历史,但可以找回 危险 可能永久丢失工作内容 ## 开始一个项目 4 条命令 仓库就是一个项目文件夹,其历史记录保存在隐藏的 `.git` 文件夹中。你可以新建一个仓库,也可以克隆一个已存在的仓库,历史记录也一并带上。 ### 创建新仓库 安全 `git init` 在当前文件夹创建一个空的 Git 仓库,保存在隐藏的 `.git` 文件夹中。在你添加并提交文件之前,不会有任何文件被追踪。 示例:`git init` `git clone <url>` 下载 `<url>` 处的仓库(含完整历史记录)到新文件夹,检出其默认分支,并将该源添加为远程仓库 `origin`。 示例:`git clone https://example.com/your_project.git` ### 仅克隆最近的 N 个提交 安全 `git clone --depth <n>` 只克隆默认分支的最近 `<n>` 个提交,跳过更早的历史记录。 示例:`git clone --depth 3 https://example.com/your_project.git` ### 克隆仓库并检出特定分支 安全 `git clone -b <branch>` 克隆仓库,并检出 `<branch>` 而不是远程的默认分支。 示例:`git clone -b feature https://example.com/your_project.git` ## 配置 Git 11 条命令 使用 `--global` 做出的设置会应用到这台机器上的所有仓库,并保存在 `~/ .gitconfig` 中。省略 `--global` 则只为当前仓库设置。 `git config --global user.name "<name>"` 设置 Git 为每个新提交记录的作者与提交者姓名。 示例:`git config user.name "Jacob Stopak"` ### 设置邮箱地址 安全 `git config --global user.email "<email>"` 设置 Git 为每个新提交记录的作者与提交者邮箱地址。 示例:`git config --global user.email "[email protected]"` - **撤销** `git config --global --unset user.email` ### 设置默认分支名 安全 `git config --global init.defaultBranch <name>` 设置 `git init` 为新仓库的第一个分支所取的名字。 示例:`git config --global init.defaultBranch main` `git config --global core.editor "<editor>"` 设置 Git 用于提交信息和交互式 rebase 的编辑器。对于 VS Code,使用 `code --wait`,这样 Git 会等到文件关闭后再继续。 示例:`git config --global core.editor "code --wait"` ### 列出所有配置项 安全 `git config --list` 打印来自系统、全局和仓库配置文件中的每一项设置。若同一设置出现在多个文件中,仓库配置的值覆盖全局值,全局值覆盖系统值。 示例:`git config --list` ### 为机器上的所有用户设置某个配置 安全 `git config --system <key> <value>` 将 `<key>` 设为 `<value>` 并写入系统配置文件,适用于机器上的每个用户和每个仓库。针对同一设置的全局值或仓库值会覆盖它。 示例:`git config --system core.autocrlf true` - **注意** 写入系统配置文件需要管理员权限。 ### 为命令创建别名 安全 `git config --global alias.<name> <command>` 创建一个名为 `<name>` 的 Git 命令,实际执行 `<command>`。例如 `alias.st status` 会让 `git st` 执行 `git status`。 示例:`git config --global alias.st status` ### 拉取时使用 rebase 代替合并 安全 `git config --global pull.rebase true` 让 `git pull` 把本地提交 rebase 到拉取到的提交之上,而不是创建合并提交。 示例:`git config --global pull.rebase true` ### 每次 fetch 时清理已删除的远程分支 安全 `git config --global fetch.prune true` 让 `git fetch` 删除远程跟踪分支(如 `origin/`)中那些在远程已不存在的分支。 示例:`git config --global fetch.prune true` ### 在 Windows 上转换行尾符 安全 `git config --global core.autocrlf true` 检出文件时把 LF 行尾符转换为 CRLF,提交时再转换回 LF。 示例:`git config --global core.autocrlf true` ### 保存 Git 凭据 安全 `git config --global credential.helper <helper>` 用 `<helper>`(如 Windows 上的 `manager`、macOS 上的 `osxkeychain`)存储用户名和密码或令牌,这样 Git 就不会每次都向你索取。 示例:`git config --global credential.helper cache` ## 暂存与提交 6 条命令 提交分两步:先暂存你想要的改动,然后把它们作为一个快照提交。 ### 查看仓库状态 安全 `git status` 显示当前分支、已暂存的改动、未暂存的改动以及未追踪的文件。在合并、rebase 或 cherry-pick 期间,它还会显示该操作的状态和下一步操作。 示例:`git status` ### 暂存文件改动 安全 `git add <files>` 将 `<files>` 的当前改动加入暂存区,使其包含在下次提交中。 示例:`git add app.py notes.txt` ### 暂存当前文件夹的所有改动 安全 `git add .` 暂存当前文件夹及其子文件夹中所有新增、修改和删除的文件。 示例:`git add .` ### 暂存仓库中的所有改动 安全 `git add -A` 无论在哪个文件夹下执行,都暂存仓库中所有新增、修改和删除的文件。 示例:`git add -A` ### 提交已暂存的改动 安全 `git commit -m "<message>"` 用暂存区的改动创建一个新提交,提交信息为 `<message>`,并将当前分支指向该提交。 示例:`git commit -m "Describe the project in the README"` - **撤销** `git reset --soft HEAD~1` ### 一条命令完成已追踪文件的暂存与提交 安全 `git commit -am "<message>"` 暂存所有已追踪文件的改动,并以 `<message>` 提交。未追踪的文件不会被包含。 示例:`git commit -a -m "Tweak the app and the header"` - **撤销** `git reset --soft HEAD~1` ## 管理文件 6 条命令 删除、重命名、取消追踪和忽略文件,并清理 Git 不追踪的内容。 ### 删除文件并暂存删除操作 警告 `git rm <file>` 从工作目录中删除 `<file>` 并暂存该删除。 示例:`git rm login.html` - **撤销** `git restore --staged --worktree <file>` ### 停止追踪文件但保留在磁盘上 安全 `git rm --cached <file>` 将 `<file>` 从暂存区移除,这样下次提交就不再追踪它。文件仍保留在工作目录中。 示例:`git rm --cached .env` - **撤销** `git add <file>` ### 重命名或移动文件 安全 `git mv <file> <newfile>` 把 `<file>` 重命名或移动为 `<newfile>` 并暂存该改动。 示例:`git mv app.py main.py` - **撤销** `git mv <newfile> <file>` ### 找出忽略某文件的规则 安全 `git check-ignore -v <file>` 打印忽略 `<file>` 的忽略文件、行号和匹配模式。如果文件未被忽略,则不输出任何内容。 示例:`git check-ignore -v debug.log build/app.js app.py` ### 删除所有未追踪的文件 危险 `git clean -f` 删除工作目录中所有未追踪的文件。加上 `-d` 可同时删除未追踪的文件夹。 示例:`git clean -f` - **撤销** 无法恢复 - **注意** 未追踪的文件不在 Git 的历史记录中,因此无法找回。可先运行 `git clean -n` 列出将要删除的内容。 ### 删除所有未追踪和被忽略的文件 危险 `git clean -fdx` 删除所有未追踪的文件和文件夹,包括构建产物等被忽略的内容以及 `.env` 文件。 示例:`git clean -fdx` - **撤销** 无法恢复 - **注意** 本地的被忽略文件(如设置和密钥)也会被删除。可先运行 `git clean -ndx` 列出将要删除的内容。 ## 历史记录与搜索 14 条命令 每个提交都保留了作者、日期和改动内容。这些命令可以列出、筛选并搜索它们。它们都不会改变任何东西。 ### 查看当前分支的提交历史 安全 `git log` 列出当前分支历史中的提交,按时间从新到旧排列,包含每个提交的哈希、作者、日期和提交信息。 示例:`git log` ### 查看所有分支的提交历史 安全 `git log --all` 列出所有分支和标签的历史中的提交,而不仅是当前分支。 示例:`git log --all` ### 以文本图形方式查看所有分支 安全 `git log --oneline --graph --all` 把所有分支的历史以文本图形打印出来,每个提交一行,分支名和标签名显示在对应提交旁边。 示例:`git log --oneline --graph --all` ### 逐个提交查看文件的所有改动 安全 `git log -p <file>` 列出改动过 `<file>` 的提交,每个提交都附带它增加和删除的行。 示例:`git log -p app.py` ### 跨重命名追踪文件的历史 安全 `git log --follow <file>` 列出改动过 `<file>` 的提交,包括它被重命名之前的那些提交。 示例:`git log --follow main.py` ### 查找新增或删除某字符串的提交 安全 `git log -S "<string>"` 列出新增或删除过 `<string>` 的提交,通过检查 `<string>` 出现次数的变化位置来查找。 示例:`git log -S "logging"` ### 列出某个作者的提交 安全 `git log --author "<name>"` 列出作者姓名或邮箱匹配 `<name>` 的提交。 示例:`git log --author "Ada"` ### 列出某个日期范围内的提交 安全 `git log --since "<date>" --until "<date>"` 列出在两个日期之间产生的提交。像 `2024-05-01` 这样的精确日期和像 `2 weeks ago` 这样的相对日期都可以使用。 示例:`git log --since "2024-05-01 11:00 +0000" --until "2024-05-01 13:00 +0000"` `git show <commit>` 显示某个提交的哈希、作者、日期和提交信息,随后展示它所做的改动。 示例:`git show HEAD~1` ### 查看文件每一行最后由谁修改 安全 `git blame <file>` 以提交、作者、日期的形式打印 `<file>` 中每一行的最后修改信息。 示例:`git blame app.py` ### 按作者统计提交数量 安全 `git shortlog -sn` 列出当前分支上提交过的每位作者及其提交数量,按数量从多到少排列。 示例:`git shortlog -sn` ### 用最近的标签描述提交 安全 `git describe` 用该提交历史中最近的附注标签为其命名,例如 `v1.0-2-g1a2b3c4`:标签 `v1.0`、距其 2 个提交,以及 `g` 加上该提交的短哈希。 示例:`git describe` ### 在所有已追踪文件中搜索文本 安全 `git grep -n "<string>"` 在每个已追踪的文件中搜索 `<string>`,并打印每条匹配行及其文件名和行号。 示例:`git grep -n logging` ### 定位引入 bug 的提交 安全 `git bisect start <good> <bad>` 在 `<good>` 和 `<bad>` 提交之间进行二分查找,方法是检出两者中间的那个提交。测试 Git 检出的每个提交,用 `git bisect good` 或 `git bisect bad` 标记,直到 Git 找出第一个有问题的提交。 示例:`git bisect start HEAD 4114b2c` ## 比较改动 5 条命令 精确查看文件、暂存区、提交和分支之间有哪些行发生了变化。不会改变任何内容。 ### 显示未暂存的改动 安全 `git diff` 逐行显示工作目录中尚未暂存的改动。 示例:`git diff` `git diff --staged` 逐行显示已暂存的改动,即下次提交将包含的内容。 示例:`git diff --staged` `git diff <commit1> <commit2>` 显示两个提交之间的改动。分支名和标签名可以代替提交哈希使用。 示例:`git diff HEAD~2 HEAD` `git diff <branch1>..<branch2>` 显示两个分支最新提交之间的改动。 示例:`git diff main..feature` ### 按文件汇总改动 安全 `git diff --stat` 列出每个含未暂存改动的文件及其增加和删除的行数。 示例:`git diff --stat` ## 分支 14 条命令 分支是指向某个提交的可移动指针,HEAD 指向当前分支。 ### 创建新分支但不切换过去 安全 `git branch <name>` 创建一个名为 `<name>` 的分支,指向当前提交。`HEAD` 仍停留在原分支。 示例:`git branch bugfix-header` ### 列出所有本地分支和远程跟踪分支 安全 `git branch -a` 先列出本地分支,再列出如 `remotes/origin/main` 这样的远程跟踪分支。`*` 标记的是当前分支。 示例:`git branch -a` ### 列出分支及其上游分支和领先/落后数量 安全 `git branch -vv` 列出每个本地分支及其最新提交、上游分支,以及它领先或落后多少个提交,例如 `[origin/main: ahead 1, behind 2]`。 示例:`git branch -vv` ### 列出已合并进当前分支的分支 安全 `git branch --merged` 列出那些最新提交已经包含在当前分支历史中的分支。 示例:`git branch --merged` ### 列出尚未合并进当前分支的分支 安全 `git branch --no-merged` 列出那些含有当前分支历史中所没有的提交的分支。 示例:`git branch --no-merged` ### 切换到另一个分支 安全 `git switch <branch>` 把 `HEAD` 指向 `<branch>`,并把暂存区和工作目录更新为其最新提交的状态。 示例:`git switch feature` ### 切换回上一个分支 安全 `git switch -` 切换到当前分支之前的那个分支。 示例:`git switch -` ### 从远程检出分支 安全 `git switch <branch>` 当本地不存在名为 `<branch>` 的分支但 `origin/<branch>` 存在时,基于它创建本地分支,将其设置为跟踪 `origin/<branch>`,并切换过去。 示例:`git switch feature` ### 创建新分支并切换过去 安全 `git switch -c <name>` 在当前提交处创建名为 `<name>` 的分支并切换过去。 示例:`git switch -c hotfix` ### 在特定提交处创建新分支并切换过去 安全 `git switch -c <name> <commit>` 在 `<commit>` 处创建名为 `<name>` 的分支并切换过去,`<commit>` 可以是提交哈希、标签或 `origin/main` 这样的分支。 示例:`git switch -c search origin/feature` `git branch -m <name> <newname>` 把分支 `<name>` 重命名为 `<newname>`。它的提交不会改变。 示例:`git branch -m feature search` - **撤销** `git branch -m <newname> <name>` ### 删除已合并的分支 安全 `git branch -d <name>` 删除分支 `<name>`。如果该分支含有未合并进其上游分支(没有上游时则是当前分支)的提交,Git 会拒绝执行。 示例:`git branch -d docs` - **撤销** `git branch <name>` ### 强制删除未合并的分支 危险 `git branch -D <name>` 即使分支 `<name>` 有未合并的提交,也一并删除。之后,这些提交只能通过 reflog 找到。 示例:`git branch -D feature` - **撤销** `git branch <name>` - **注意** 注意 Git 打印出的哈希。Git 最终会删除那些没有任何引用指向的提交。 ### 检出非分支的提交(游离 HEAD) 安全 `git switch --detach <commit>` 把 `HEAD` 直接指向 `<commit>` 而不是某个分支,并相应地更新工作目录。在那里提交之前,请先创建分支。 示例:`git switch --detach 96c4fc2` ## 合并 6 条命令 合并会把另一个分支的工作并入你的分支,同时保留历史发生的原貌。 ### 把分支合并进当前分支 安全 `git merge <branch>` 把 `<branch>` 合并进当前分支。当两边都有新提交时,Git 会创建一个有两个父提交的合并提交。 示例:`git merge feature` - **撤销** `git reset --hard ORIG_HEAD` ### 快进合并当前分支 安全 `git merge <branch>` 当当前分支没有 `<branch>` 所缺少的提交时,Git 把当前分支快进到 `<branch>` 的最新提交。不会创建合并提交。 示例:`git merge main` ### 即使可以快进合并,也强制创建合并提交 安全 `git merge --no-ff <branch>` 即使可以快进合并,也创建一个合并提交,让被合并的分支在历史中仍然可见。 示例:`git merge --no-ff main` - **撤销** `git reset --hard ORIG_HEAD` ### 把一个分支的改动压缩成单个提交 安全 `git merge --squash <branch>` 暂存来自 `<branch>` 的合并改动,但不提交也不记录合并。下次提交会把它们作为一个提交包含进去。 示例:`git merge --squash feature` ### 解决冲突后完成合并 安全 `git merge --continue` 在冲突已解决并用 `git add` 暂存文件后,创建合并提交。 示例:`git merge --continue` ### 中止有冲突的合并 警告 `git merge --abort` 停止合并,并把分支、暂存区和工作目录恢复到合并开始前的状态。 示例:`git merge --abort` - **撤销** 重新执行该合并 ## Rebase 与 cherry-pick 8 条命令 rebase 会把你的提交重放到另一个分支之上,使历史看起来是一条直线。cherry-pick 用同样的方式重放单个提交。 ### rebase 当前分支 安全 `git rebase <branch>` ……

相似文章

GitGlow

Product Hunt

GitGlow 发布于 Product Hunt,提供精确暂存、清晰历史记录和 checkout 感知终端的一体化本地 Git 工作区,并支持 AI 代理变更审查;个人本地克隆免费使用,无需注册账号。

@laogui: 经过几天使用,我可以毫不夸张地说:Rebased 就是目前最强的 Git 图形化客户端。 用过 JetBrains 系列 IDE 的朋友都知道,它的 Git 功能体验非常好——尤其是 Diff 功能。但这几年 JetBrains 在 AI…

X AI KOLs Timeline

Rebased 是一款基于 JetBrains IntelliJ 社区版构建的开源 Git 图形化客户端,砍掉了所有语言相关功能,只保留并优化了 Git 工具,提供了顶级的 Diff、Review、交互式 Rebase 和冲突解决体验,免费使用且零学习成本。