我刚刚制作了一个新的git repo。我创建了几个文件,将它们添加到repo中,然后提交它们。然后我添加了几个新的其他文件,将它们添加到git并再次提交。
令我惊讶的是,如果我尝试检查初始提交,它将删除新的提交(至少它是它的样子)。在操作完成时出现的egit窗口中,它显示了“将分支转换为null”的内容。
我已经尝试了3次并且它总是会发生,所以我想这确实是预期的行为。 任何人都可以解释为什么会发生这种情况?它背后的理由是什么?
由于
答案 0 :(得分:4)
当您签出旧提交时,它不会删除新文件,而是将您的工作副本移回旧版本。例如,您的历史记录可能如下所示:
Refs: v-- master <-- HEAD Commits: 1 2 --*------* Files: | | +- foo + foo +- bar + bar + baz
这表明你有两个提交,1和2(当然,它们将是长十六进制字符串,但我们将它们称为1和2以使其更容易)。在提交1中,您有文件foo
和bar
。在提交2中,添加文件baz
。现在,如果您查看提交1,这意味着您希望将工作树切换为与提交1中的内容完全相同,更新您的HEAD
引用以指向它:
Refs: v-- HEAD v-- master Commits: 1 2 --*--------* Files: | | +- foo + foo +- bar + bar + baz
所以现在你的工作树看起来就像在commit 1中那样;您只有foo
和bar
。如果您再次查看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,但它可能有类似的“显示所有历史记录”选项。