Git - 如何撤销对本地已提交文件的更改

4

我在本地的 BranchA 上执行了以下操作:

  1. 错误地修改了 FileA
  2. git add FileA
  3. git commit -m "Modified FileA"

所以,FileA 已经被提交到了我的本地分支 BranchA(从未推送到远程)中。

如何撤销对 FileA 的更改?

更新和我的解决方法

我使用 SourceTree 工具撤销了对 FileA 的更改,因为我发现这对我来说更简单。

要这样做,在 SourceTree 中,右键单击已提交的文件 FileA,选择“日志选择…” > 选择之前的提交(即您自己提交之前的那个)> 右键单击它并选择“重置为此提交”。这就完成了工作,谢谢大家。


https://dev59.com/E3NA5IYBdhLWcg3whuV_ - match
4个回答

12

如果要撤销文件中的更改,但在其他方面保持提交不变:

1) 将 fileA 恢复到之前的状态

git checkout HEAD^ -- path/to/fileA

2)将其包含在您在BranchA上最后一次提交中

git commit --amend

(而且由于它还没有被推送,下次无需使用强制推送。)


1
因为 git checkout HEAD^ -- path/to/fileA 首先将文件写入索引,然后再写入工作树,所以你实际上不需要在这里使用 git add 步骤。但是这仍然是使用 Git 命令的最短(也可能是最好的)方式;已经得到了赞同... - torek
谢谢,我接受了你的答案,但是我还没有尝试,因为我是在SourceTree中完成的。 在SourceTree中,右键单击已提交的文件>日志选择...>选择之前的提交(您的提交之前的提交)>右键单击它并选择“重置到此提交”。 这样做就可以了,但还是感谢大家。 - cd491415

3

首先,您需要将分支重置为上一次提交:

git reset @^ --mixed

然后您可以使用 checkout 命令将特定文件重置为旧状态:
git checkout -- files...

完成上述操作后,您可以重新提交更改:

git add files...
git commit -m "message"

1
你可以使用git reset HEAD~1将当前分支索引重置为上一个提交。如果要重置工作目录,请添加--hard,如果要细化更改并重新提交,则可以省略它。
如果您有其他更改,请使用git rebase先将有问题的提交移动到堆栈顶部。

但我只想撤销那个文件,而不是整个提交。在那个提交中,我有FileA、FileB、FileC,我只想将FileA恢复到我的更改之前的版本。 - cd491415
所以不要使用 --hard,这样你可以进行细化(git checkout -- FileA)并重新提交。 - JSON

1

另一种做法(我假设你的提交只涉及文件变更,你想要丢弃):

处于你的BranchA分支中

git rebase -i HEAD~2

它将提供一个按时间顺序排序的两个提交的列表。最后一个是您想更改的。所以,您想要丢弃那个提交。将光标移动到第二个提交,而不是 pick,键入 drop 或只是 d
保存更改(取决于您的编辑器,可以使用 nanoCTRL+X+SHIFT+Y,或者使用 vim:wq),就这样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接