【发布时间】:2011-07-04 23:15:18
【问题描述】:
如果我对工作树进行了更改但尚未提交,并且我想恢复我所做的更改,那么两者之间是否有区别
git reset --hard HEAD
和
git checkout .
?
【问题讨论】:
-
这是 Pro Git 书籍作者的一个很好(而且彻底)的解释:git-scm.com/book/en/v2/Git-Tools-Reset-Demystified
如果我对工作树进行了更改但尚未提交,并且我想恢复我所做的更改,那么两者之间是否有区别
git reset --hard HEAD
和
git checkout .
?
【问题讨论】:
这些答案很好。我想补充一点,如果您删除了已暂存但尚未提交的文件,那么单独的 git checkout . 不会将已删除的文件带回工作区。 git reset --hard 会。
【讨论】:
git checkout -- . 显然只会在当前目录(及其子目录)上运行,git reset --hard 将在整个工作树上运行。
git checkout -- . 只会更新工作树并保留已暂存的文件,而git reset --hard 会将索引和工作树与 HEAD 提交匹配。
与 refspec 一起使用时:
reset 会将当前分支头设置为给定的提交(并匹配索引和工作树)checkout 将切换到该分支,当它们触及在当前分支和要签出的分支之间没有更改的文件时,本地更改保持不变【讨论】:
git checkout 保持暂存区域不变,因此已暂存的文件将保持暂存状态。
git checkout HEAD -- .似乎清除了暂存区。我实际上在它上面做了一个单独的线程,因为我认为它们是相同的。 stackoverflow.com/questions/59339986/… 但你是对的。我正在使用 HEAD。对不起