20

我想恢复提交,但仅适用于某些文件。(不是结帐;是还原。如果您不熟悉其中的区别,请继续阅读。)

我试过这个

git revert --no-commit abcdef123456 -- my/path/to/revert

我得到了这个错误

fatal: ambiguous argument 'my/path/to/revert': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

但这正是我所做的!(是的,my/path/to/revert在我的工作树中。)

我的工作理论是不可能只恢复某些文件,并且 Git 错误消息具有误导性。

(Git 1.7.9.5)


这不是在 git中将单个文件恢复到以前版本的副本。

  • 这个问题(尽管有标题)与git-checkout相关。签出将文件恢复到以前的版本,删除该点之后的所有提交。
  • 我的问题与git-revert相关。还原会撤消在特定提交中所做的更改,而不会触及以后可能出现的其他提交。它应用(仅)该提交的反向。
4

4 回答 4

29

我认为 git 不允许您指定要还原的特定文件。我能想到的最好的是:

git revert --no-commit <commit hash> # Revert, don't commit it yet
git reset # Unstage everything
git add yourFilesToRevert # Add the file to revert
git commit -m "commit message"
git reset --hard # Undo changes from the part of the revert that we didn't commit
于 2014-04-14T19:49:00.163 回答
11

当你可以列出你想要的东西时,一个更短的序列:

git revert that_commit           # do the whole revert
git reset --hard HEAD^           # in what turns out to have been a throwaway commit
git checkout HEAD@{1} -- one/folder   # and just take what you want of the results
于 2014-04-18T14:12:14.650 回答
9

vcsjones 的回答可能是最好的方法,因为 revert 使用三路合并机制。但是,在许多情况下,您可以git apply -R(反转)有问题的文件(或多个文件)的补丁,例如:

git show <rev> -- path/to/file | git apply -R

(或者git diff- 任何允许您将结果限制为特定文件的差异生成器,实际上 - 但git show对于非合并提交来说显然是首选;对于合并,您需要指定正确的父级)。

于 2014-04-15T23:04:14.873 回答
0

Git 通过提交工作。您不能 git 还原文件。即使提交中只有一个文件,您仍在还原提交。解决方案是模拟 git revert 以获取新提交所需的内容。我没有看到这里显示的最干净和最安全的方式 - 在另一个分支上恢复并检查您需要的内容。与 git apply 不同,如果存在合并冲突,它不会中断,并且恢复/重置实际上只适合撤消一次提交。

git checkout -b tmpbranch
git revert commitref                   # complete commit, follow with more reverts as needed
git checkout mainbranch
git checkout tmpbranch -- file/i/need  # while on mainbranch and to index by default
git commit -m "this is a new commit message"
git branch -d tmpbranch
于 2021-02-08T04:46:59.483 回答