我想恢复提交,但仅限于某些文件。 (不是结账;还原。如果您不熟悉差异,请继续阅读。)
我试过这个
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的重复。
答案 0 :(得分:19)
我不认为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
答案 1 :(得分:9)
vcsjones' answer可能是最好的方法,因为revert使用三向合并机制。但是,对于许多情况,您可以git apply -R
(反向)对相关文件(或文件)的补丁,例如:
git show <rev> -- path/to/file | git apply -R
(或git diff
- 允许您将结果限制为特定文件的任何diff生成器,但实际上git show
是非合并提交的明显要求;对于合并你的&#39 ; d需要指定正确的父级。)
答案 2 :(得分:8)
您可以列出所需内容的简短列表:
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
答案 3 :(得分:0)
Git 通过提交工作。你不能 git revert 一个文件。即使提交中只有一个文件,您仍然在还原提交。解决方案是模拟 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