2012-05-27 26 views
2

我有一个问题,它类似于How to undo 'git add' before commit?,但有一个重要的区别:如何撤消“git add”保留以前的阶段版本? (是否该指数具有历史?)

背景:

我快一些代码正在生成的文件,我会完成后添加到我的存储库。生成这些文件的代码是新代码,并且在不断变化的过程中,所以我有时会多次运行它,并进行更改。

一路上,我将生成的文件添加到索引,所以他们将为最后的一个大提交做好准备。这也使我能够检查我的代码更改是否会在输出中创建更改,如果是这样,那些更改是什么。但是......我意外地在Changes to be committed部分(作为new fileChanges not staged for commit部分(如modified)出现过的文件上意外地运行了另一个git add。我的意思是运行一个git diff,但我滑倒并重新添加它,所以现在我没有办法区别它(我知道),所以...

问题:

有没有办法撤消刚刚过去的分期手术,使得先前添加的版本仍然/同样可以在索引,修改后的文件将再次在我的工作树,让我可以区别吗?

所有这些都没有承诺或任何事情,因为我的目标是在完成这一小小一轮的开发时一起完成所有任务。我真的很喜欢git可以正常显示我对新文件的更改,然后他们承诺......但是......我错过了一个机会,现在想知道是否有办法让它恢复。 ?

到目前为止,我查找的东西似乎能够让我回到最后一次提交(无文件)或文件的当前状态(无论如何),但不是中间的从索引转到以前的版本,这从来都不是提交的一部分。任何暗示,即使这是否可能(甚至是一个坚实的答案,它不是,最好有解释为什么这种情况),将不胜感激。

回答

3

有没有直接的方式来到达文件的最后阶段版本。没有索引文件的版本,这就是你应该使用提交。在将来,您可以考虑更频繁地进行临时提交(例如,使用commit --amend),然后至少以前的版本将存储在您的推荐日志中(例如git log -g)。

但是,所有文件的分阶段版本都将被添加到git对象数据库。您应该能够通过git fsck --lost-found找到它们。这将把所有“晃来晃去”的斑点写入.git/lost-found/other。不幸的是,他们不会以任何特定的顺序,或有他们的原始文件名,但任何丢失的斑点应该在那里。

+1

如果您可以识别添加的时间窗口,并且在添加之前“最近添加”,如果您可以区分之后的内容,那么时间戳记对于回购对象文件可以提供帮助。 – jthill

+0

是的,我同意,始终运行git commit永远不会伤害你。这就是git的意图。 –

+0

谢谢。至于频繁的提交,这只发生在几秒钟的事情上,真的......我经常做相当*的提交,尽管经常做更多*,而使用--mend可能是有道理的。 --lost-found选项也可能有帮助,所以非常感谢!我已经开始了,但是这听起来可能会让我在当时想要的东西。谢谢。 – lindes