如何丢弃对一个文件的提交更改?

How to discard committed changes to just one file?

我有一个提交涉及对多个文件的更改。现在我想删除我对其中一个文件所做的更改。更准确地说,我希望这个文件与远程主机上的当前版本相同。我怎样才能做到这一点?

我猜

git checkout -- <filename>

可能会满足我的需要,但我不确定。

我也见过这种语法:

git checkout <commit> <filename>

我想最后一个命令删除了特定提交引入的文件更改,但是第一个命令做了什么?它是否删除了 git pull 之后执行的所有提交所引入的更改?

签出 签出 该提交中的那个文件。

当您执行 git checkout -- filename 时,-- 只是表示 "end of options",这意味着该标记之后的任何内容都是参数,而不是选项。

在这种情况下,如果未指定提交,则使用 ref HEAD,因此获取 HEAD 中的文件并将其应用于当前提交的文件(这意味着什么都没有发生,只是更改尚未提交的消失;如果目录是干净的,则什么也不会发生)。

如果指定了提交 ID,则该提交处的文件将应用于当前文件。

例子
假设您有一个 5 天前的提交,其 ID 为 257d2c7.
在此提交中,您向您正在写的一首诗添加了一节经文(谁说 git 只对源代码有帮助??)然后您认为它不是那么好并将其删除。
然后你在此基础上做了更多的提交。 但是现在你想要那个特定的经文,你是怎么做到的?

喜欢如下:

$ git stash // save existing changes and clean working directory
$ git checkout 257d2c7 my-poem.txt // check out your poem from 5 days ago
$ git stash pop // reapply existing changes and resolve conflicts
$ ... // continue working