单个文件的硬重置

Emi*_*ano 906 git

我目前在工作目录中有三个已修改的文件.但是我希望其中一个重置为HEAD状态.

在SVN我会使用svn revert <filename>(svn update <filename>如果需要的话后跟),但在git我应该使用git reset --hard.但是,此命令无法在单个文件上运行.

有没有办法在git中丢弃单个文件更改并用新的HEAD副本覆盖它?

Mar*_*air 1626

您可以使用以下命令:

git checkout HEAD -- my-file.txt
Run Code Online (Sandbox Code Playgroud)

...将my-file.txt使用HEAD 更新索引的工作副本及其状态.

--基本上是指:将此点后的每个参数视为文件名.这个答案的更多细节.感谢VonC指出这一点.

  • 更完整的答案.+1;)对于' - ',另请参阅http://stackoverflow.com/questions/6561142/different-between-git-checkout-filename-and-git-checkout-filename(更常见的是,http: //stackoverflow.com/questions/1192180/deleting-a-badly-named-git-branch/1192194#1192194) (46认同)
  • 如果您是当前分支机构的负责人,可以省略`HEAD`-请参阅http://www.norbauer.com/rails-consulting/notes/git-revert-reset-a-single-file.html (13认同)
  • 另外,不要忘记您可以使用`HEAD~1`引用先前的提交以指示倒数第二次提交. (8认同)
  • 任何洞察为什么`reset`命令(如它所说)"不能用路径做硬复位",然后为什么`checkout`命令不能(不能?)用于硬复位整套?(我的意思是为什么它是这样设计的.) (4认同)
  • @cxw 不幸的是,这并不完全正确。来自`git checkout`的手册页:“通过替换索引或&lt;tree-ish&gt;中的内容来覆盖工作树中的路径”。即如果省略`&lt;tree-ish&gt;`,索引中的任何内容都将用于更新工作树。这可能与 HEAD 不同,也可能不同。 (2认同)

Axe*_*ect 124

Git 2.23(2019 年 8 月)起,您可以使用restore更多信息):

git restore pathTo/MyFile
Run Code Online (Sandbox Code Playgroud)

上面的代码将恢复MyFileHEAD(最后一次提交)对当前分支。

如果您想从其他提交中获取更改,您可以在提交历史上倒退。下面的命令将MyFile在最后一次提交之前获得两次提交。您现在需要-s( --source) 选项,因为现在您在恢复源时使用master~2而不是master(默认):

git restore -s master~2 pathTo/MyFile
Run Code Online (Sandbox Code Playgroud)

您也可以从其他分支获取文件!

git restore -s my-feature-branch pathTo/MyFile
Run Code Online (Sandbox Code Playgroud)

  • 迄今为止最简单的方法。不幸的是这个答案没有得到足够的重视。 (9认同)
  • 需要注意的是,git 文档仍然将该命令标记为 **experimental**。 (8认同)
  • @refaelio 覆盖本地更改就是重点。该命令是否可能与其他操作混淆? (3认同)

Acu*_*nus 117

重置为头:

要将单个文件硬重置为HEAD:

git checkout @ -- myfile.ext
Run Code Online (Sandbox Code Playgroud)

请注意,这@是简称HEAD.旧版本的git可能不支持缩写形式.

重置为索引:

要将单个文件硬重置为索引,假设索引为非空,否则为HEAD:

git checkout -- myfile.ext
Run Code Online (Sandbox Code Playgroud)

关键在于,为了安全起见,您不希望遗漏@HEAD从命令中删除,除非您特别指的是重置为索引.

  • 不仅仅是文件名。在许多实用程序中,广泛使用的约定将选项与位置参数分开。参见`man bash`页面。在这个答案中也提到:https://unix.stackexchange.com/a/187548/142855 (6认同)
  • 按照惯例,“--”用于告诉程序“我已经完成了“选项”的指定,从这里开始,一切都将是位置参数。” 传统上,“选项”是像“--recursive”这样的标记,它可以以任何顺序出现,甚至可以以其缩写形式组合在一起,例如“rm -rf”。相反,“位置参数”更像是在编程语言中传递给函数的参数:它们在标记列表中的“位置”定义了程序将如何处理它们(这些通常是文件名)。`--` 消除了哪个是哪个的歧义。 (4认同)
  • myfile.ext 前的“--”是怎么回事? (3认同)
  • @LanceKind据我所知,这用于划分跟随它的文件名列表.没有它,有时git会错误地解释参数. (3认同)

小智 33

要恢复到上游/主站,请执行以下操作:

git checkout upstream/master -- myfile.txt

  • 在此示例中,“upstream”是其遥控器的名称。最有可能的是你的“origin”。 (3认同)

Mil*_*lad 11

您可以使用以下命令:

git checkout filename
Run Code Online (Sandbox Code Playgroud)

如果您有一个具有相同文件名的分支,则必须使用以下命令:

git checkout -- filename
Run Code Online (Sandbox Code Playgroud)


小智 10

不需要引用 HEAD。

git checkout -- file.js 足够了


小智 8

您可以使用以下命令重置单个文件

git checkout HEAD -- path_to_file/file_name
Run Code Online (Sandbox Code Playgroud)

path_to_file/filename列出所有已更改的文件以使用以下命令获取

git status
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

492309 次

最近记录:

6 年 前