git(源代码树)如何恢复未分级的文件

时间:2015-02-01 17:36:05

标签: ruby-on-rails git

我承诺并推送了一些不起作用的代码,我认为这是学习如何回滚到之前的提交/拉动的好机会。

我使用重置主机来提交这似乎有效但后来我发现非工作提交仍然存在,并且它说我在最新提交之后是1(提交包含不起作用的代码。)

然后我做了一些可能完全愚蠢的事情,我使用删除按钮进行我后面的提交(我不想要的早期代码)。在此之后,提交仍然存在,但现在我的未提交更改列表只是显示从我想要丢失的提交中删除文件。

似乎我已经丢失了我一直在工作的所有未经处理的文件。我怎样才能得到这些并失去我之前推送的无用提交?

感谢您的时间和意见。

1 个答案:

答案 0 :(得分:1)

首先,我建议您阅读git术语以及不同的操作实际意味着什么:http://git-scm.com/book/en/v2

http://www.ndpsoftware.com/git-cheatsheet.html可以找到一张好的表面备忘单。现在就可以找到你要处理的内容。

删除并不会从git中删除东西,事实上,它完全与rm命令在unix中的命令行中执行的操作完全相同。它将它们从您的文件系统中删除。如果您没有上传过的文件,那么它们就会消失。

很遗憾,我无法帮助您取回已删除的文件。如果可以,请查看您的操作系统恢复工具,但除非您有某种类型的删除缓存(Windows上的回收站),否则请不要屏住呼吸。

Revert允许您进行反向提交,将所有内容都恢复原状,就好像您从未进行过原始提交一样,但将原始内容保留在历史记录中,这样您就可以随时查看发生的情况。尽管人们倾向于期望,但这并没有消除提交,但实际上创建了一个新提交。如果您要触摸已被推动的东西,这是最好的选择。

重置会更改git进程中的各种状态之一,以允许您更改正在执行的操作。软复位仅更改您指向的HEAD指针。命令git reset --soft会将您的HEAD指针更改为您提供的任何提交(默认情况下HEAD完成任何操作)。命令git reset将更改您的HEAD和您的暂存区域以匹配给定的提交(默认情况下为HEAD,因此它只是取消暂停所有内容)。命令git reset --hard将重置HEAD,暂存区域(也称为索引)和工作目录以匹配给定的提交(再次,默认情况下HEAD,这样您就可以回到完全干净的环境,就像您没有做任何事情一样自上次提交以来。)

如果要完全删除提交,则称为重置头部。从技术上讲,提交本身永远不会消失,但你可以通过正常方式使其无法访问,并有效地将其从项目历史中删除。需要注意的是:对于下游用户的推送提交,应该从不。最重要的问题是,你对下游的讨厌程度是多少,因为对他们来说唯一安全的选择就是在你这么做之后重新克隆他们所有的工作。

该过程将git reset --hard HEAD将您的整个环境带到最后一次提交的状态。然后你想要reset --soft HEAD^将HEAD(你承诺的工作)更改为之前的一个。这使您处于提交之前的状态,所有暂停的更改仍然处于暂停状态。此时,您可以使用git reset --hard HEAD放弃更改,您可以使用git reset HEAD取消所有内容。最后,您可以构建另一个提交并继续前进。

为了更深入地了解更改历史记录,以及在推送历史记录之后基本上不允许这样做的原因,您可以在此处查看:http://justinhileman.info/article/changing-history/甚至还有一个非常好的流程图,其中包含命令引用在文章的最后。