2011-11-03 63 views
29

如何在Git中对一个或多个文件执行相当于TFS的撤销挂起更改?如何执行TFS等效的'撤消挂起更改'

,基本意思是做下列步骤操作:

  • 撤消磁盘上的变化
  • 重置任何改变的Git已经发现
  • 获取该文件的最新变化,从Git的

它如果你有(1)只是在磁盘上改变它,而不添加它,将很好地知道命令中的差异(如果有的话),但是当你已经做了(2)完成了附加命令和奖金(3)即使你已经提交了更改

回答

31

为1和2,所有你需要做的是:

git stash -u #same effect as git reset --hard, but can be undone 

这将扔掉任何变化。如果您使用reset,请小心。阅读操作复位和结账的指数和硬,软和混合选项的排列。该progit书中详细解释了这一点:http://progit.org/2011/07/11/reset.html

对于3,

git reset --hard HEAD^ 

,但会更好发出此之前git stash -u - 以防万一你有挂起更改。

这会将当前分支重置为当前提交的父级。在网上查找“tree-ish”。参考后的^和〜N将允许您指向该参考历史记录中的任何可到达的点。要了解历史记录是如何在git中进行跟踪的,“计算机科学家Git”解释了有向非循环图:http://eagain.net/articles/git-for-computer-scientists/

要从当前提交的状态中获取单个文件(即丢弃更改),可以使用checkout

git checkout HEAD -- <a list of files> 

如果您发出错误上面的最后一个重置命令,您不会遇到麻烦。 Git会跟踪分支用于指向reflog的位置。

git reflog 

会列出你的历史。您可以在输出中看到如何引用每个,所以:

git reset --hard [email protected]{1} 

将重置分支到它曾经是前1个变化。

要添加,如果你想消灭被忽略的文件和未跟踪文件,你可以用这个擦:

git clean -xdf 
+0

小心; git不会提示你有一个漂亮的(令人烦恼的)对话框来选择你想撤消待处理更改的文件。 :) –

+1

这样做的一种方法是添加-p参数,它将提示您进行每个更改。你可以说'a'或'd'来处理整个文件,而不是'y'或'n'来处理单个的文件。 –

4

这个命令将撤消本地更改,并将它们恢复到当前版本的库:

git reset --hard 

可以通过发出恢复到您的最后一个有效的提交:

git reset --hard HEAD 

我F你只是想恢复只是一个文件,使用git结帐代替:

git checkout -- file_name.extension 
git checkout HEAD file_name.extension 
+2

你为什么要区分'git reset --hard'和'git reset --hard HEAD'? – manojlds

2
  1. git checkout [path]或(整个回购),其次git reset --hard HEAD
  2. git reset [path]通过git checkout [path]
  3. git reset --hard [commit]在恢复回购的状态[commit],必须是tree-ish
0

我相当于在Git中使用Eclipse的是简单地右键单击该文件并选择Replace with - >HEAD Revision(或任何您想要的版本)。