Git如何管理已删除分支的提交?

4

enter image description here

这是一个关于git merge的场景。当我合并时,会创建一个New merge commit,因此如果我从New merge commit回溯,我可以看到所有MasterFeature分支提交直到Common base的历史记录。这是我不理解的情况:如果我删除Feature分支,我认为Feature分支提交将被删除,但实际情况是,当我站在New merge commit上,在删除Feature分支后,我仍然可以通过输入git log看到Feature分支的提交。这是怎么回事?我有什么误解吗?

1
在 git 中,分支只是一个注释,一个指向提交的名称。当您删除名为 Feature 的分支时,您所做的只是删除指向该提交的名称,但提交仍然存在。只要其他名称(分支、标签、当前检出的提交 = HEAD 等)直接或间接地引用提交的历史记录,该提交就不会被垃圾回收。 - Lasse V. Karlsen
1
回答你的问题,不会,提交记录不会被删除。它仍然被“新合并提交”所引用。 - Lasse V. Karlsen
1个回答

8

如评论所述,分支只是一个注释、书签。

如果你深入研究 .git 目录(出于教育目的,我建议你这样做),你会看到一个 refs/heads 目录。它将包含每个本地分支的一个文件(远程分支存储在 refs/remotes 中)。

如果你打开其中一个文件,你会发现它包含一行:分支指向的最后一次提交的哈希值。

删除分支实际上只是删除 refs/heads 中对应的文件。这就是为什么删除分支不会影响“分支”的提交内容(提交实际上并不属于某个分支)。

因此,你也可以(同样出于教育目的,当然不建议在日常工作流程中这样做)通过创建文件 refs/heads/foo 并将其内容设置为你想要分支指向的提交的完整哈希值来创建分支 foo

第二个结果是,一旦分支合并,就没有理由保留它“以防万一”了。


1
值得注意的是:有时候refs/heads/foo并不存在,即使分支foo存在。这是因为Git存储分支名称到哈希ID映射的地方不仅仅是普通文件;它还有一个.git/packed-refs文件。由于分支名称区分大小写,但Windows和MacOS上的文件名通常区分大小写,我预计Git将来会放弃在与分支同名的文件中存储哈希ID的想法。无论Git是否转向真正的数据库,或者只是编码分支名称,都取决于谁修复了这个错误。 - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接