git checkout
本页面检查 git checkout
命令。它将涵盖用法示例和边缘案例。用 Git 的术语来说,"checkout" 是在目标实体的不同版本之间切换的行为。git checkout
命令在三个不同的实体上运行:文件、提交和分支。除了 "checkout" 的定义外,"checking out" 一词通常用于暗示执行 ggit checkout
命令。在撤销变更主题中,我们看到了如何使用 git checkout
来查看旧提交。本文档的大部分重点将放在分支的签出操作上。
签出分支与签出旧的提交和文件类似,因为工作目录会更新以匹配选定的分支/修订版本,但是,新的变更保存在项目历史记录中,也就是说,这不是只读操作。
签出分支
git checkout
命令允许您在 git branch
创建的分支之间导航。签出分支会更新工作目录中的文件以匹配存储在该分支中的版本,并告诉 Git 记录该分支上的所有新提交。可以把它看作是选择您正在开发哪个开发领域的一种方式。
与传统 SVN 工作流程相比,为每个新功能设立一个专门的分支是一个巨大的转变。它使得尝试新实验而不必担心破坏现有功能变得非常容易,并且可以同时开发许多不相关的功能。此外,分支还促进了多个协作工作流程。
git checkout
命令有时可能会与 git clone
混淆。这两个命令的区别在于,clone 可以从远程存储库获取代码,而 checkout 可以在本地系统上已有的代码版本之间切换。
相关资料
高级 Git 日志
查看解决方案
了解 Bitbucket Cloud 的 Git
用法:现有分支
假设您正在使用的代码存储库包含预先存在的分支,您可以使用 git checkout
在这些分支之间切换。要找出哪些分支可用以及当前分支的名称,请执行 git branch
。
$> git branch
main
another_branch
feature_inprogress_branch
$> git checkout feature_inprogress_branch
上方示例演示了如何通过执行 git branch
命令查看可用分支列表,以及如何切换到指定分支,在本例中为 feature_inprogress_branch
。
新分支
git checkout
与 git branch 配合使用。git branch
命令可用于创建新分支。当您想启动一个新功能时,可以使用 git branch new_branch
在 main
分支外创建一个新分支。创建后,您可以使用 git checkout new_branch
切换到该分支。此外,git checkout
命令会接受一个 -b
参数,该参数可作为一种便捷的方法,用于创建新分支并立即切换到该分支。通过使用 git checkout
在分支之间切换,您可以在单一存储库中使用多个功能。
git checkout -b <new-branch>
上面的示例同时创建和签出
。-b
选项是一个方便标记,它告诉 Git 在运行 git checkout
之前运行 git branch
。
git checkout -b <new-branch> <existing-branch>
默认 git checkout-b
会将 new-branch
建立在当前 HEAD
的基础上。可以向 git checkout
传递一个可选的附加分支参数。在上面的示例中,传递了 <
existing-branch>
,然后根据 existing-branch
而不是当前的 HEAD
作为 new-branch
的基础。
切换分支
切换分支是一项简单的操作。执行以下命令会将 HEAD
指向
的尖端。
git checkout <branchname>
Git 在 reflog 中跟踪签出操作的历史记录。您可以执行 git reflog
来查看历史记录。
Git 签出远程分支
与团队合作时,通常使用远程存储库。这些存储库可能是托管和共享的,也可能是其他同事的本地副本。每个远程存储库都将包含自己的一组分支。要签出远程分支,您必须先获取该分支的内容。
git fetch --all
在现代版本的 Git 中,您可以像本地分支一样签出远程分支。
git checkout <remotebranch>
旧版本的 Git 需要基于 remote
创建新分支。
git checkout -b <remotebranch> origin/<remotebranch>
此外,您可以签出一个新的本地分支并将其重置为上次提交的远程分支。
git checkout -b <branchname>
git reset --hard origin/<branchname>
游离的 HEAD
既然我们已经了解了 git checkout
在分支上的三个主要用途,那么讨论 “detached HEAD”
状态非常重要。请记住,HEAD
是 Git 引用当前快照的方式。在内部,git checkout
命令只会将 HEAD
更新为指向指定分支或提交。当其指向分支时,Git 不会理会,但当您签出提交时,则会切换至 “detached HEAD”
状态。
这是一个警告,告诉您,您所做的一切都与项目开发的其余部分“游离”。如果您要在游离的 HEAD
状态下开始开发某个功能,那么您就无法再重新开发分支。当您必须要签出另一个分支(例如,合并您的功能)时,就没有办法引用您的功能了:
关键是,您的开发应该始终在分支上进行,永远不要在游离的 HEAD
上进行。这可以确保您始终可以引用您的新提交。但是,如果您只是在看一个旧提交,那么您是否处于游离的 HEAD
状态并不重要。
摘要
本页重点介绍了在更改分支时 git checkout
命令的用法。总而言之,在分支上使用 git checkout
时,会改变 HEAD
引用的目标。该命令可用于创建分支、切换分支和签出远程分支。git checkout
命令是标准 Git 操作的必备工具。它与 git merge 对应。git checkout
和 git merge
命令是启用 git workflows 的关键工具。
分享此文章
下一主题
推荐阅读
将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。