检查旧的提交会删除git中的新提交 - 为什么?

时间:2011-04-13 21:32:25

标签: git version-control

我刚刚制作了一个新的git repo。我创建了几个文件,将它们添加到repo中,然后提交它们。然后我添加了几个新的其他文件,将它们添加到git并再次提交。

令我惊讶的是,如果我尝试检查初始提交,它将删除新的提交(至少它是它的样子)。在操作完成时出现的egit窗口中,它显示了“将分支转换为null”的内容。

我已经尝试了3次并且它总是会发生,所以我想这确实是预期的行为。 任何人都可以解释为什么会发生这种情况?它背后的理由是什么?

由于

1 个答案:

答案 0 :(得分:4)

当您签出旧提交时,它不会删除新文件,而是将您的工作副本移回旧版本。例如,您的历史记录可能如下所示:

Refs:              v-- master <-- HEAD   
Commits:    1      2 
          --*------* 
Files:      |      |
            +- foo + foo
            +- bar + bar
                   + baz

这表明你有两个提交,1和2(当然,它们将是长十六进制字符串,但我们将它们称为1和2以使其更容易)。在提交1中,您有文件foobar。在提交2中,添加文件baz。现在,如果您查看提交1,这意味着您希望将工作树切换为与提交1中的内容完全相同,更新您的HEAD引用以指向它:

Refs:       v-- HEAD v-- master                       
Commits:    1        2  
          --*--------* 
Files:      |        |
            +- foo   + foo
            +- bar   + bar
                     + baz

所以现在你的工作树看起来就像在commit 1中那样;您只有foobar。如果您再次查看master或提交2,则会看到baz重新出现。

这是否回答了你的问题?我不太确定你为什么要查看提交1并且没有像在提交1中那样显示目录内容,所以也许我误解了你的问题。

请注意,如果签出提交1,您可能会收到警告,表示您将使用分离的头部。分离的头是HEAD引用,它不指向分支。如果您有一个分离的头,那么您创建的任何新提交都不会被特定分支引用;它们只会被HEAD引用,这意味着如果您稍后检查master或其他分支,则不会引用它们(除了reflog之外)。

此外,当您签出提交1时,如果您执行git log查看历史记录,则默认情况下会显示当前HEAD修订版的历史记录(即您目前已签出的版本)。由于此指向修订版1,其历史记录中没有其他内容,因此您只能在历史记录中看到修订版1。您仍然可以直接或通过指向它们的引用来查看其他修订的历史记录,例如master。在上面的示例中,如果您执行git log master,则会看到包含提交1和2的历史记录。

为了查看您的仓库的完整历史记录,我通常使用gitk --all向我展示我的存储库中的所有分支,标记和其他引用,以及它们的历史记录。你提到你正在使用我不熟悉的EGit,但它可能有类似的“显示所有历史记录”选项。