Git stash drop与git reset的区别

8

当我在一个分支上工作,想要完全删除所有未暂存的更改时,我倾向于使用git stash,然后使用git stash drop。假设我没有任何暂存的更改,那么这与git reset HEAD之间是否有功能上的区别?


从没想过以那种方式去做,很有趣! - Sunny Patel
2
我假设你的意思是 git reset --hard HEAD。鉴于另一个假设——假设我没有暂存更改部分——那么这些操作是相同的,尽管 git stash && git stash drop 会导致计算机内部发生更多的工作。 - torek
3个回答

7
简单回答您的问题。 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在本地和源代码库中的指向位置。

3

man git-stash

将本地的修改保存到一个新的存档中,并运行 git reset --hard 命令来撤销这些修改。

实际上它们是完全相同的,没有任何区别。


3
首先,git reset HEAD不会真正移除您未提交的更改。使用git reset --hard HEAD可以清除未跟踪的文件(但未提交的更改仍然存在)。重点是,reset的主要重点是更新索引——也就是说,您可以使用它来取消暂存更改。
清除未提交的更改的最直接步骤是:
git checkout -- .
git clean -f

第一条命令会丢弃已追踪文件的未暂存更改,而第二条命令则会删除未被追踪的文件(尽管你可能需要先运行git clean -n命令,以确保没有遗漏文件;因为一旦你删除了未被追踪的文件,git就无法帮助你恢复它)。
我认为使用stash是一个hack - 它并不反映命令的预期语义 - 但通常会起作用。你甚至可以给--keep-index命令来避免意外丢弃已暂存的更改。
实际上的区别很小。你让git做额外的工作来存储数据库中的对象,然后告诉它忽略那些对象。如果经常这样做,可能会使数据库变得混乱,但添加的对象最终会被gc清除掉,所以实际上我不会指望它会引起真正的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接