我的工作目录中目前有三个修改过的文件。但是,我希望其中之一可以重置为HEAD状态。
在SVN中,我会使用svn revert <filename>(svn update <filename>如果需要,请紧随其后),但在Git中,我应该使用git reset --hard。但是,此命令不能在单个文件上运行。
Git中有什么方法可以放弃对单个文件的更改并用新的HEAD副本覆盖它?
我的工作目录中目前有三个修改过的文件。但是,我希望其中之一可以重置为HEAD状态。
在SVN中,我会使用svn revert <filename>(svn update <filename>如果需要,请紧随其后),但在Git中,我应该使用git reset --hard。但是,此命令不能在单个文件上运行。
Git中有什么方法可以放弃对单个文件的更改并用新的HEAD副本覆盖它?
Answers:
您可以使用以下命令:
git checkout HEAD -- my-file.txt
...这将my-file.txt使用HEAD中的状态更新索引的工作副本及其状态。
HEAD~1以表示倒数第二次提交。
HEAD,如果你是在当前分支的头-看到norbauer.com/rails-consulting/notes/...
reset命令(如它所说的)“不能用路径进行硬重置”,然后为什么checkout不(不能使用)命令来硬重置整个集合呢?(我是说为什么要这样设计。)
git checkout:“通过替换索引或<tree-ish>中的内容来覆盖工作树中的路径”。即,如果<tree-ish>省略,则索引中的任何内容都将用于更新工作树。这可能与HEAD相同,也可能没有。
要将单个文件硬重置为HEAD:
git checkout @ -- myfile.ext
请注意,这@是HEAD。较旧版本的git可能不支持缩写形式。
要将单个文件硬重置为index,假设索引为非空,否则为HEAD:
git checkout -- myfile.ext
关键是为了安全起见,除非您明确打算仅重置为索引,否则您不希望遗漏@或HEAD退出命令。
man bash页面。在此答案中也提到了:unix.stackexchange.com/a/187548/142855
--用来告诉程序I've finished specifying "options", and from here on, everything will be a positional argument.。按照惯例,“选项”是--recursive可以以任何顺序出现的令牌,甚至可以像一样以其短形式组合在一起rm -rf。相反,“位置参数”更像是用编程语言传递给函数的参数:它们在令牌列表中的位置定义了程序将要对它们进行什么操作(通常是文件名)。--消除了关于哪个的歧义。
要恢复为上游/主服务器,请执行以下操作:
git checkout upstream/master -- myfile.txt
从Git 2.23(2019年8月)开始,您可以使用restore(更多信息):
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
不需要引用HEAD。
git checkout -- file.js 足够了
您可以使用以下命令:
git checkout filename
如果分支具有相同的文件名,则必须使用以下命令:
git checkout -- filename
一种简单,方便,动手的方法,可让您摆脱热水,特别是如果您对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
将粘贴代码从myFile.07aug2018.js复制到myFile.js,然后保存。
提交并推送myFile.js
再次查看日志,并确认文件正确放置到位。
告诉您的客户拉出最新版本,愉快地看着它与旧版本一起使用。
不是最性感的解决方案,也不是大多数以git为中心的解决方案,绝对不是“手动”重置/还原,但是它可以工作。它只需要很少的git知识,并且不会干扰提交历史。
git checkout下面是答案。在git中,“还原”是您要提交的内容。“还原”将历史提交的逆过程重放到您的工作目录中,因此您可以进行新的提交,以“撤消”还原的提交。我发现对于从svn转到git的人们来说,这经常是一个困惑点。