2010-12-17 67 views
8

使用git log我发现我的项目的旧版本,我想混乱。我做了git checkout version52导致项目在'分离'状态,做了一些修改,然后做了git commit就可以了。我没有意识到这会在分离的状态下进行。为什么在分离状态下使用`git commit`?

之后我回到我的主人git checkout master但是当我做git log我的变化不再显示。我现在意识到这些更改卡在我的version52中。

我可以用git merge version52很容易地得到这些更改,但我只是想知道,能够在git中以分离状态提交的意义是什么?作为一个新手,这让我感到困惑了一段时间,我不明白为什么它被允许,或者何时使用这样的功能。

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

+0

这是超级用户的问题,不是吗? – yoda 2010-12-17 10:10:44

+0

什么是断开连接状态 - 你是指分离的HEAD? – 2010-12-17 10:11:10

+0

是的,对不起,我的意思是“分离” – Lan 2010-12-17 10:20:23

回答

6

对于未来,你应该已经创建了一个分公司工作过

git branch branchName version52 
git checkout branchName 

git checkout -b brannchName version52 

评论后编辑

的git的对象模型,这是我写的约here,只是跟踪一棵树的对象。分支是指向提交的指针。虽然这两者是相关的,但您不必将分支指向提交行的顶端。

当你创建一个提交时,你仍然在创建一个存在于版本库中的对象树,直到它变老,并且你运行git-gc来清理这些孤立的提交。我认为你担心的是在分支机构中没有强制要求提交的承诺。这为工具提供了灵活性,有时可以捕捉用户,但git是一种高级工具。

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

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

总是有head指针指向了最新的提交,你已经签出,所以你从来没有真正“切断”

+0

有用的,当在一个团队工作 – yoda 2010-12-17 10:19:00

+0

是的,我现在意识到这是我应该做的。但是有没有什么时候承诺分离状态是有用的? – Lan 2010-12-17 10:23:15

-3

您似乎对版本控制感到困惑 - 您每次进行一次提交并且通过测试就做出提交。我通常会每隔一小时左右进行一次提交 - 它给了我一个我可以返回的已知状态,并给了我一些不同的看法。无论你是否“连接”,都不在这里,也不在那里。

+0

我认为你误解了这个问题。他在谈论他的历史是处于一个无关联的状态,并不是说他没有连接到他的源代码控制服务器。 – Abizern 2010-12-17 10:15:29

+0

对不起,我原来的问题是写“断开”而不是“分离”的错。 – Lan 2010-12-17 10:19:47

3

承诺本身就是一个分离的头是相当无用的,但它也是在交互式重新绑定期间使用,如果您标记提交进行编辑,它允许您重写树的历史记录。

当git达到这样的提交,而重新绑定它会停止进程,你可以改变这个承诺git commit --amend,甚至可以像平常一样插入新的提交。最重要的是,这样的提交属于no分支,因为git status清楚地显示,所以你承诺分离的头。

许多Git用户,包括我在内,都认为交互式重新定义是更有用的git功能之一,如果不可能提交分离的HEAD,它将不起作用。

相关问题