【问题标题】:Git revert certain filesGit恢复某些文件
【发布时间】:2014-05-28 22:13:57
【问题描述】:

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

我试过了

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)


这不是Reverting a single file to a previous version in git 的重复

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

【问题讨论】:

  • 你能解释一下你需要revert而不是使用checkout吗?据我所知,检出适当的文件,然后提交相当于还原。
  • 我认为您无法还原单个文件,您在哪里读到的,它在文档中吗?但是,您可以反向应用补丁,以及 git apply:git show <commit> -- <path> | git apply -R,在此处找到:git.661346.n2.nabble.com/…
  • 我认为这可能是这篇文章的副本:stackoverflow.com/questions/2733873/…
  • @ChrisMaes,请参阅我对checkoutrevert 之间区别的解释。
  • @PaulDraper,很有趣,显然我多年来一直误解 revert。因此,如果您有提交 A(较旧)、BC,您希望反转来自 A 的更改,同时保留来自较新提交 BC 的更改。

标签: git git-revert


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为 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
    

    【讨论】:

    • FWIW,将它封装在一个 shell 脚本中应该很容易,如果你发现自己经常这样做,它会更容易。
    • 或者,如果你想保留大部分文件在还原中并且只撤消一些,你可以做 git-revert,在你不想还原的文件上使用git reset --hard,然后提交.
    【解决方案3】:

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

    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
    

    【讨论】:

      【解决方案4】:

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

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

      (或git diff——任何允许你将结果限制为特定文件的差异生成器,真的——但git show是非合并提交的明显选择;对于合并,你需要指定正确的父母)。

      【讨论】:

      • 这当然是最简单的方法了。
      • 这不如其他答案稳健:error: patch failed: ...\n error: ...: patch does not apply
      • @jimbo1qaz:是的,这就是为什么我说 vcsjones 的答案可能是最好的(尽管 jthill 的答案也一样好,而且可能更容易——在我写上面的时候它还不存在) .
      猜你喜欢
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2019-03-09
      • 2020-07-09
      • 2011-10-11
      • 2010-10-30
      相关资源
      最近更新 更多