如何使用git撤消挂起的更改?

时间:2017-07-28 16:58:54

标签: git version-control

我是git的新手。我在集中式CVS(如TFS和SourceGear Vault)方面拥有丰富的经验。

我在本地使用git(没有遥控器)。今天,当我试图恢复自上一次提交以来所做的所有更改时,我已完全搞乱了我的项目。

我的存储库存储文档,VS项目和一些其他开发工件。总共有几千个文件。

如何使用git恢复整个存储库的最后一次提交(撤消挂起的更改说TFS)? git resetgit checkout只是弄乱了我的文件,因此我不得不使用文件级备份。

通过撤消更改我的意思是:

  • 还原自上次提交以来编辑的文件
  • 添加自上次提交后删除的文件
  • 删除自上次提交以来添加的文件

.gitignore文件中列出的项目不应受到影响。

是否可以对文件夹(+子文件夹)级别而不是存储库级别进行此类还原?

使用Vault我可以标记一个文件夹(+子文件夹),稍后我可以回到那个标记状态。这可以用git完成吗?

另一个简单的问题 - 我可以查看文件夹中已删除的文件并根据需要恢复它们(来自某些较旧的提交)吗?我没有设法使用git stategit log

2 个答案:

答案 0 :(得分:3)

  

如何使用git恢复整个存储库的最后一次提交(撤消说TFS的挂起更改)? git reset和git checkout只是弄乱了我的文件所以我不得不使用我的文件级备份。

另一种选择是git checkout,请参阅the documentation git-checkout - 切换分支或恢复工作树文件 。例如:git checkout -- .检出当前分支中的所有文件,从而恢复其状态。

  

是否可以对文件夹(+子文件夹)级别而不是存储库级别进行此类还原?

是的,git checkout -- path/to/folder

  

使用Vault我可以标记一个文件夹(+子文件夹),稍后我可以回到那个标记状态。这可以用git完成吗?

我只知道基于存储库的tags。但是,您可以签出该特定标记(或提交)的文件夹:git checkout tags/v1.0.3 -- pathgit checkout commit -- path

  

我可以查看文件夹中已删除的文件并根据需要(从一些较旧的提交中)恢复它们吗?我没有设法用git state或git log做到这一点。

例如,使用git log --name-status。假设我在某个提交中删除了 README.md ,它将显示为D README.md。假设它在commit abc123 中被删除,那么 abc123~1 就是之前的提交(其中 README.md 仍然存在)。然后,您可以使用git show abc123~1:README.md在删除之前查看该文件中的内容。恢复它的简单方法:git show 5235de78d28a07d2459130e7e3041b7720563b5d~1:README.md > README.md

  

我可以在文件夹中查看已删除的文件 ...

git log --name-status -- path/to/folder

答案 1 :(得分:0)

git reset --hard HEAD

应该做的伎俩。此命令会将所有文件重置为上次提交时的文件。