为什么在处于分离状态时使用`git commit`?

时间:2010-12-17 10:07:58

标签: git

使用git log我发现了一个我想搞砸的项目的旧版本。我做了git checkout version52导致项目处于“分离”状态,进行了一些更改,然后对其进行了git commit。我没有意识到这会在一个独立的状态下进行。

在此之后,我使用git checkout master回到了我的主人,但当我git log时,我的更改不再出现了。我现在意识到这些变化都停留在我的version52

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

编辑:对不起,我之前写过“断开连接”,但我的意思是“超然”。在git中,当您决定查看以前签入的项目版本时会发生这种情况。

2 个答案:

答案 0 :(得分:6)

将来,你应该创建一个分支来解决问题

git branch branchName version52
git checkout branchName

git checkout -b brannchName version52

在评论后编辑

我写的关于here的git对象模型只是跟踪一个对象树。分支是指向提交的指针。虽然这两者是相关的,但你不必有一个分支指向一行提交的提示。

当您创建提交时,您仍然在创建存储库中存在的对象树,直到它变旧并运行git-gc来清理这些孤立的提交。我认为你担心的是在分支机构中没有强制要求提交。这为工具创造了灵活性,有时会吸引用户,但git是一种高级工具。

在你的情况下,你做了一个提交,然后回到你的主分支,你以为你丢失了你的提交,但如果你看过git reflog的输出,你会看到提交的sha即使它不在分支上也会创建。您可以通过git branch branchName <sha of commit>在此处创建分支。或者您可以将这些提交合并或重新绑定到另一个分支,而无需执行为此创建和删除分支的额外步骤。好吧,所以这只是几个额外的步骤,只需几次按键;但在少数情况下它很有用。

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

总有head指针指向最近一次提交,你已经签出,所以你永远不会'断开'

答案 1 :(得分:3)

单独提交一个独立的头是相当无用的,但它也在交互式变基术期间使用,它允许你重写树的历史,如果你标记一个提交进行编辑。

git在重新定位时达到这样的提交后,它会停止进程并允许您使用git commit --amend更改此提交,或者甚至像往常一样插入新的提交。最重要的是,这些提交属于没有分支,git status清楚地显示,所以你承诺一个独立的头。

包括我在内的许多Git用户认为交互式变基是更有用的git功能之一,如果不可能提交分离的HEAD,它将无法工作。