Git在查看分支上以前的任何提交时开始分离头?

Git在查看分支上以前的任何提交时开始分离头?,git,git-branch,git-bash,git-detached-head,Git,Git Branch,Git Bash,Git Detached Head,我是一个较新的git用户,所以这可能是一个愚蠢的问题,但每当我在我的开发分支中使用类似git checkout 050aa9f的东西签出任何以前的提交时,git都会立即拆下头部: 你处于“超脱的头部”状态。你可以四处看看,做实验 更改并提交它们,您可以放弃在此过程中所做的任何提交 通过执行另一个签出,在不影响任何分支的情况下进行状态设置 如果要创建新分支以保留创建的提交,可以 再次将-b与checkout命令一起使用(现在或以后)。例如: git签出-b HEAD现在位于050aa9f[此处代码

我是一个较新的git用户,所以这可能是一个愚蠢的问题,但每当我在我的
开发
分支中使用类似
git checkout 050aa9f
的东西签出任何以前的提交时,git都会立即拆下头部:

你处于“超脱的头部”状态。你可以四处看看,做实验 更改并提交它们,您可以放弃在此过程中所做的任何提交 通过执行另一个签出,在不影响任何分支的情况下进行状态设置

如果要创建新分支以保留创建的提交,可以 再次将-b与checkout命令一起使用(现在或以后)。例如:

git签出-b

HEAD现在位于050aa9f[此处代码提交标题]

但是,当我从另一个分支(如
master
)签出提交时,它不会分离头部

我有没有做过什么事,以某种方式破坏了我的树?我如何找到它的起点,如何修复它

因为当我签出主分支时,它不会创建分离的头

首先,确保这样做,确保处理分支或提交(签出也处理文件,现在更好地使用)

其次,当您签出master时,您将切换到对分支头提交的间接引用。
间接原因是:

  • .git/HEAD
    将包括“
    refs/heads/master
  • .git/refs/heads/master
    将包括实际的SHA1
与签出/切换提交相反,签出/切换提交和
.git/HEAD
直接包括SHA1(无分支间接寻址)

这就是我喜欢这个新命令的原因:正如我在“”中解释的那样,默认情况下它需要一个分支,而不是提交。很难得到一个不需要的/意外的分离头

因为当我签出主分支时,它不会创建分离的头

首先,确保这样做,确保处理分支或提交(签出也处理文件,现在更好地使用)

其次,当您签出master时,您将切换到对分支头提交的间接引用。
间接原因是:

  • .git/HEAD
    将包括“
    refs/heads/master
  • .git/refs/heads/master
    将包括实际的SHA1
与签出/切换提交相反,签出/切换提交和
.git/HEAD
直接包括SHA1(无分支间接寻址)

这就是我喜欢新命令的原因:正如我在“”中所解释的,默认情况下它需要一个分支,而不是提交。很难以一个不想要的/意外的分离头结束

每当我[使用]<代码>git签出050aa9f。。。git立即取下头部

这是因为这种
git签出
特别是请求分离
HEAD

任何时候,如果您使用的不是分支名称,但可以解析为提交哈希ID,
git checkout
将使您处于分离头模式。但是,每当您使用分支名称时,
git checkout
将使您处于正常模式。(Git不称这种“附加头”模式,但这显然是该模式的正确名称。)

这里有几个棘手的问题,其中一些问题通过使用新的(在Git 2.23和更高版本中)
Git开关
命令得到了部分解决。我将在这里介绍它们,但请记住,其中一些是高级Git,您不需要立即了解所有内容。 每当我[使用]<代码>git签出050aa9f。。。git立即取下头部

这是因为这种
git签出
特别是请求分离
HEAD

任何时候,如果您使用的不是分支名称,但可以解析为提交哈希ID,
git checkout
将使您处于分离头模式。但是,每当您使用分支名称时,
git checkout
将使您处于正常模式。(Git不称这种“附加头”模式,但这显然是该模式的正确名称。)


这里有几个棘手的问题,其中一些问题通过使用新的(在Git 2.23和更高版本中)
Git开关
命令得到了部分解决。我将在这里介绍它们,但请记住,其中一些是高级Git,您不需要立即了解所有内容。您是否可以展示正在运行的命令示例,这些命令用于从
开发
签出以前的提交,以及从另一个分支签出提交?还有,你有没有理由相信你的树可能被破坏了?(例如,文件丢失或损坏,运行
git log
时历史记录丢失等)签出特定提交时,无论提交在哪个分支上,都会导致头分离。你可以把一个独立的头看作一个无名的分支。这不是一个错误。如果您感到困惑,请始终使用
git checkout-b temp\u foo
从提交中创建本地分支(在本例中命名为
temp\u foo
)。当你认为是时候的时候,你可以用
git branch-D temp\u foo
删除
temp\u foo
。事实上,这是git工具箱中最强大的工具之一。@DavidZ我已经更新了我的OP来反映这一点,但通过键入
git checkout 050aa9f
来获得上面的结果。我用腐败这个词是因为它最接近我认为会发生的事情,但我真正的意思是,我会不会因为我的承诺、合并而把事情搞砸了,等等?@JhonPiper知道您运行什么命令从
master
签出一个提交,这样它就不会分离头部,这仍然是非常有用的。您可以展示一下您正在运行的命令示例,这些命令用于从
Development
签出以前的提交,以及从另一个分支签出一个提交吗?还有,你有没有理由相信你的树可能被破坏了?(例如,丢失或损坏的文件、丢失的hi)