Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 在分离的头部状态下进行更改并提交_Git_Git Checkout - Fatal编程技术网

Git 在分离的头部状态下进行更改并提交

Git 在分离的头部状态下进行更改并提交,git,git-checkout,Git,Git Checkout,我使用git checkout来访问git树中较早的提交。Git向我显示了以下消息: You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a

我使用
git checkout
来访问git树中较早的提交。Git向我显示了以下消息:

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

这是否意味着当我返回到最近的提交时(使用
git checkout master
),我在这里所做的任何更改(即使通过提交它们)都不会被保留?

分离头状态中的更改将被保留,直到git垃圾收集(GC)将其删除

关于的文档非常好:

重要的是要认识到,在这一点上,没有什么是指提交最终提交f(扩展为提交e)将被例行的Git垃圾收集过程删除,除非我们在此之前创建引用。

这意味着,您可以
签出
/
切换到另一个引用的分支。(例如,
git-switch-main
)或使用
git-switch-c newbranch
git-checkout-b newbranchname
创建新分支以保留当前分离的工作树

创建新分支时,工作树处于
分离头
状态之外,并且有一个引用。(新分行名称)


描述如果需要,如何禁用自动垃圾回收。

在Git垃圾回收(GC)将其删除之前,
分离磁头
状态中的更改将一直保留

关于的文档非常好:

重要的是要认识到,在这一点上,没有什么是指提交最终提交f(扩展为提交e)将被例行的Git垃圾收集过程删除,除非我们在此之前创建引用。

这意味着,您可以
签出
/
切换到另一个引用的分支。(例如,
git-switch-main
)或使用
git-switch-c newbranch
git-checkout-b newbranchname
创建新分支以保留当前分离的工作树

创建新分支时,工作树处于
分离头
状态之外,并且有一个引用。(新分行名称)


描述如果需要,如何禁用自动垃圾收集。

Git通过其哈希ID查找提交。散列ID是那些丑陋的字母和数字字符串,例如。这些看起来是随机的,但不是

如果您写下每个提交的散列ID,您至少可以在一段时间内取回它们。但是如果在复制这些散列ID时出错或输入错误怎么办?最好让计算机保存它们

分支名称就是这样做的。但事实上,它只保存了一个散列ID。所以这就是您真正需要写的全部内容。每次在“分离头”状态下进行新提交时,都必须写下刚刚进行的新提交的哈希ID。您可以删除任何以前提交的哈希ID(尽管您不必这样做)

下面是它的工作原理。每次提交保存两件事:

  • 每次提交都会存储每个文件的完整快照(Git在您或其他人提交时知道)。这些文件以一种特殊的、压缩的、只读的、Git-only格式存储,并对文件进行重复数据消除,因此,如果新提交重新使用旧提交中的大部分文件,它们实际上不会占用任何空间

  • 而且,每次提交都会存储一些元数据:如您的姓名和电子邮件地址等信息,以及一些日期和时间戳。在这个元数据中,Git存储上一次提交的哈希ID,它正好在您刚刚进行的新提交之前出现

因此,如果我们有一个提交链,所有提交都在一行中,我们可以这样绘制它们:

... <-F <-G <-H
...--F--G--H   <-- somebranch (HEAD)
(或者使用
git-switch
执行相同的操作)您会得到一些我们可能会这样画的东西:

... <-F <-G <-H
...--F--G--H   <-- somebranch (HEAD)
Git就是这样记住最后一次提交的。这是在分店的名字里


1这个大数据库实际上保存了Git的所有内部对象。提交只是四种类型的对象之一。Git存储库基本上是两个数据库:一个是大数据库,另一个是较小的数据库,通常较小的数据库将名称(如分支名称)映射到散列ID。较小的数据库允许您查找哈希ID,而较大的数据库保存提交


分离头模式 在分离头模式下,您告诉Git:不要在特殊名称
头中存储名称,而是存储原始哈希ID。例如,假设您决定查看历史提交
G

...--F--G   <-- HEAD
         \
          H--I   <-- somebranch
现在,假设您再次
git checkout somebranch
,回到这个问题:

          J   ???
         /
...--F--G
         \
          H--I   <-- somebranch (HEAD)
J???
/
…--F--G
\

H--IGit通过其散列ID查找提交。散列ID是那些丑陋的字母和数字字符串,例如。这些看起来是随机的,但不是

如果您写下每个提交的散列ID,您至少可以在一段时间内取回它们。但是如果在复制这些散列ID时出错或输入错误怎么办?最好让计算机保存它们

分支名称就是这样做的。但事实上,它只保存了一个散列ID。所以这就是您真正需要写的全部内容。每次在“分离头”状态下进行新提交时,都必须写下刚刚进行的新提交的哈希ID。您可以删除任何以前提交的哈希ID(尽管您不必这样做)

下面是它的工作原理。每次提交保存两件事:

  • 每次提交都会存储每个文件的完整快照(Git在您或其他人提交时知道)。这些文件以一种特殊的、压缩的、只读的、Git-only格式存储,并对文件进行重复数据消除,因此,如果新提交重新使用旧提交中的大部分文件,它们实际上不会占用任何空间

  • 而且,每次提交
              J   ???
             /
    ...--F--G
             \
              H--I   <-- somebranch (HEAD)