在分离状态下为什么要使用`git commit`?

8
使用git log我找到了一个旧版本的项目,想要进行一些修改。我使用了git checkout version52将项目处于“detached”状态,进行了一些更改,然后对其进行了git commit。我没有意识到这会在分离状态下提交。

在此之后,我回到了我的主分支git checkout master,但是当我执行git log时,我的更改不再显示。我现在意识到这些更改被困在了version52中。

我可以通过git merge version52轻松地应用这些更改,但我只是想知道,在git中能够在分离状态下提交的目的是什么?作为一个新手,这让我感到困惑了一段时间,我不明白为什么允许这样做,或者何时使用这个功能。

编辑:抱歉,我之前写错了“disconnected”,实际上是“detached”。在git中,当您决定查看先前检入的项目版本时,就会发生这种情况。


这是一个针对超级用户的问题,不是吗? - yoda
什么是断开连接状态 - 您是否指的是分离的 HEAD? - Ben James
是的,抱歉我是指“分离的”。 - Lan
2个回答

6

就未来而言,你应该创建一个分支进行工作

git branch branchName version52
git checkout branchName

或者

git checkout -b brannchName version52

评论后编辑

我之前在这里写过的Git对象模型,只是简单地跟踪对象树。分支是指向提交的指针。虽然两者相关,但您不必将分支指向提交线的末端。

当您创建提交时,仍然会创建一组对象,这些对象将存在于存储库中,直到它变得陈旧并运行git-gc以清理这些孤立的提交。我认为您担心的是没有强制要求在分支上进行提交。这在工具中创造了灵活性,有时会让用户感到困惑,但Git是一种先进的工具。

在您的情况下,您创建了一个提交,然后回到主分支,您认为自己丢失了提交,但如果您查看git reflog的输出,您会看到您创建的提交的sha,即使它不在分支上。您可以通过git branch branchName <commit的sha>从此处创建一个分支。或者,您可以合并或重新基于另一个分支的这些提交,而无需通过创建和删除仅用于此目的的分支来进行额外的步骤。好吧,这只是一些额外的步骤,仅需几个按键;但在某些情况下非常有用。

问题在于分支只是提交树的简写,就像标签是特定提交的简写一样。除了当您在分支上进行提交时,分支指针会随着最新的提交而移动。

始终存在一个head指针,它指向您已经检出的最新提交,因此您永远不会真正“断开连接”。


是的,我现在意识到这就是我应该做的。但是有没有什么时候提交到分离状态是有用的呢? - Lan

3
提交到一个孤立的 HEAD 本身是相当无用的,但在交互式变基期间也会使用它,这允许您重写树的历史记录,如果您标记了一个提交进行编辑。
在重新定位时,当 git 到达这样的提交时,它会停止该过程,并允许您像通常一样使用 git commit --amend 更改此提交甚至插入新提交。最重要的是,这些提交不属于任何分支,如 git status 明确显示,因此您将提交到一个孤立的 HEAD。
许多 Git 用户(包括我)认为交互式变基是更有用的 git 功能之一,如果不能提交到孤立的 HEAD,则无法正常工作。

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