Git Checkout



命令 git checkout 允许我们在分支之间切换,或者将工作目录中的文件恢复到特定分支或提交时的状态。

它支持项目管理和撤销更改。

  • git checkout 将工作目录的文件修改为与索引版本或特定提交匹配。

  • 此外,如果没有提供文件或路径,它会更新 HEAD 以切换到所选分支。

  • 我们可以使用此命令更好地使我们的工作目录与特定分支或提交匹配。

语法

git checkout [<branch-name>]

用法

Git 命令 git checkout 具有多种用途。以下是其主要用途:

1. 切换分支 - git checkout 命令允许我们在分支之间切换。它将你的工作目录和 HEAD 指针移动到指定的分支。

git checkout [<branch-name>]

2. 检出到特定提交 - 此命令还可以用于通过其哈希值检出到特定提交。这会将你的工作目录置于 分离的 HEAD 状态。

git checkout [<commit-hash>]

3. 创建新分支 - 使用以下选项,命令 git checkout -b|-B <new-branch> [<start-point>] 创建并切换到新分支

git checkout -b|-B <new-branch> [<start-point>]
  • -b <new-branch>:这将创建一个名为 <new-branch> 的新分支并切换到它。

    • 这类似于在执行 git branch <new-branch> 后使用 git checkout <new-branch>。

    • 此外,我们可以使用 --track 或 --no-track 选项指定新分支是否应该跟踪远程分支。

  • -B <new-branch>:如果新分支 <new-branch> 不存在,这将创建它。

    • 如果找到该分支,则该分支将重置为给定的 <start-point>。

    • 作为事务性操作,此选项只有在 git checkout(分支切换)成功的情况下才会重置或创建分支。

4. 恢复文件 - git checkout 命令可用于将特定文件恢复到特定提交中的先前状态。这对于撤消更改而不影响项目的其他部分非常有用。

git checkout HEAD -- samplefile.txt

5. 跟踪远程分支 - Git 将生成一个跟踪远程分支的新本地分支。

git checkout -b <branch> --track <remote>/<branch>
  • 它修改 HEAD 以指向指定的分支,并修改我们的工作目录和索引以匹配给定的 <branch>。

  • 我们可以将本地更改提交到新分支,它们将保持不变。

  • 这类似于运行 git checkout -b <branch> --track <remote>/<branch>。

    如果 <branch> 在本地不存在,但识别到同名的远程分支并且未指定 --no-guess

  • 如果没有提供分支,则该命令实际上在分支切换方面不会完成任何操作,但如果可用,它将显示当前分支的跟踪信息。

6. 分离分支 - 使用命令 git checkout --detach [<branch>]git checkout [--detach] <commit>,我们可以将 HEAD 分离到特定提交并对其进行操作。这意味着:

git checkout --detach [<branch>]
git checkout [--detach] <commit>
  • 如果 <commit> 是分支名称:--detach 检查分支,但在分支的顶端,它会分离 HEAD

  • 如果 <commit> 是提交哈希:它会保持任何本地修改不变,并在指定的提交处分离 HEAD,更新我们的工作目录和索引以反映该提交。

  • 省略 <branch>:在当前分支的顶端分离 HEAD

7. 覆盖文件 - 使用不同的参数使用 git checkout 命令时,文件内容将根据提供的路径规范被覆盖。

git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>…​
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul]
  • 在没有 <tree-ish> 的情况下,索引的内容将更新到工作树中。

  • 使用 <tree-ish> 时,它会使用指定提交或树的内容更新工作树和索引。

  • 如果使用 -f,则可以忽略索引中未合并的元素,否则它将失败。

  • --ours--theirs 等选项允许我们从索引中检出未合并路径的特定版本。

  • 可以使用 -m 选项丢弃更改来恢复冲突的合并结果。

8. 应用更改作为补丁 - git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…​] - 我们可以使用该命令交互式地评估和应用来自特定提交或树的更改。

git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…​]
  • 我们可以使用 -p--patch 选项将特定更改块应用于我们的工作目录。

  • 这使我们可以精确控制集成到文件中的修改。

选项

git checkout 命令具有以下选项:

-q

--quiet

  • 使用 -q--quiet 选项时,Git 会禁用命令输出和反馈消息。

  • 因此,命令以很少的输出运行,仅提供问题或必要信息——没有进一步的消息或状态更新。

--progress

--no-progress

  • --progress--no-progress 标志管理 Git 命令中进度状态的报告。

  • --progress:要求即使未连接到终端,也要在标准错误流上提供进度状态。

  • --no-progress:关闭输出设置和与终端附件相关的进度报告。

--ours

--theirs

  • 这些选项允许我们在从索引中检出路径时,从阶段 #2(--ours)或阶段 #3(--theirs)选择未合并路径的文件版本。

  • 变基上下文:使用 git rebasegit pull --rebase 时,我们正在变基到的分支(共享规范历史记录)由 --ours 表示。

    而我们当前正在处理的分支(各个贡献者的工作)由 --theirs 表示。

  • 变基合并来自我们分支的修改,并将远程历史记录视为权威的,这导致了这种区别。

-b <new-branch>

  • 在 Git 中,-b <new-branch> 选项完成以下任务:

    • 创建新的分支 {<new-branch>}。

    • <start-point>(可以是提交或其他引用)是新分支的起始位置。

    • 通过切换到它,使最近生成的分支成为我们工作目录中的活动分支。

-B <new-branch>

  • 使用 Git 的 -B <new-branch> 选项可以实现以下目标:

    • 它从 <start-point> 开始,并创建一个名为 <new-branch> 的新分支。

      如果该分支已存在,它会将其重置为 <start-point>。

    • 我们工作目录中当前打开的分支随后就是新创建或更新的分支。

-t

--track[=(direct|inherit)]

  • 在 Git 中创建新分支时,上游跟踪配置使用 -t--track[=(direct|inherit)] 选项。

  • 如果未给出 -b,它会根据远程跟踪分支的本地部分自动命名新分支。

  • 如果派生的名称为空或缺少斜杠,则会跳过自动命名,并且可以使用 -b 显式提供名称。

--no-track

  • 即使启用了 branch.autoSetupMerge 配置变量,它也能确保。

  • 这通常会默认设置跟踪,新分支将不会设置任何 上游 跟踪配置。

--guess

--no-guess

  • --guess:默认情况下,如果 <branch> 在本地未发现但在恰好一个远程中存在,则 Git 会自动创建并使用该远程跟踪分支。

    当分支存在于多个远程时,Git 使用 checkout.defaultRemote 提供的远程来解决歧义。

  • --no-guess:禁用自动猜测行为,这意味着如果本地未找到分支,Git 将不会从远程位置自动构建或跟踪它。

    可以使用 checkout.guesscheckout.defaultRemote 设置更改默认行为。

-l

  • Git 中的 -l 选项确保在创建新分支时添加 reflog。

  • reflog 会跟踪分支的更新历史记录,这对于监控修改和纠正错误非常有用。

-d

--detach

  • -d--detach 检查提交而不是分支,允许在不影响任何分支的情况下进行检查或测试。

  • git checkout <commit> 使用提交而不是分支名称时,这是默认值。

--orphan <new-branch>

  • <start-point> 创建一个新的、无提交的分支 <new-branch>

  • 新的、孤立的历史记录将从该分支上的第一次提交开始。

  • 调整索引和工作树以匹配 <start-point> 为新提交或新项目提供了一个新的起点。

  • 这在使用白板启动项目或创建全新的历史记录时非常有用。

--ignore-skip-worktree-bits

  • 此选项保证在使用稀疏检出模式时,git checkout -- <paths> 会更新 <paths> 中所有指定的文件,同时带回任何被跳过的文件并忽略稀疏检出模式。

-m

--merge

  • --m,也称为 --merge:此选项允许我们即使存在本地更改也能交换分支,方法是在目标分支、我们的工作树和当前分支之间完成三方合并。

  • 出现的冲突会保持独立,需要手动解决。

  • 从索引中检出路径时,此选项还允许重建冲突的合并;但是,它不能与 tree-ish 一起使用。

  • 使用 --merge 时,请记住可能会丢失暂存的修改。

--conflict=<style>

  • 此选项的工作方式类似于--merge,不同之处在于它允许我们选择用于呈现冲突部分的样式。

  • 三个样式,"merge"(默认)、"diff3""zdiff3"是可以覆盖merge.conflictStyle设置的值。

--patch

  • 基于工作树和<tree-ish>(或索引)之间的差异,启用交互式选择块。

  • 通过反向将选定的块应用于工作树(以及给定的索引),可以有选择地丢弃编辑。

  • 此选项不支持叠加模式,默认情况下以非叠加模式运行。

--ignore-other-worktrees

  • 由于--ignore-other-worktrees,即使另一个工作树已检出该引用,也允许许多工作树使用该引用,从而允许git checkout继续进行。

--overwrite-ignore

--no-overwrite-ignore

  • --overwrite-ignore:切换分支时,静默覆盖被忽略的文件(默认行为)。

  • --no-overwrite-ignore:如果在新分支中发现被忽略的文件,则停止分支切换。

--recurse-submodules

  • 使用--recurse-submodules命令更新每个活动子模块,使其与超项目中记录的提交相匹配。

    如果子模块中的本地更改被覆盖并且也没有使用-f,则检出将失败。

  • --no-recurse-submodules:不修改子模块的工作树;子模块保持不变。

--overlay

  • --overlay:默认模式,其中git checkout不会删除索引或工作树中的文件。

  • --no-overlay:删除工作树和索引中不属于<tree-ish>的文件,确保它们完全匹配。

从 Git 2.23 开始,git checkout已拆分为更具体的命令

git switch(用于切换分支)。点击这里了解更多详情。

git restore(用于恢复文件)。点击这里了解更多详情。

广告