我目前在工作目录中有三个已修改的文件。但是我希望其中一个重置为HEAD状态。
在SVN中,我使用svn revert <filename>
(如果需要,可以使用svn update <filename>
),但在git中我应该使用git reset --hard
。但是,此命令无法在单个文件上运行。
有没有办法在git中丢弃单个文件更改并用新的HEAD副本覆盖它?
答案 0 :(得分:1441)
您可以使用以下命令:
git checkout HEAD -- my-file.txt
...将更新my-file.txt
的工作副本及其在索引中的状态与HEAD的状态。
--
基本上意味着:将此点之后的每个参数视为文件名。 this answer中的更多详细信息。感谢VonC指出这一点。
答案 1 :(得分:96)
要将单个文件硬重置为HEAD:
git checkout @ -- myfile.ext
请注意,@
是HEAD
的缩写。较旧版本的git可能不支持缩写形式。
要将单个文件硬重置为index,假设索引为非空,否则为HEAD:
git checkout -- myfile.ext
关键在于,为了安全起见,您不希望从命令中遗漏@
或HEAD
,除非您特别指的是重置为索引
答案 2 :(得分:48)
自 Git 2.23 起(2019年8月),您可以使用restore
(more info):
git restore pathTo/MyFile
以上内容将恢复当前分支上MyFile
(最后的提交)上的HEAD
。
如果要从其他提交中获取更改,则可以倒退提交历史。下面的命令将在最后一次提交之前MyFile
进行两次提交。现在,您需要使用-s
(--source
)选项,因为现在还原源时使用master~2
而不是master
(默认):
git restore -s master~2 pathTo/MyFile
您还可以从其他分支获取文件!
git restore -s my-feature-branch pathTo/MyFile
答案 3 :(得分:24)
要还原为上游/母版,请执行以下操作:
git checkout upstream/master -- myfile.txt
答案 4 :(得分:3)
您可以使用以下命令重置单个文件
git checkout HEAD -- path_to_file/file_name
使用以下命令列出所有已更改的文件以获取path_to_file/filename
git status
答案 5 :(得分:3)
您可以使用以下命令:
git reset -- my-file.txt
添加后将更新my-file.txt
的两个工作副本。
答案 6 :(得分:1)
不需要引用HEAD。
git checkout -- file.js
足够
答案 7 :(得分:-1)
您可以使用以下命令:
git checkout filename
如果您的分支具有相同的文件名,则必须使用以下命令:
git checkout -- filename
答案 8 :(得分:-16)
一种简单,方便,动手的方法,特别是在您对git不太满意的情况下,尤其可以避免这种情况:
查看文件日志
git log myFile.js
提交1023057173029091u23f01w276931f7f42595f84f 作者:kmiklas 日期:2018年8月7日星期二09:29:34 -0400
JIRA-12345-使用新架构进行重构。
注意文件的哈希:
1023057173029091u23f01w276931f7f42595f84f
使用哈希显示文件。确保它是您想要的:
git show 1023057173029091u23f01w276931f7f42595f84f:./ myFile.js
将文件重定向到本地副本
git show 1023057173029091u23f01w276931f7f42595f84f:./ myFile.js> myFile.07aug2018.js
备份当前文件。
cp myFile.js myFile.bak.js
在您喜欢的文本编辑器中打开两个文件。
vim myFile.js
vim myFile.07aug2018.js
将n'粘贴代码从myFile.07aug2018.js复制到myFile.js,然后保存。
提交并推送myFile.js
再次查看日志,并确认文件正确放置到位。
告诉您的客户获取最新版本,愉快地看着它与旧版本一起使用。
不是最性感的解决方案,也不是大多数以git为中心的解决方案,绝对不是“手动”重置/还原,但是它可以工作。它只需要很少的git知识,并且不会干扰提交历史。