在 Git 中重新附加头部
Git 仓库可以定义为一组对象和引用。分支是我们用来展示我们工作的对象。Git 还处理引用特定分支中提交的标签。
commit
可能是源代码在某个时间点使用的状态。Commits
包括父辈和子辈,以及关于谁创建了提交以及何时创建的完整数据。提交
作为分支中的对象放置在仓库中。
HEAD
引用指向当前分支中最新的最后一次提交。HEAD
指针是对当前签出分支的引用,它指向分支的顶部。
但是,你可以在不签出分支的情况下及时返回。你可以使用 HEAD
指针来抓取分支中的任何提交,然后你可以使用索引轻松抓取文件的任何版本。
你可以使用 HEAD
指针和索引指针对 Git 中称为 分离 HEAD
状态的特定提交执行签出
。此外,你可以签出特定提交并根据分支中的特定提交创建新分支。
如果我们只是偶尔这样,这不会成为问题。但是,如果我们重复很多次,我们很快就会开始想知道如何回到我们正在处理的那个分支。
解决方法很简单,在我们签出一个分支之前,我们应该使用命令 git checkout master
。此命令将我们带回到提交完成之前我们正在处理的分支,但它不会影响我们正在检查的提交。
一个干净的解决方案是建立一个新的 Git 仓库,专门用于保存补丁系列,并使其可供其他人随时提取最新的分支。
这些情况非常罕见,以至于实现分离 HEAD 的可用性和性能成本超过了它们的好处,因此 Git 目前缺乏此功能。Git 可以修改提交。但是,不可能修改分离的 HEAD 上的最后一次提交。
Git 有一种方法来永久删除提交,方法是创建一个秘密分支,在该分支中记录提交数据,然后从 HEAD
永久删除提交。但是,此功能仅在单个提交与 HEAD
分离时可用。如果一个提交有多个父级,则不可能从该分支中删除它。
Git 中的头部分离
但是,当我们切换到另一个分支时,情况就不同了。如果我们检查了我们的工作目录,它会更新为 HEAD
,我们不能再修改其中的文件,或者如果它们与我们切换到的分支不冲突,我们可以创建一些新的更改。
在这种情况下,HEAD
与当前分支分离。同时,我们可以使用 git checkout
命令更改分支,而无需将工作目录更新为 HEAD
,因此 HEAD
可以在附加的同时分离。
这很令人困惑,但如果我们想要在不快速接触工作目录的情况下在分支之间切换或切换到不同的分支并同时签出新的工作目录时,它会派上用场。我们可以使用 git checkout -b <newbranchname> <commit>
来执行此操作。
我们可以这样执行;只需检查我们想要的分支。
$ git checkout <branch>
例如:
$ git checkout master
如果我们想保留我们正在处理的更改,我们应该创建一个新分支或将我们的更改存储在分支中。任何不能成为我们分支名称的最近提交的签出
都会给我们一个分离的 HEAD。
当 HEAD
分离时,提交看起来很正常,除了没有更新命名分支。它就像一个未知的分支。例如,我们可以说,如果我们先检查一个远程分支,然后再跟踪它;最终,我们将得到一个分离的 HEAD
。
Abdul is a software engineer with an architect background and a passion for full-stack web development with eight years of professional experience in analysis, design, development, implementation, performance tuning, and implementation of business applications.
LinkedIn