git stash drop vs git reset

时间:2018-08-08 15:39:42

标签: git

当我在分支上工作并且想要完全删除所有未进行的更改时,我倾向于先使用git stash drop然后使用git reset HEAD。假设我没有任何阶段性的更改,那么它和$Word = New-Object -ComObject Word.Application $Document = $Word.Documents.Add() $Selection = $Word.Selection $Selection.TypeText("Testing") #SET PRINT LAYOUT OPTIONS HERE, WHICH I DON'T KNOW HOW :) $File = 'C:\temp\test.docx' $Document.SaveAs([ref]$File,[ref]$SaveFormat::wdFormatDocument) $word.Quit() 之间是否有功能上的区别?

3 个答案:

答案 0 :(得分:2)

man git-stash

  

将本地修改保存到新存储中,然后运行git reset --hard还原它们。

没有什么区别,因为它完全一样。

答案 1 :(得分:2)

简单回答您的问题。

git stash删除所有跟踪的文件,这些文件只能使用git stash pop还原为最近的存储。如果您认为自己已多次执行git stash,请使用git stash list

检查

对于git stash drop的问题,这里Difference between git stash pop and git stash apply

进行了很好的解释

如果您也想隐藏未跟踪的文件,则可以使用git stash --all

另一方面,git reset HEAD是完全不同的操作。如果至少没有在本地计算机上执行git commit,而是执行git reset,则所有已暂存的文件将再次被取消暂存。意味着如果您执行git add file.test并执行了git reset HEAD,它将取消所有文件的暂存。指向本地计算机中的HEAD提交。因此,在使用此命令之前,请先考虑一下。

这不是一个危险的命令,但是您可以使用git reflog来查看区别,这有助于了解HEAD指向您的本地和原点的位置。

答案 2 :(得分:2)

好吧...首先,git reset HEAD实际上不会删除您未进行的更改。 git reset --hard HEAD将(尽管它仍然不会删除未跟踪的文件)。重要的是,reset的主要重点是更新索引-也就是说,您可以使用它来取消升级更改。

清除非阶段性更改的最直接步骤是

git checkout -- .
git clean -f

第一个命令从跟踪的文件中丢弃未暂存的更改,第二个命令从未跟踪的文件中删除(尽管您可能首先要执行git clean -n,以确保您不会忘记文件;因为一旦删除了未跟踪的文件,git无法做任何事情来帮助您恢复文件。

我会说使用stash是一种技巧-它不能反映命令的预期语义-但通常可以使用。您甚至可以使用--keep-index命令来避免意外丢弃已进行的更改。

实际差异很小。您正在让git做额外的工作来将对象存储在数据库中,然后告诉它忽略那些对象。如果经常执行,这可能会使数据库混乱,但是添加的对象最终将被gc清除,因此在实践中,我不希望它引起真正的问题。