我的SmartGit客户端有问题(但可能与Git有关)。
我有一些未提交的更改,因此我假设这将显示为图形的第一行(“日志”视图),但没有显示。我该如何找回它?
此屏幕截图显示了我在寻找什么:
我也完全在本地工作,所以我没有远程存储库(不确定这是否有区别)。
在Bash shell中运行命令git log --all --decorate --oneline --graph
时,我也没有得到未提交的更改行。什么数字?
答案 0 :(得分:0)
这实际上只是对问题的最后一部分的答案,仅使用git log --all --decorate --oneline --graph
。您想知道为什么看不到未提交更改的提交节点。
gitk
(Git附带的GUI)显示了这样的节点; git log --graph
没有。由每个查看者决定是否要假装未提交的更改是可以显示的提交节点,还是仅是未提交的更改而不是节点。
从技术角度来看,后者更为准确:未提交的更改不是是一次提交!但是,在GUI中显示它们可能对用户更友好。因此,由GUI决定是否显示它们。
请注意,从Git的角度来看,每个文件实际上始终有三个版本供您使用。 1 如果您有一个名为{{1 }},例如,您实际上有三个 README.md
个文件:
其中一个README.md
存储在当前(README.md
)提交中,只读。此副本永远无法更改!它以特殊的,仅Git的压缩形式存储。因为它存储在提交中,所以它会一直保留,或者至少在提交继续存在的情况下保留。
如果您弄乱了HEAD
的其他两个版本,则可以在命令行上使用README.md
恢复HEAD
的版本。这将覆盖其他两个副本。
第二个git checkout HEAD README.md
,将进入 next 提交,在那里读/写,存储在一个非常重要的但通常几乎完全不可见的(!)中,实体。 Git对此名称有三种不同的名称:它称为 index 或 staging-area 或 cache ,具体取决于谁在做打电话。您当前的所有文件都在索引中,并且也是特殊的仅Git格式,但是在索引中,您可以更改。
在更改文件的此副本之前,如果进行新提交,则新提交中的README.md
将与当前提交中的README.md
相匹配。其他所有文件也是如此。
在命令行上,通常使用README.md
更改此文件副本。这会将文件的工作树版本(请参阅最后一个项目符号点)复制到索引中。如果您决定希望索引副本返回到其在当前提交中的显示方式,则可以使用git add README.md
。这与git reset HEAD README.md
非常相似,只不过它 从git checkout -- README.md
版本覆盖了索引版本。
最后,您可以实际上在编辑器中打开HEAD
文件,使用文件查看器进行查看,等等。该文件是您的工作树中的文件。它采用普通的非Git格式,因此您可以使用它。
在某些方面,这是Git最不关心的文件。除非将其复制到索引中,否则只是噪音-Git几乎不会看它。 README.md
命令将比较索引版本和工作树版本,并告诉您它们是否不同。
请注意,git status
要做的是运行两次 git status
:第一个将git diff
提交与索引进行比较。此处的所有不同之处都是进行提交。第二个HEAD
将索引与工作树进行比较。此处有什么不同之处是不上演提交阶段。
当像gitk这样的图形查看器向您显示未提交更改的节点时,它要么合并索引和工作树,要么忽略这两者之一。无论哪种方式,它所显示的都不是事实!尽管如此,知道您已进行未提交的更改还是很有价值的,无论这些文件是已暂存,未暂存还是两者都已暂存(例如,git diff
已暂存,而其他文件未暂存)。有一种显示方式很高兴。
1 这既是高估又是低估。由于您可以创建新文件或删除现有文件,因此有时索引和/或工作树具有README.md
中不存在的版本,反之亦然。那就是高估的地方:某个文件可能只有一个或两个版本。同时,您可以随时在 中提取 any 文件的 any 提交版本,所以这是一个轻描淡写的内容,但是{{1 }}提交版本特别重要,因为与索引进行比较时,HEAD
将使用它。最后,在进行有冲突的合并时还有另一种特殊情况:在这种情况下,索引本身包含(最多)三个版本的冲突文件,因此您可以使用每个文件的更多同时可用版本