我目前在我的工作目录中有三个修改过的文件。但是我希望其中一个重置为 HEAD 状态。
在 SVN 中,我会使用 svn revert <filename>
(如果需要,后跟 svn update <filename>
),但在 Git 中我应该使用 git reset --hard
。但是,此命令不能对单个文件进行操作。
Git 中是否有任何方法可以丢弃对单个文件的更改并用新的 HEAD 副本覆盖它?
git checkout
下面是答案。在 git 中,“revert”是你对提交所做的事情。 “还原”将历史提交的逆向回放到您的工作目录中,因此您可以进行“撤消”还原的提交的新提交。我发现对于从 svn 进入 git 的人来说,这是一个常见的困惑点。
您可以使用以下命令:
git checkout HEAD -- my-file.txt
...这将使用 HEAD 更新 my-file.txt
的工作副本及其在索引中的状态。
--
基本上意味着:将此点之后的每个参数都视为文件名。 this answer 中有更多详细信息。感谢 VonC 指出这一点。
从 Git 2.23(2019 年 8 月)开始,您可以使用 restore
(more info):
git restore pathTo/MyFile
以上将在当前分支的 HEAD
(最后一次提交)上恢复 MyFile
。
如果您想从其他提交中获取更改,您可以返回提交历史记录。下面的命令将获得 MyFile
在最后一个提交之前的两个提交。您现在需要 -s
(--source
) 选项,因为现在您在恢复源时使用 master~2
而不是 master
(默认值):
git restore -s master~2 pathTo/MyFile
您也可以从其他分支获取文件!
git restore -s my-feature-branch pathTo/MyFile
git: 'restore' is not a git command.
git 版本 2.8.2.windows.1
重置头部:
要将单个文件硬重置为 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
不需要参考 HEAD。
git checkout -- file.js
就足够了
您可以使用以下命令:
git checkout filename
如果您有一个具有相同文件名的分支,则必须使用此命令:
git checkout -- filename
您可以使用以下命令重置单个文件
git checkout HEAD -- path_to_file/file_name
使用以下命令列出所有更改的文件以获取 path_to_file/filename
git status
您可以使用以下命令:
git reset -- my-file.txt
添加时将同时更新 my-file.txt
的工作副本。
一个简单、容易、动手的方法让你摆脱困境,特别是如果你对 git 不太满意:
查看文件的日志 git log myFile.js commit 1023057173029091u23f01w276931f7f42595f84f 作者:kmiklas 日期:2018 年 8 月 7 日星期二 09:29:34 -0400 JIRA-12345 - 使用新架构重构。注意文件的哈希:1023057173029091u23f01w276931f7f42595f84f 使用哈希显示文件。确保它是你想要的: git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js 将文件重定向到本地副本 git show 1023057173029091u23f01w276931f7f42595f84f:./myFile.js > 备份你当前的文件。 cp myFile.js myFile.bak.js 在您喜欢的文本编辑器中打开这两个文件。 vim myFile.js vim myFile.07aug2018.js 从 myFile.07aug2018.js 复制粘贴代码到 myFile.js,然后保存。提交并推送 myFile.js 再次查看日志,并确认您的文件正确就位。告诉您的客户提取最新版本,并愉快地观看它与旧版本一起使用。
不是最性感或最以 git 为中心的解决方案,绝对是“手动”重置/恢复,但它有效。它需要最少的 git 知识,并且不会干扰提交历史。
certain circumstances
?
HEAD~1
引用以前的提交来指示倒数第二次提交。HEAD
- 请参阅 norbauer.com/rails-consulting/notes/…reset
命令(如它所说)“不能使用路径进行硬重置”,然后为什么checkout
命令不(不能?)用于硬重置整个集合? (我的意思是为什么它被设计成这样。)git checkout
的手册页:“通过替换索引或 <tree-ish> 中的内容来覆盖工作树中的路径”。即如果<tree-ish>
被省略,则索引中的任何内容都将用于更新工作树。这可能与 HEAD 不同,也可能不同。