跳到主要内容

Git 命令、概念与术语:开发者与写作者的必备工具

· 阅读需 79 分钟

本文将 Git 命令、概念与术语。为了让初次接触 Git 的朋友也能轻松跟上,我们将从简单介绍基本概念开始。

Git:不再是开发者的专属工具!

过去,Git 主要被视为开发者使用的专业工具,但如今它已经成为博主、作家以及喜欢整理笔记的人们的必备工具。

Git 是什么?

简单来说,Git 是一个版本控制系统。它可以帮助你记录计算机文件的更改,并在需要时回到特定的时间点。 首先,Git 是一个记录代码或文件更改历史,并在多人协作时防止冲突的版本控制系统。简单来说,它是一个可以安全“保存”和“共享”所有工作的数字工作空间。

举个例子,当你在写小说时,如果对内容不满意,想要 “回到一周前的版本”,Git 可以让这种魔法成为可能。

如今,Git 也经常与 Obsidian、Logseq 等笔记管理工具结合使用,广泛应用于个人知识管理(PKM)中。

对于初学者,建议从 GUI 工具开始使用。(如 Sourcetree, GitKraken, GitHub Desktop, VS Code 等)

基本的 Git 工作流程

---- Git Workflow ---
[工作目录 (Working Directory)] 🖥️
|
| 文件操作(修改、添加、删除)
| |
| | git add <文件> (暂存变更)
| ↓
v
[暂存区 (Staging Area)] 📦
|
| git commit -m "消息" (提交变更)

[本地仓库 (Local Repository)] 🏠
|
| git push origin <分支> (将更改推送到远程仓库)

[远程仓库 (Remote Repository)] 🌍
|
| git pull origin <分支> (git fetch + git merge 组合)

[协作者的本地仓库] 🏠
|
| git merge(合并)
| |
| | 冲突解决 (Conflict Resolution , 如果需要)
| ↓
v
[协作者的工作目录 (Working Directory)] 🖥️

Git 术语整理

术语说明使用示例/场景
工作目录 (Working Directory)当前正在磁盘上操作的项目文件和目录,包括 Git 已跟踪和未跟踪的文件。git status (查看工作目录的状态)
暂存区 (Staging Area)用于准备提交的临时存储区域。通过 git add 命令将文件添加到此区域,提交时会将这些更改保存到仓库中。git add <文件> (将文件添加到暂存区)
索引 (Index)Git 内部使用的技术性术语,指用于跟踪文件状态的数据结构,与 暂存区 通常是同义词,但更具体地表示 Git 内部的文件快照和元数据结构。git ls-files --stage (查看索引中的文件列表)
工作树 (Worktree)允许在同一个 Git 仓库中管理多个工作目录的功能,每个目录对应一个分支,适用于需要同时开发多个任务的场景。git worktree add <路径> <分支> (添加新的工作树)
HEAD指向当前工作分支最新提交的指针。通常指向分支名称,表示当前所在的分支。git checkout main (HEAD 指向 main 分支)
分离头指针 (Detached HEAD)HEAD 直接指向某个提交而不是分支的状态。在此状态下可以创建新提交,但由于没有分支引用,可能会丢失这些提交。可以通过创建分支来保存这些提交,避免丢失。git checkout <提交哈希> (进入分离头指针状态)
仓库 (Repository)Git 管理的项目存储库,包含完整的项目历史和元数据。分为本地仓库(存储在本地的项目历史)和远程仓库(存储在远程服务器上的项目历史)。git init (创建本地仓库), git clone <URL> (克隆远程仓库)
提交 (Commit)保存文件更改的行为。每个提交都有唯一的哈希值标识,并包含提交信息、作者、时间戳等元数据。git commit -m "提交信息"
分支 (Branch)创建代码的独立版本。默认存在 mainmaster 分支,用于并行开发和实验性功能。git branch feature-branch (创建新分支)
切换 (Checkout)切换到特定分支或提交的命令。git switch 是更现代的替代命令。git checkout feature-branch (切换分支)
合并 (Merge)将两个分支的更改合并为一个。分为快进合并(Fast-forward)和三方合并(Three-way merge)。git merge feature-branch (将 feature-branch 合并到当前分支)
拉取 (Pull)将远程仓库的更改拉取到本地仓库并合并。git pullgit fetchgit merge 的组合。git pull origin main (拉取远程 main 分支的更改)
推送 (Push)将本地仓库的更改上传到远程仓库。默认推送到与当前分支关联的远程分支。git push origin feature-branch (将 feature-branch 推送到远程仓库)
获取 (Fetch)将远程仓库的更改拉取到本地仓库,但不合并。用于查看远程仓库的最新状态。git fetch origin (获取远程仓库的更改)
克隆 (Clone)将远程仓库复制到本地的操作。git clone https://github.com/user/repo.git
分叉 (Fork)将远程仓库复制到自己的账户中。通常用于开源项目贡献,允许在不影响原仓库的情况下进行修改。GitHub 上的 "Fork" 按钮
拉取请求 (Pull Request, PR)将自己分支的更改请求合并到原仓库的操作。通常用于代码审查和协作开发。GitHub 上的 "New Pull Request" 按钮
储藏 (Stash)临时保存当前工作目录的更改并清理工作目录。适用于需要切换分支但不想提交未完成工作的情况。git stash (临时保存更改), git stash pop (恢复临时保存的更改)
变基 (Rebase)将分支的基址重置为另一个提交,使提交历史更整洁。注意:变基会重写提交历史,可能导致冲突。git rebase main (将当前分支变基到 main 分支)
标签 (Tag)为特定提交打上标签。通常用于版本发布,分为轻量标签(Lightweight)和附注标签(Annotated)。git tag v1.0.0 (创建 v1.0.0 标签)
远程 (Remote)指向远程仓库的引用。通常命名为 origin,用于与团队协作和同步代码。git remote add origin <URL> (添加远程仓库)
冲突 (Conflict)合并两个分支时,同一文件的同一部分被修改导致的冲突。需要手动编辑冲突文件,删除冲突标记后保存更改,再将文件添加到暂存区并完成提交。合并时出现冲突需手动解决
拣选 (Cherry-pick)将特定提交应用到当前分支的操作。适用于从其他分支选择性应用更改。git cherry-pick <提交哈希> (应用特定提交)
重置 (Reset)将当前分支的 HEAD 重置到特定提交。--soft 保留更改,--mixed 重置暂存区,--hard 完全丢弃更改。git reset --hard HEAD~1 (完全回退到上一个提交)
回退 (Revert)创建一个新的提交来撤销特定提交。适用于需要保留历史记录的场景。git revert <提交哈希> (撤销特定提交)
追溯 (Blame)查看文件中每一行是谁在何时修改的,适用于代码审查、定位问题代码或了解变更背景。git blame <文件> (查看文件的修改历史)
日志 (Log)查看提交历史。常用选项包括 --oneline--graph--statgit log (查看提交历史)
差异 (Diff)比较文件的更改。常用命令包括 git diff(工作目录与暂存区)、git diff --cached(暂存区与最新提交)。git diff (比较工作目录和暂存区的差异)
暂存 (Stage)将更改从工作目录添加到暂存区,以便在提交时包括这些更改。git add <文件> (将文件添加到暂存区)
取消暂存 (Unstage)将暂存区中的更改移回工作目录,适用于撤销误添加或重新修改文件。git reset <文件> (将文件从暂存区移除)
忽略 (Ignore)指定 Git 不跟踪的文件或目录。通过 .gitignore 文件定义,常用于排除临时文件、编译输出、日志文件或本地配置文件等不需要版本控制的内容。.gitignore 文件中添加 node_modules/
子模块 (Submodule)将其他 Git 仓库包含在当前项目中的方法。适用于管理依赖项或共享代码库。git submodule add <URL> (添加子模块)
二分查找 (Bisect)通过二分查找定位引入 bug 的提交。适用于快速定位问题代码。git bisect start, git bisect bad, git bisect good
钩子 (Hooks)Git 操作中在特定事件发生时自动执行的脚本。钩子位于 .git/hooks 目录,适用于代码格式检查、运行测试、触发构建或执行其他自动化任务。pre-commitpost-commit 等钩子脚本
引用日志 (Reflog)查看 Git 中所有操作的记录。适用于恢复误操作或丢失的提交。git reflog (查看操作记录)
上游 (Upstream)指向远程仓库默认分支的术语。通常指 origin/mainorigin/master,用于同步远程更改。git push --set-upstream origin feature-branch (设置上游分支)

Git 命令

1. 仓库配置

git config

git config 是用于管理 Git 配置的命令。通过该命令可以设置或查看用户名、邮箱、编辑器、别名等配置。配置可以在全局(global)、本地(local)和系统(system)级别进行管理。

Git config 文件的类型:

  • system 配置文件:适用于所有用户(很少使用)
    • macOS/Linux: /etc/gitconfig,如果是通过 Homebrew 安装的 Git,可能位于 /usr/local/etc/gitconfig
    • Windows: C:\Program Files\Git\etc\gitconfig
  • global 配置文件:适用于当前用户,位于 ~/.gitconfig
  • local 配置文件:仅适用于特定仓库,位于 <repo>/.git/config

可以使用 -e 选项查看配置文件的位置(例如:git config --global -e)。

global vs. local 通常用户信息使用global配置,项目特定设置使用local配置。

配置优先级: local config> global config > system config

命令及选项说明
git config --list查看当前所有生效的配置。
git config --global管理全局配置(适用于当前用户)。
git config --local管理本地配置(仅适用于当前仓库)。
git config --get <key>查看特定配置的值。
git config --add <key> <value>添加新的配置。
git config --unset <key>删除特定配置。
git config --edit-e使用编辑器打开配置文件进行修改。
git config --show-origin查看配置值的来源。

使用示例:

# 查看当前所有生效的配置
git config --list

# 查看全局配置
git config --global --list

# 在全局配置中添加用户名
git config --global user.name "John Doe"

# 在全局配置中添加用户邮箱
git config --global user.email "john@example.com"

# 查看特定配置的值(例如:用户名)
git config --get user.name

# 删除特定配置(例如:用户名)
git config --global --unset user.name

# 使用编辑器打开配置文件
git config --global --edit

# 查看配置值的来源
git config --show-origin user.name

git alias

git alias 是一个非常实用的功能,它可以将常用的长命令简化为短别名,从而让操作更加高效。你可以通过 git config 命令来设置别名,也可以直接编辑 .gitconfig 文件进行配置。

1. 使用 git config 设置alias

# 设置别名(常用别名)
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.unstage 'reset HEAD --' # 将文件从暂存区移除
git config --global alias.last 'log -1 HEAD' # 查看最近一次提交
git config --global alias.amend 'commit --amend' # 修改最近一次提交

# 查看所有别名
git config --get-regexp alias
# 删除别名
git config --global --unset alias.<别名>

# 使用示例
git co main # 等同于 `git checkout main`
git br # 等同于 `git branch`
git ci -m "提交信息" # 等同于 `git commit -m "提交信息"`
git st # 等同于 `git status`
git unstage file.txt # 等同于 `git reset HEAD file.txt`
git last # 等同于 `git log -1 HEAD`
git amend # 等同于 `git commit --amend`

2. 2. 通过配置文件 .gitconfig 设置alias 你也可以直接编辑 .gitconfig 文件来设置别名。.gitconfig 文件通常位于用户的主目录下(~/.gitconfig)。

[alias]
co = checkout
br = branch
ci = commit
st = status
last = log -1 HEAD
lg = log --oneline --graph --decorate --all

2. 创建仓库

创建 Git 仓库的方式有两种:git initgit clone

git init

git init 是用于初始化一个新的 Git 仓库的命令。该命令会在当前目录或指定目录下创建一个名为 .git 的隐藏子目录,从而将该目录初始化为 Git 仓库。

命令及选项说明
git init在当前目录初始化一个新的 Git 仓库。
git init <directory>在指定目录初始化一个新的 Git 仓库。
git init --bare初始化一个没有工作目录的裸仓库。
git init --quiet初始化过程中减少输出信息。
git init --initial-branch <name>指定初始分支名称(默认:main)。

使用示例:

# 在当前目录初始化一个新的 Git 仓库
git init

# 在指定目录初始化一个新的 Git 仓库
git init my-repo

# 初始化一个裸仓库(无工作目录)
git init --bare

# 初始化过程中减少输出信息
git init --quiet

# 指定初始分支名称进行初始化
git init --initial-branch develop

git clone

git clone 是 Git 版本控制系统中用于将远程仓库(remote repository)克隆到本地仓库(local repository)的命令。该命令会将远程仓库的完整历史记录和文件复制到本地。

命令及选项说明
git clone <repository>将远程仓库克隆到本地。
git clone <repository> <directory>将远程仓库克隆到指定目录。
git clone --branch <branch>克隆指定分支。
git clone --depth <depth>仅克隆指定深度的提交历史(浅克隆)。
git clone --single-branch仅克隆指定分支。
git clone --recurse-submodules克隆时包含子模块。
git clone --bare克隆为裸仓库(无工作目录)。
git clone --mirror克隆为镜像仓库(完全复制远程仓库)。

使用示例:

# 基本克隆
git clone https://github.com/user/repo.git

# 克隆到指定目录
git clone https://github.com/user/repo.git my-directory

# 仅克隆指定分支
git clone --single-branch --branch main https://github.com/user/repo.git

# 浅克隆(仅克隆最近一次提交)
git clone --depth 1 https://github.com/user/repo.git

# 克隆时包含子模块
git clone --recurse-submodules https://github.com/user/repo.git

# 克隆为裸仓库(无工作目录)
git clone --bare https://github.com/user/repo.git

# 克隆为镜像仓库
git clone --mirror https://github.com/user/repo.git

3. 变更跟踪与管理

git status

git status 是用于显示当前工作目录和暂存区状态的 Git 命令。通过该命令,可以一目了然地查看哪些文件被修改了,哪些文件已经准备好提交等。

git status 状态值说明:

git status 状态说明跟踪状态文件状态
UntrackedGit 未跟踪的新文件。(可通过 git add 添加到暂存区)Untracked-
ModifiedGit 跟踪的文件已被修改但未暂存。TrackedModified
Staged变更已添加到暂存区的文件。(可通过 git commit 提交)TrackedStaged
Unstaged变更存在于工作目录但未暂存。TrackedUnstaged
DeletedGit 跟踪的文件已被删除。(可通过 git rm 暂存删除)TrackedDeleted
Renamed文件名已更改。(需通过 git mv 或手动更改后暂存)TrackedRenamed
Copied复制现有文件生成的新文件。(可通过 git add 暂存)TrackedCopied
Unmerged发生冲突的文件。(冲突解决后需 git addTrackedUnmerged
Ignored.gitignore 忽略的文件。(可通过 git status --ignored 查看)Ignored-

git status 命令:

命令及选项说明
git status查看工作目录和暂存区的状态。
git status -s--short以简短格式查看状态信息。
git status --branch同时查看分支信息。
git status --untracked-files-u查看未跟踪文件的状态。(例如:no, normal, all
git status --verbose查看详细的状态信息。

使用示例:

# 基本状态查看
git status

# 以简短格式查看状态
git status -s

# 查看分支信息
git status --branch

# 查看未跟踪文件的状态
git status --untracked-files=all

# 查看详细的状态信息
git status --verbose

git add

git add 是将工作目录中的变更添加到暂存区(staging area)的命令。该命令用于准备提交的文件,使 Git 能够跟踪这些变更。

命令及选项说明
git add <file>将特定文件添加到暂存区。
git add .将当前目录的所有变更添加到暂存区。
git add -A将工作目录的所有变更添加到暂存区。
git add -u仅将已跟踪文件的变更添加到暂存区。
git add --patch-p以交互方式选择变更并添加到暂存区。
git add --force-f强制将忽略的文件添加到暂存区。

使用示例:

# 将特定文件添加到暂存区
git add file.txt

# 将当前目录的所有变更添加到暂存区
git add .

# 将工作目录的所有变更添加到暂存区
git add -A

# 仅将已跟踪文件的变更添加到暂存区
git add -u

# 以交互方式选择变更并添加到暂存区
git add --patch

# 强制将忽略的文件添加到暂存区
git add --force

git diff

git diff 是 Git 中用于比较变更的命令。该命令用于查看工作目录、暂存区和提交之间的差异。它会以行为单位显示文件的添加、删除和修改。

命令及选项说明
git diff查看工作目录和暂存区的差异。
git diff --cached查看暂存区和最新提交的差异。
git diff HEAD查看工作目录和最新提交的差异。
git diff <commit>查看工作目录和特定提交的差异。
git diff <commit1> <commit2>查看两个提交之间的差异。
git diff --stat查看变更文件的统计信息。
git diff --name-only仅查看变更文件的名称。
git diff --name-status查看变更文件的名称和状态(添加、修改、删除等)。
git diff --color为输出添加颜色。
git diff --word-diff以单词为单位查看差异。
git diff --ignore-space-change忽略空格变更查看差异。
git diff --diff-filter=<filter>仅查看特定状态的文件。(例如:A 添加, M 修改, D 删除)
git diff --check检查空格错误。
git diff --quiet仅检查是否有差异。(无输出)

使用示例:

# 查看工作目录和暂存区的差异
git diff

# 查看暂存区和最新提交的差异
git diff --cached

# 查看工作目录和最新提交的差异
git diff HEAD

# 查看工作目录和特定提交的差异
git diff abc1234

# 查看两个提交之间的差异
git diff abc1234 def5678

# 查看变更文件的统计信息
git diff --stat

# 仅查看变更文件的名称
git diff --name-only

# 查看变更文件的名称和状态
git diff --name-status

# 为输出添加颜色
git diff --color

# 以单词为单位查看差异
git diff --word-diff

# 忽略空格变更查看差异
git diff --ignore-space-change

# 仅查看特定状态的文件(例如:添加的文件)
git diff --diff-filter=A

# 检查空格错误
git diff --check

# 仅检查是否有差异(无输出)
git diff --quiet

git stash

git stash 是用于临时保存当前工作目录中变更的命令。它将当前工作目录的变更保存到栈中,并将工作目录恢复到干净状态,以便进行其他操作。之后可以重新应用这些保存的变更。

  • git stash 将工作目录的变更保存到栈中。
  • 可以保存多个 stash,每个 stash 都有一个唯一的标识符(stash@{n})。
命令及选项说明
git stash临时保存当前工作目录中的变更。
git stash save "<message>"附带消息临时保存变更。
git stash list查看已保存的 stash 列表。
git stash apply应用最近保存的 stash。
git stash apply <stash>应用特定的 stash。
git stash pop应用最近保存的 stash 并从栈中移除。
git stash drop移除最近保存的 stash。
git stash clear移除所有 stash。
git stash show查看最近保存的 stash 的变更内容。
git stash show -p以补丁格式查看最近保存的 stash 的变更内容。
git stash --include-untracked将未跟踪的文件也保存到 stash 中。

使用示例:

# 临时保存当前工作目录中的变更
git stash

# 附带消息临时保存变更
git stash save "WIP: Working on feature X"

# 查看已保存的 stash 列表
git stash list

# 应用最近保存的 stash
git stash apply

# 应用特定的 stash
git stash apply stash@{1}

# 应用最近保存的 stash 并从栈中移除
git stash pop

# 移除最近保存的 stash
git stash drop

# 移除所有 stash
git stash clear

# 查看最近保存的 stash 的变更内容
git stash show

# 以补丁格式查看最近保存的 stash 的变更内容
git stash show -p

# 将未跟踪的文件也保存到 stash 中
git stash --include-untracked

git commit

git commit 是将暂存区(staging area)中的文件变更保存到本地仓库的命令。每次提交代表一个逻辑上的变更单元,可以看作是工作的快照。

commit의 구성 요소:

  • 提交哈希 (Commit Hash): 用于唯一标识提交的 40 位 SHA-1 哈希值。
    • 哈希值基于提交的内容(变更、作者、日期等)生成。
  • 树对象 (Tree Object): 表示提交时工作目录结构的对象。
    • 树对象存储文件和目录的结构,并包含每个文件的哈希值。
    • 通过树对象可以重建提交时的文件状态。
  • 父提交 (Parent Commit): 指向当前提交的上一个提交(父提交)的哈希值。
    • 通常有一个父提交,但合并提交可能有两个或多个父提交。
    • 通过父提交可以追踪提交历史。
  • 作者 (Author): 创建提交的人的姓名和邮箱。
  • 提交者 (Committer): 实际将提交记录到仓库的人的姓名和邮箱。(可能与作者不同)
  • 提交日期 (Commit Date): 提交创建的日期和时间。
  • 提交消息 (Commit Message): 对提交变更的描述。
  • GPG 签名 (GPG Signature) (可选): 使用 --gpg-sign 选项为提交添加 GPG 签名,确保提交的完整性(是否被篡改)。
命令及选项说明
git commit提交暂存区的变更。(打开提交消息编辑器)
git commit -m "<message>"直接输入提交消息并提交。
git commit -a自动暂存已跟踪文件的变更并提交。
git commit --amend修改最新提交。(更改提交消息或添加文件)
git commit --no-verify提交前不运行钩子(hook)脚本。
git commit --allow-empty创建空提交。(无变更提交)
git commit --signoff在提交消息中添加 Signed-off-by 行。
git commit --no-edit不修改提交消息直接执行 --amend
git commit --fixup=<commit>创建用于修改特定提交的提交。(与 rebase --autosquash 一起使用)
git commit --squash=<commit>创建用于与特定提交合并的提交。(与 rebase --autosquash 一起使用)

使用示例:

# 提交暂存区的变更(打开提交消息编辑器)
git commit

# 直接输入提交消息并提交
git commit -m "添加新功能"

# 自动暂存已跟踪文件的变更并提交
git commit -a -m "更新已跟踪文件"

# 修改最新提交(更改提交消息或添加文件)
git commit --amend

# 提交前不运行钩子脚本
git commit --no-verify -m "绕过钩子"

# 创建空提交(无变更提交)
git commit --allow-empty -m "空提交"

# 在提交消息中添加 Signed-off-by 行
git commit --signoff -m "添加签名"

# 不修改提交消息直接执行 --amend
git commit --amend --no-edit

# 创建用于修改特定提交的提交
git commit --fixup=abc1234

# 创建用于与特定提交合并的提交
git commit --squash=abc1234

git log

git log 是用于查看 Git 仓库提交历史的命令。通过该命令可以查看提交的哈希值、作者、日期、提交消息等信息。

命令及选项说明
git log查看提交历史。
git log -n <number>仅查看最近的 N 个提交。
git log --oneline以单行格式简要查看提交信息。
git log --stat查看提交中变更文件的统计信息。
git log --patch-p以补丁格式查看提交中的变更内容。
git log --graph以图形格式查看提交历史。
git log --pretty=<format>以美观格式输出提交信息。(例如:oneline, short, full, fuller
git log --since=<date>仅查看特定日期之后的提交。(例如:2023-10-01, 2.weeks.ago
git log --until=<date>仅查看特定日期之前的提交。(例如:2023-10-31, 1.day.ago
git log --author=<pattern>仅查看特定作者的提交。
git log --grep=<pattern>仅查看提交消息中匹配特定模式的提交。
git log -- <path>仅查看特定文件或目录的提交历史。
git log --no-merges排除合并提交。
git log --decorate同时查看分支和标签信息。
git log --abbrev-commit缩短提交哈希值的显示。
git log --name-only仅查看变更文件的名称。
git log --name-status查看变更文件的名称和状态(添加、修改、删除等)。
git log --all查看所有引用(分支、标签等)的提交历史。

使用示例:

# 查看提交历史
git log

# 仅查看最近的 5 个提交
git log -n 5

# 以单行格式简要查看提交信息
git log --oneline

# 查看提交中变更文件的统计信息
git log --stat

# 以补丁格式查看提交中的变更内容
git log --patch

# 以图形格式查看提交历史
git log --graph

# 以美观格式输出提交信息
git log --pretty=oneline

# 仅查看特定日期之后的提交(例如:2023-10-01 之后)
git log --since="2023-10-01"

# 仅查看特定日期之前的提交(例如:2023-10-31 之前)
git log --until="2023-10-31"

# 仅查看特定作者的提交(例如:作者名为 "John")
git log --author="John"

# 仅查看提交消息中匹配特定模式的提交(例如:"bugfix")
git log --grep="bugfix"

# 仅查看特定文件或目录的提交历史(例如:src/main.c)
git log -- src/main.c

# 排除合并提交
git log --no-merges

# 同时查看分支和标签信息
git log --decorate

# 缩短提交哈希值的显示
git log --abbrev-commit

# 仅查看变更文件的名称
git log --name-only

# 查看变更文件的名称和状态
git log --name-status

# 查看所有引用(分支、标签等)的提交历史
git log --all

git show

git show 是用于显示特定提交、标签或树的详细信息的命令。该命令在查看提交的变更内容、作者、日期、提交消息等信息时非常有用。

命令及选项说明
git show <commit>显示特定提交的详细信息。
git show <tag>显示特定标签指向的提交的详细信息。
git show <tree>显示特定树的详细信息。
git show --oneline以单行格式简要显示提交信息。
git show --stat显示提交中变更文件的统计信息。
git show --patch-p以补丁格式显示提交中的变更内容。
git show --name-only仅显示变更文件的名称。
git show --name-status显示变更文件的名称和状态(添加、修改、删除等)。
git show --format=<format>以自定义格式输出提交信息。
git show --no-patch不显示补丁信息。
git show --color为输出添加颜色。
git show --quiet仅显示提交消息,省略其他信息。

使用示例:

# 显示特定提交的详细信息
git show abc1234

# 显示特定标签指向的提交的详细信息
git show v1.0.0

# 显示特定树的详细信息
git show HEAD:path/to/file

# 以单行格式简要显示提交信息
git show --oneline abc1234

# 显示提交中变更文件的统计信息
git show --stat abc1234

# 以补丁格式显示提交中的变更内容
git show --patch abc1234

# 仅显示变更文件的名称
git show --name-only abc1234

# 显示变更文件的名称和状态
git show --name-status abc1234

# 以自定义格式输出提交信息
git show --format="%h - %an, %ar : %s" abc1234

# 不显示补丁信息,仅显示提交消息
git show --no-patch abc1234

# 为输出添加颜色
git show --color abc1234

# 仅显示提交消息
git show --quiet abc1234

5. 分支管理

git branch

git branch 是 Git 中用于创建、查看和删除分支的命令。分支是分离和合并工作的核心功能,通过 git branch 可以有效地管理分支。

命令及选项说明
git branch查看本地分支列表。
git branch <branch>创建新分支。
git branch -d <branch>删除分支。(仅可删除已合并的分支)
git branch -D <branch>强制删除分支。(未合并的分支也可删除)
git branch -m <new-branch>重命名当前分支。
git branch -a查看所有分支(本地 + 远程)。
git branch -r查看远程分支列表。
git branch --merged查看已合并到当前分支的分支列表。
git branch --no-merged查看未合并到当前分支的分支列表。
git branch --set-upstream-to=<remote>/<branch>设置当前分支的上游(跟踪分支)。
git branch --unset-upstream取消当前分支的上游(跟踪分支)设置。
git branch --verbose-v查看分支列表,并显示每个分支的最新提交消息。

使用示例:

# 查看本地分支列表
git branch

# 创建新分支
git branch feature-branch

# 删除分支(仅可删除已合并的分支)
git branch -d feature-branch

# 强制删除分支(未合并的分支也可删除)
git branch -D feature-branch

# 重命名当前分支
git branch -m new-branch-name

# 查看所有分支(本地 + 远程)
git branch -a

# 查看远程分支列表
git branch -r

# 查看已合并到当前分支的分支列表
git branch --merged

# 查看未合并到当前分支的分支列表
git branch --no-merged

# 设置当前分支的上游分支
git branch --set-upstream-to=origin/main

# 取消当前分支的上游分支设置
git branch --unset-upstream

# 查看分支列表,并显示每个分支的最新提交消息
git branch --verbose

git checkout

git checkout 是 Git 中用于切换分支或将工作目录恢复到特定提交或文件的命令。它广泛应用于分支切换、文件状态恢复、提交检出等操作。

尽管目前在 git --help 中已不再推荐使用该命令,但它仍然被广泛使用。

The git-checkout(1) command is seen by many as hard to understand because it connects two somewhat unrelated features: switching between branches and restoring worktree files from arbitrary revisions. In 2019, we thus implemented two new commands git-switch(1) and git-restore(1) to split out these separate concerns into standalone functions. (참고: Commit 028bb23)

意思是由于一个命令同时处理分支切换和文件恢复这两个不相关的功能,给用户带来了困惑。因此,从 Git 2.23 开始,git checkout 命令被拆分为 git switchgit restore 两个命令。

因为仍然被广泛使用,说目前没有弃用计划。

命令及选项说明
git checkout <branch>切换到指定分支。
git checkout -b <new-branch>创建新分支并切换到该分支。
git checkout <commit>将工作目录移动到指定提交。(进入 Detached HEAD 状态)
git checkout -- <file>将工作目录中的指定文件恢复到最新提交状态。
git checkout .将工作目录中的所有变更恢复到最新提交状态。
git checkout -f强制将工作目录恢复到最新提交状态。(忽略所有变更)
git checkout --patch-p以交互方式选择变更并恢复。
git checkout --track <remote>/<branch>创建并切换到跟踪远程分支的本地分支。
git checkout --detach将当前分支切换到 Detached HEAD 状态。
git checkout --merge在切换分支时,如果发生冲突则自动尝试合并。

使用示例:

# 切换到指定分支
git checkout main

# 创建新分支并切换到该分支
git checkout -b feature-branch

# 将工作目录移动到指定提交(进入 Detached HEAD 状态)
git checkout abc1234

# 将工作目录中的指定文件恢复到最新提交状态
git checkout -- file.txt

# 将工作目录中的所有变更恢复到最新提交状态
git checkout .

# 强制将工作目录恢复到最新提交状态
git checkout -f

# 以交互方式选择变更并恢复
git checkout --patch

# 创建并切换到跟踪远程分支的本地分支
git checkout --track origin/feature-branch

# 将当前分支切换到 Detached HEAD 状态
git checkout --detach

# 在切换分支时,如果发生冲突则自动尝试合并
git checkout --merge feature-branch

git switch

git switch 命令是 Git 2.23 版本引入的一个新命令,它的主要目的是为了取代传统的 git checkout 命令,提供一种更简洁、直观的分支切换方式。

为什么引入 git switch?

  • 更清晰的命令意图: git switch 的命令名更明确地表达了它的功能,即切换分支。
  • 减少歧义: git checkout 命令既可以用于创建新分支,也可以用于切换分支,这在某些情况下可能会导致混淆。
  • 更符合直觉: switch 这个词在日常生活中更常用于表示切换,因此更容易记忆和理解。
명령어 및 옵션설명
git switch <branch>특정 브랜치로 전환.
git switch -c <new-branch>새로운 브랜치를 생성하고 전환.
git switch --detach <commit>특정 커밋으로 작업 디렉토리를 이동. (Detached HEAD 상태)
git switch --track <remote>/<branch>원격 브랜치를 추적하는 로컬 브랜치를 생성하고 전환.
git switch --force충돌이 발생해도 강제로 브랜치를 전환.
git switch --merge브랜치 전환 시 충돌이 발생하면 자동으로 병합을 시도.

使用示例:

# 切换到指定分支
git switch main

# 创建新分支并切换到该分支
git switch -c feature-branch

# 将工作目录移动到指定提交(进入 Detached HEAD 状态)
git switch --detach abc1234

# 创建并切换到跟踪远程分支的本地分支
git switch --track origin/feature-branch

# 即使发生冲突也强制切换分支
git switch --force feature-branch

# 在切换分支时,如果发生冲突则自动尝试合并
git switch --merge feature-branch

git merge

git merge 是将两个分支的变更合并为一个的命令。通常用于将已完成功能开发的分支合并到主分支。合并可以通过 Fast-forward3-way mergeConflict Resolution(冲突解决)等多种方式完成。

合并方式:

合并方式条件说明
-ff (默认)无分叉或分叉内容相同将分支指针移动到目标分支的末尾。保持历史线性,且不生成合并提交。
--ff-only无分叉仅允许快进合并,如果无法快进合并则中止操作。适用于需要保持历史线性时。
--no-ff无条件无论是否可以进行快进合并,始终生成合并提交。在历史中清晰记录合并操作。
3-way存在分叉基于公共祖先创建合并提交。历史中会保留分叉痕迹。若发生冲突需要手动解决。
--squash无条件将目标分支的所有提交压缩为一个提交并应用。保持历史线性,但不会保留目标分支的单独提交记录。

Fast-forward merge: --ff vs --no-ff :

* 合并 feature 分支时:
- main: A --- B --- C
\
- feature: D --- E --- F

1. 执行 `git merge --no-ff feature`
- main: A --- B --- C ------------------- M
\ /
- feature: D --- E --- F ---
- 生成合并提交 M。
- feature 分支的历史在 main 分支中完整保留。

2. 执行 `git merge --ff feature`(在快进合并条件下)
- main: A --- B --- C --- D --- E --- F
\
- feature: D --- E --- F
- 不生成合并提交。
- main 分支指向 feature 分支的最新提交。

命令及选项说明
git merge <branch>将指定分支合并到当前分支。
git merge --no-ff <branch>禁用 Fast-forward 合并,始终生成新的合并提交。
git merge --ff-only <branch>仅允许 Fast-forward 合并。如果无法 Fast-forward,则中止合并。
git merge --squash <branch>将指定分支的变更合并到当前分支,但将其压缩为一个新的提交。
git merge --abort合并过程中发生冲突时,中止合并并恢复到合并前的状态。
git merge --continue解决冲突后继续合并过程。
git merge --no-commit <branch>执行合并但不自动提交。
git merge --stat合并后显示变更的统计信息。
git merge --strategy=<策略>指定合并策略。例如:recursive, ours, subtree 等。
git merge --strategy-option=<选项>指定合并策略的选项。例如:ours, theirs, patience 等。

使用示例:

# 将指定分支合并到当前分支
git merge feature-branch

# 禁用 Fast-forward 合并(始终生成新的合并提交)
git merge --no-ff feature-branch

# 仅允许 Fast-forward 合并(无法 Fast-forward 则中止)
git merge --ff-only feature-branch

# 将指定分支的变更压缩为一个提交并合并
git merge --squash feature-branch

# 合并过程中发生冲突时中止并恢复
git merge --abort

# 解决冲突后继续合并
git merge --continue

# 执行合并但不自动提交
git merge --no-commit feature-branch

# 合并后显示变更的统计信息
git merge --stat feature-branch

# 指定合并策略(例如:recursive)
git merge --strategy=recursive feature-branch

# 指定合并策略选项(例如:ours)
git merge --strategy-option=ours feature-branch

6. 远程仓库

git remote

git remote 是用于管理远程仓库的命令。可以通过该命令添加、查看、删除远程仓库,或修改远程仓库的 URL 等。

命令及选项说明
git remote查看远程仓库列表。
git remote -v查看远程仓库列表及其 URL。
git remote add <name> <url>添加新的远程仓库。
git remote remove <name>删除已注册的远程仓库。
git remote rename <old> <new>重命名远程仓库。
git remote set-url <name> <url>修改远程仓库的 URL。
git remote show <name>查看特定远程仓库的详细信息。
git remote prune <name>清理本地不存在的远程分支。
git remote update更新远程仓库的所有分支和标签。
git remote get-url <name>查看特定远程仓库的 URL。
git remote set-branches <name> <branch>指定远程仓库中要跟踪的分支。
git remote add --track <branch> <name> <url>添加远程仓库并设置跟踪特定分支。

使用示例:

# 查看远程仓库列表
git remote

# 查看远程仓库列表及其 URL
git remote -v

# 添加新的远程仓库
git remote add origin https://github.com/user/repo.git

# 删除已注册的远程仓库
git remote remove origin

# 重命名远程仓库
git remote rename origin upstream

# 修改远程仓库的 URL
git remote set-url origin https://github.com/user/new-repo.git

# 查看特定远程仓库的详细信息
git remote show origin

# 清理本地不存在的远程分支
git remote prune origin

# 更新远程仓库的所有分支和标签
git remote update

# 查看特定远程仓库的 URL
git remote get-url origin

# 指定远程仓库中要跟踪的分支
git remote set-branches origin main

# 添加远程仓库并设置跟踪特定分支
git remote add --track main origin https://github.com/user/repo.git

git pull

git pull 是将远程仓库的变更拉取到本地仓库并合并的命令。它是 git fetchgit merge 的组合,通常用于将远程分支的最新状态同步到本地。

命令及选项说明
git pull拉取当前分支的远程仓库变更并合并。
git pull <remote> <branch>拉取指定远程仓库和分支的变更并合并。
git pull --rebase拉取变更后执行变基(rebase)而非合并。
git pull --ff-only仅允许 Fast-forward 合并。如果无法 Fast-forward,则中止。
git pull --no-ff禁用 Fast-forward 合并,始终生成新的合并提交。
git pull --autostash自动暂存工作目录中的变更,合并后再恢复。
git pull --no-commit执行合并但不自动提交。
git pull --tags拉取远程仓库的所有标签。
git pull --no-tags不拉取标签。

使用示例:

# 拉取当前分支的远程仓库变更并合并
git pull

# 拉取指定远程仓库和分支的变更并合并
git pull origin main

# 拉取变更后执行变基
git pull --rebase

# 仅允许 Fast-forward 合并(无法 Fast-forward 则中止)
git pull --ff-only

# 禁用 Fast-forward 合并(始终生成新的合并提交)
git pull --no-ff

# 自动暂存工作目录中的变更,合并后再恢复
git pull --autostash

# 执行合并但不自动提交
git pull --no-commit

# 拉取远程仓库的所有标签
git pull --tags

# 不拉取标签
git pull --no-tags

git push

git push 是将本地仓库的变更上传到远程仓库的命令。通常用于将本地的提交同步到远程仓库。可以推送分支、标签或特定提交。

命令及选项说明
git push推送当前分支的变更到远程仓库。
git push <remote> <branch>推送指定远程仓库和分支的变更。
git push <remote> <tag-name>推送指定标签到远程仓库。
git push --all推送所有分支的变更到远程仓库。
git push --tags推送所有标签到远程仓库。
git push --force-f强制推送变更。(注意:会覆盖远程仓库的现有提交)
git push --force-with-lease强制推送,但仅当远程分支与本地一致时才执行。
git push --delete <remote> <branch>删除远程仓库的指定分支。
git push --set-upstream <remote> <branch>推送当前分支到远程仓库并设置为上游分支。
git push --dry-run模拟推送。仅显示将要推送的变更,不实际执行推送。
git push --prune删除远程仓库中本地不存在的分支。
git push --no-verify推送前不运行钩子(hook)脚本。
git push --follow-tags推送时自动推送所有相关的标签。

使用示例:

# 推送当前分支的变更到远程仓库
git push

# 推送指定远程仓库和分支的变更
git push origin main

# 推送指定标签到远程仓库
git push origin v1.0.0

# 推送所有分支的变更到远程仓库
git push --all

# 推送所有标签到远程仓库
git push --tags

# 强制推送变更(注意:会覆盖远程仓库的现有提交)
git push --force

# 强制推送,但仅当远程分支与本地一致时才执行
git push --force-with-lease

# 删除远程仓库的指定分支
git push --delete origin old-branch

# 推送当前分支到远程仓库并设置为上游分支
git push --set-upstream origin feature-branch

# 模拟推送(仅显示将要推送的变更)
git push --dry-run

# 删除远程仓库中本地不存在的分支
git push --prune origin

# 推送前不运行钩子脚本
git push --no-verify

# 推送时自动推送所有相关的标签
git push --follow-tags

git fetch

git fetch 是将远程仓库的变更拉取到本地仓库的命令。与 git pull 不同,fetch 不会自动合并变更。因此,它更安全,允许用户在需要时手动合并。

| 命令及选项                      | 说明                                                                                             |
|-------------------------------------|------------------------------------------------------------------------------------------------|
| `git fetch` | 拉取远程仓库的所有变更。 |
| `git fetch <remote>` | 拉取指定远程仓库的所有变更。 |
| `git fetch <remote> <branch>` | 拉取指定远程仓库的特定分支变更。 |
| `git fetch --all` | 拉取所有远程仓库的数据。 |
| `git fetch --prune` | 清理本地不存在的远程分支。 |
| `git fetch --tags` | 拉取远程仓库的所有标签。 |
| `git fetch --force` | 强制拉取远程数据,覆盖本地分支的变更。 |

**使用示例:**

```bash
# 拉取远程仓库的所有变更
git fetch

# 拉取指定远程仓库的所有变更
git fetch origin

# 拉取指定远程仓库的特定分支变更
git fetch origin main

# 拉取所有远程仓库的变更
git fetch --all

# 清理本地不存在的远程分支
git fetch --prune

# 拉取远程仓库的所有标签
git fetch --tags

# 强制拉取远程数据,覆盖本地分支的变更
git fetch --force

7. 标签

git tag

git tag 是用于在特定提交上添加或管理标签的命令。标签通常用于标记发布版本(例如 v1.0.0),以便轻松引用提交。标签分为 Lightweight 标签和 Annotated 标签两种类型。

  • Lightweight 标签: 仅是一个指向提交的名称,不包含额外信息(如消息、签名等)。通过 git tag <tagname> 创建。
  • Annotated 标签: 包含标签名称、消息、签名、作者信息等。通常用于标记发布版本。通过 git tag -a <tagname> 创建。
  • 标签推送: 默认情况下,标签不会通过 git push 推送到远程仓库。需要显式指定推送标签。(参考 git push
  • 删除(-d)本地标签后,若需删除远程仓库中的标签,需使用 git push <remote> --delete <tagname>
命令及选项说明
git tag查看所有标签列表。
git tag <tagname>在当前提交上添加 Lightweight 标签。
git tag -a <tagname>在当前提交上添加 Annotated 标签。(需要输入消息)
git tag -a <tagname> -m "<message>"添加 Annotated 标签并指定消息。
git tag <tagname> <commit>在特定提交上添加标签。
git tag -d <tagname>删除特定标签。
git tag -l "<pattern>"查看与特定模式匹配的标签列表。(例如:v1.*
git tag --contains <commit>查看包含特定提交的标签列表。
git tag --points-at <commit>查看指向特定提交的标签列表。
git tag --sort=<key>按特定键对标签列表排序。(例如:version:refname, -version:refname
git tag -f <tagname>强制覆盖现有标签。(注意:不建议覆盖已发布的标签)
git tag --sign为标签添加 GPG 签名。(仅适用于 Annotated 标签)

使用示例:

# 查看所有标签列表
git tag

# 在当前提交上添加 Lightweight 标签
git tag v1.0.0

# 在当前提交上添加 Annotated 标签(需要输入消息)
git tag -a v1.0.0

# 添加 Annotated 标签并指定消息
git tag -a v1.0.0 -m "Release version 1.0.0"

# 在特定提交上添加标签
git tag v1.0.0 abc1234

# 删除特定标签
git tag -d v1.0.0

# 查看与特定模式匹配的标签列表(例如:v1.*)
git tag -l "v1.*"

# 查看包含特定提交的标签列表
git tag --contains abc1234

# 查看指向特定提交的标签列表
git tag --points-at abc1234

# 按版本顺序对标签列表排序
git tag --sort=version:refname

# 按逆序对标签列表排序
git tag --sort=-version:refname

# 强制覆盖现有标签(注意:不建议覆盖已发布的标签)
git tag -f v1.0.0

# 为标签添加 GPG 签名
git tag --sign v1.0.0

8. 提交记录(日志)

🔗git log

🔗git show

git blame

git blame 是用于查看特定文件中每一行最后一次修改的提交和作者的命令。该命令在追踪代码的特定部分由谁、何时修改时非常有用。

命令及选项说明
git blame <file>查看特定文件中每一行最后一次修改的提交和作者。
git blame -L <start>,<end> <file>查看特定文件中特定行范围的修改记录。
git blame -C <file>追踪文件中复制的代码的原始提交。
git blame -M <file>追踪文件中移动的代码的原始提交。
git blame -w忽略空格变更,仅查看代码变更。
git blame -e显示作者的电子邮件地址。
git blame -l显示完整的提交哈希值。
git blame -t显示提交的时间戳。
git blame -s显示简短的提交哈希值。
git blame --ignore-rev <commit>忽略特定提交并显示结果。
git blame --ignore-revs-file <file>忽略文件中列出的提交并显示结果。

使用示例:

# 查看特定文件中每一行最后一次修改的提交和作者
git blame README.md

# 查看特定文件中第 10 行到第 20 行的修改记录
git blame -L 10,20 README.md

# 追踪文件中复制的代码的原始提交
git blame -C README.md

# 追踪文件中移动的代码的原始提交
git blame -M README.md

# 忽略空格变更,仅查看代码变更
git blame -w README.md

# 显示作者的电子邮件地址
git blame -e README.md

# 显示完整的提交哈希值
git blame -l README.md

# 显示提交的时间戳
git blame -t README.md

# 显示简短的提交哈希值
git blame -s README.md

# 忽略特定提交并显示结果
git blame --ignore-rev abc1234 README.md

# 忽略文件中列出的提交并显示结果
git blame --ignore-revs-file .git-blame-ignore-revs README.md

git reflog

git reflog 是 Reference Logs 的缩写,用于显示 Git 中 HEAD 和分支的移动记录。该命令在恢复误删的分支或提交时非常有用。reflog 仅在本地仓库中保留,不会与远程仓库同步。

命令及选项说明
git reflog查看 HEAD 的移动记录。
git reflog <branch>查看特定分支的移动记录。
git reflog --all查看所有引用(分支、标签等)的移动记录。
git reflog --date=<format>指定日期格式查看记录。(例如:iso, relative, local
git reflog --since=<time>仅查看特定时间之后的记录。(例如:2.weeks.ago, 2023-10-01
git reflog --until=<time>仅查看特定时间之前的记录。(例如:1.day.ago, 2023-10-31
git reflog --grep=<pattern>仅查看与特定模式匹配的记录。

使用示例:

# 查看 HEAD 的移动记录
git reflog

# 查看特定分支的移动记录
git reflog main

# 查看所有引用(分支、标签等)的移动记录
git reflog --all

# 指定日期格式查看记录(例如:ISO 格式)
git reflog --date=iso

# 仅查看特定时间之后的记录(例如:2 周前)
git reflog --since=2.weeks.ago

# 仅查看特定时间之前的记录(例如:1 天前)
git reflog --until=1.day.ago

# 仅查看与特定模式匹配的记录(例如:包含 "merge" 的记录)
git reflog --grep=merge

9. 撤销修改及回退

🔗git checkout

git reset

git reset 命令是 Git 中一个非常强大的命令,用于回退版本。它可以将当前 HEAD 指向不同的提交,从而达到撤销修改的目的。

reset 命令有三种模式,对工作区、暂存区有不同影响:

模式    作用影响范围使用场景
--soft仅移动分支指针(HEAD),不修改暂存区和工作目录。- 分支指针移动到指定提交
- 暂存区和工作目录保持不变
撤销提交但保留更改在暂存区,便于重新提交。
--mixed移动分支指针(HEAD)并重置暂存区,但不修改工作目录。- 分支指针移动到指定提交
- 暂存区被重置
- 工作目录保持不变
撤销提交并取消暂存更改,但保留工作目录中的修改。
--hard移动分支指针(HEAD)、重置暂存区和工作目录。- 分支指针移动到指定提交
- 暂存区被重置
- 工作目录被重置
完全丢弃最近的提交和所有更改,恢复到指定提交的状态。

示例命令对比:

命令效果
git reset --soft HEAD~1撤销最近一次提交,但保留更改在暂存区。
git reset --mixed HEAD~1撤销最近一次提交,并将更改从暂存区移除,但保留工作目录中的修改。
git reset --hard HEAD~1撤销最近一次提交,并丢弃所有暂存区和工作目录的更改。
命令及选项说明
git reset <commit>将当前分支的 HEAD 移动到特定提交。(默认:--mixed
git reset --soft <commit>将 HEAD 移动到特定提交,但暂存区和工作目录不会更改。
git reset --mixed <commit>将 HEAD 移动到特定提交并重置暂存区,但工作目录不会更改。(默认行为)
git reset --hard <commit>将 HEAD 移动到特定提交并重置暂存区和工作目录。(注意:更改将永久丢失)
git reset <file>从暂存区移除特定文件。(未提交的更改将保留)
git reset --patch-p以交互方式选择更改并从暂存区移除。
git reset --keep <commit>将 HEAD 移动到特定提交,但保留工作目录的更改。

使用示例:

# 현재 브랜치의 HEAD를 특정 커밋으로 이동 (기본: --mixed)
git reset abc1234

# HEAD를 특정 커밋으로 이동하지만, 스테이징 영역과 작업 디렉토리는 변경하지 않음 (--soft)
git reset --soft abc1234

# HEAD를 특정 커밋으로 이동하고, 스테이징 영역을 리셋하지만 작업 디렉토리는 변경하지 않음 (--mixed)
git reset --mixed abc1234

# HEAD를 특정 커밋으로 이동하고, 스테이징 영역과 작업 디렉토리를 모두 리셋 (--hard)
git reset --hard abc1234

# 특정 파일을 스테이징 영역에서 제거
git reset file.txt

# 변경 사항을 인터랙티브하게 선택하여 스테이징 영역에서 제거
git reset --patch

# HEAD를 특정 커밋으로 이동하지만, 작업 디렉토리의 변경 사항을 유지 (--keep)
git reset --keep abc1234

git restore

git restore 是 Git 2.23 版本引入的一个新命令,用于简化和改进文件恢复操作。它比 git checkout git reset 命令更专注于恢复文件内容和工作区状态。

命令及选项说明
git restore <file>将工作目录中的文件恢复到最新提交状态。
git restore --staged <file>将暂存区中的文件恢复到最新提交状态。(工作目录不会更改)
git restore --source=<commit> <file>将工作目录或暂存区中的文件恢复到特定提交的状态。
git restore --worktree <file>仅恢复工作目录中的文件。(暂存区不会更改)
git restore --patch-p以交互方式选择更改并恢复。
git restore --quiet恢复过程中减少输出。
git restore --ignore-unmerged不恢复合并冲突的文件。
git restore --recurse-submodules同时恢复子模块的更改。

使用示例:

# 将工作目录中的文件恢复到最新提交状态
git restore file.txt

# 将暂存区中的文件恢复到最新提交状态
git restore --staged file.txt

# 将工作目录中的文件恢复到特定提交的状态
git restore --source=HEAD~2 file.txt

# 仅恢复工作目录中的文件(暂存区不会更改)
git restore --worktree file.txt

# 以交互方式选择更改并恢复
git restore --patch file.txt

# 恢复过程中减少输出
git restore --quiet file.txt

# 不恢复合并冲突的文件
git restore --ignore-unmerged file.txt

# 同时恢复子模块的更改
git restore --recurse-submodules

10. 리베이스

git rebase

git rebase 是用于重新构建分支提交历史的命令。它可以将当前分支的提交重新定位到另一个分支的最新提交上,从而创建更整洁的提交历史。通常用于替代 git merge,有助于保持提交历史的线性。

  • 在 rebase 过程中发生冲突时,解决冲突后需运行 git rebase --continue
  • 在交互模式(-i)下,可以修改、删除、合并或重新排序提交。(例如,将 pick 改为 squash 可以将多个提交合并为一个。)
命令及选项说明
git rebase <branch>将当前分支重新定位到指定分支的最新提交上。
git rebase -i <commit>以交互模式重新定位提交。(可以修改、删除、合并提交等)
git rebase --continue解决冲突后继续 rebase。
git rebase --abort中止 rebase 并恢复到原始状态。
git rebase --skip跳过导致冲突的提交。
git rebase --onto <newbase>将当前分支重新定位到特定提交(newbase)上。
git rebase --autostash自动暂存工作目录中的更改,rebase 后恢复。
git rebase --root从初始提交开始执行 rebase。
git rebase --no-verify在 rebase 前不运行钩子(hook)脚本。

使用示例:

# 将当前分支重新定位到 main 分支的最新提交上
git rebase main

# 以交互模式重新定位提交(可以修改、删除、合并提交等)
git rebase -i HEAD~3

# 解决冲突后继续 rebase
git rebase --continue

# 中止 rebase 并恢复到原始状态
git rebase --abort

# 跳过导致冲突的提交
git rebase --skip

# 将当前分支重新定位到特定提交(newbase)上
git rebase --onto newbase oldbase

# 自动暂存工作目录中的更改,rebase 后恢复
git rebase --autostash

# 从初始提交开始执行 rebase
git rebase --root

# 在 rebase 前不运行钩子脚本
git rebase --no-verify

11. 子模块

git submodule

git Submodule(子模块)允许你将一个独立的 Git 仓库作为另一个 Git 仓库的子目录。这对于管理大型项目或需要将第三方库集成到项目中的情况非常有用。

命令及选项说明
git submodule add <repository>添加新的子模块。
git submodule init初始化子模块。(将 .gitmodules 文件中定义的子模块设置到本地)
git submodule update更新子模块。(将子模块更新为父仓库引用的提交)
git submodule update --init初始化并更新子模块。
git submodule update --remote将子模块更新为远程仓库的最新提交。
git submodule sync同步子模块的 URL 与 .gitmodules 文件。
git submodule status查看子模块的状态。
git submodule deinit <path>禁用特定子模块。
git submodule foreach <command>对所有子模块执行特定命令。

使用示例:

# 添加新的子模块
git submodule add https://github.com/user/repo.git path/to/submodule

# 初始化子模块
git submodule init

# 更新子模块
git submodule update

# 初始化并更新子模块
git submodule update --init

# 将子模块更新为远程仓库的最新提交
git submodule update --remote

# 同步子模块的 URL
git submodule sync

# 查看子模块状态
git submodule status

# 禁用特定子模块
git submodule deinit path/to/submodule

# 对所有子模块执行特定命令
git submodule foreach 'git checkout main'

12. 其他有用的命令

git cherry-pick

git cherry-pick 直译过来就是“挑选樱桃”,它允许你从其他分支中“摘取”特定的提交(commit),并将其应用到当前分支上。换句话说,你可以将某个分支上的单个提交“复制”到另一个分支。

**为什么使用 Cherry-Pick?

  • 选择性合并: 当你只想从另一个分支合并特定的修改,而不是整个分支时。

  • 修复bug: 如果在某个分支上修复了一个bug,想要将这个修复应用到其他分支。

  • cherry-pick 过程中发生冲突时,解决冲突后需运行 git cherry-pick --continue

  • 若要中止冲突解决,可以使用 git cherry-pick --abort

命令及选项说明
git cherry-pick <commit>将特定提交应用到当前分支。
git cherry-pick <commit1> <commit2>将多个提交应用到当前分支。
git cherry-pick <start>^..<end>将特定范围的提交应用到当前分支。
git cherry-pick --continue解决冲突后继续 cherry-pick。
git cherry-pick --abort中止 cherry-pick 并恢复到原始状态。
git cherry-pick --skip跳过导致冲突的提交。
git cherry-pick --no-commit仅应用更改而不创建提交。
git cherry-pick --edit在 cherry-pick 时编辑提交消息。
git cherry-pick --signoff在提交消息中添加 Signed-off-by 行。
git cherry-pick --ff如果可能,使用 Fast-forward 执行 cherry-pick。

使用示例:

# 将特定提交应用到当前分支
git cherry-pick abc1234

# 将多个提交应用到当前分支
git cherry-pick abc1234 def5678

# 将特定范围的提交应用到当前分支
git cherry-pick start-commit^..end-commit

# 解决冲突后继续 cherry-pick
git cherry-pick --continue

# 中止 cherry-pick 并恢复到原始状态
git cherry-pick --abort

# 跳过导致冲突的提交
git cherry-pick --skip

# 仅应用更改而不创建提交
git cherry-pick --no-commit abc1234

# 在 cherry-pick 时编辑提交消息
git cherry-pick --edit abc1234

# 在提交消息中添加 Signed-off-by 行
git cherry-pick --signoff abc1234

# 如果可能,使用 Fast-forward 执行 cherry-pick
git cherry-pick --ff abc1234

git bisect

git bisect 是使用二分查找(binary search)来定位引入 bug 的提交的命令。该命令在精确查找 bug 何时引入时非常有用。git bisect 通过指定好的状态(good)和坏的状态(bad),然后检查中间提交来定位问题提交。

locust
命令及选项说明
git bisect start开始二分查找。
git bisect good <commit>标记特定提交为好的状态(good)。
git bisect bad <commit>标记特定提交为坏的状态(bad)。
git bisect reset结束二分查找并返回原始分支。
git bisect run <command>自动执行二分查找。运行指定命令来判断当前提交是好是坏。
git bisect log查看二分查找的日志。
git bisect skip跳过当前提交。

使用示例:

# 开始二分查找
git bisect start

# 标记当前提交为坏的状态
git bisect bad

# 标记特定提交为好的状态
git bisect good abc1234

# 结束二分查找并返回原始分支
git bisect reset

# 自动执行二分查找(使用测试脚本)
git bisect run ./test-script.sh

# 查看二分查找的日志
git bisect log

# 跳过当前提交
git bisect skip