当我在git中切换分支时,我使用checkout
命令。通常会出现这种情况,我想简单地返回并在某个提交中查看项目的状态。我一直在使用git checkout <commit hash>
。这几乎总是让我处于一个分离头部的状态。
我想知道是否有人可以向我解释为什么我们可以在不分离头部的情况下签出分支,但是如果不分离HEAD
指针则无法以相同的方式签出特定的提交?我犯了一个错误:git reset
来查看旧提交,这当然会删除提交后的所有内容。
为什么git checkout <commit hash>
分离头部?如果这不是我正在尝试做的正确命令是什么?
答案 0 :(得分:3)
HEAD
的主要目的之一是它成为您创建的任何新提交的父提交。通常,HEAD
引用采用两种形式之一 - 对分支提示的符号引用(例如master
)或特定提交的哈希。第一种是“正常”操作模式,新提交导致1)新提交的父设置为当前HEAD
表示的哈希,2)分支引用是当前移动HEAD
引用的目标以指向新提交。第二种情况称为“已分离”,因为您的HEAD
引用当前未附加到分支,而是附加到可能是也可能不是分支提示的特定提交。这不是问题,但只是提醒您,因为如果您创建新提交,您没有要更新的分支,那么您所做的任何新提交除了HEAD
之外什么都没有指向它们。如果你然后检查一个不同的分支,那么根本没有指向新的提交,所以你冒着失去它们的风险(仍然有HEAD
reflog,所以你通常可以恢复,尽管如此)。
所以,简短的回答是,不,没有办法在没有分离HEAD
或创建新分支的情况下检查任意非分支提示(但如果你只是想要看看旧版提交中的内容,这是没有意义的,因为你最终会得到许多无用的分支,这会使你的命名空间变得混乱。HEAD
分离是没有坏处的,这是一种正常的方法。在git
内工作。当你做git status
这样的事情时,它会提醒你,这样你就可以记住你在...... {/ p>
答案 1 :(得分:1)
您确实正确使用结帐。在git中,提交按特定顺序排列。例如,这将是您的典型历史:
A - B - C - D <-- branch master
\ E - F <-- branch feature
不确定设计决定是什么,但它很方便。分支始终指向分支中的最后一次提交。因此,当checkout master
获得D
时,checkout feature
将获得提交F
。因为当你检查一个分支 - 你对它的当前状态感兴趣而你(可能)想要从最后一次改变开始继续工作。
当您查看单个提交时 - 您会查找并通常还原。您很少想要使用提交C
开始执行某些操作,因为它之后已经提交D
(因此C
基本上是&#34;过时&#34;)。如果你想基于某个提交工作 - 你可以用git branch
从它开始一个新的分支。
答案 2 :(得分:1)
当您结帐分支时,您会分离HEAD。您将其从正在处理的分支中分离出来。然后你立即将它贴在你要去的树枝上。当您签出提交时,您无法将HEAD附加到。