Git revert certain files

冷暖自知 提交于 2019-12-18 14:15:24

问题


I want to do a revert of a commit, but only for some files. (Not a checkout; a revert. If you are unfamiliar with the difference, keep reading.)

I tried this

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

And I got this error

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

But that is precisely what I did! (And yes, my/path/to/revert is in my working tree.)

My working theory is that it is not possible to revert only some files, and that the Git error message is misleading.

(Git 1.7.9.5)


This is not a duplicate of Reverting a single file to a previous version in git.

  • That question (despite the title) pertains to git-checkout. A checkout restores a file to a previous version, removing all commits after that point.
  • My question pertains to git-revert. A revert undoes changes made in a particular commit, without touching other commits that may have come later. It applies the reverse of (only) that commit.

回答1:


A shorter sequence for when you can make a short list of what you want:

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



回答2:


I don't think git lets you specify particular files to revert. The best I can think of is this:

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



回答3:


vcsjones' answer is probably the best way since revert uses the three-way merge machinery. However, for many cases, you could git apply -R (reverse) the patch to the file (or files) in question, e.g.:

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

(or git diff—any diff generator that allow you to limit the result to specific files, really—but git show is the obvious go-to for non-merge commits; for merges you'd need to specify the correct parent).



来源:https://stackoverflow.com/questions/23068790/git-revert-certain-files

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!