是否可以在多文件提交中只恢复单个文件或文件中的某些更改?
全部我提交了一堆文件。在多次提交之后,一个不愿透露姓名的人(JACK!!)将一个文件复制到他的存储库中,并提交了几个文件,覆盖了我所做的一些更改。我想要还原一个被破坏的文件,或者更好的是,还原该文件中的两个更改。这必须是一个单独的恢复提交,因为它被拉和推。
您可以通过添加--no-commit
选项来恢复提交,而无需创建新提交。这将使所有已还原的文件留在暂存区。
从那里,我将执行混合重置(重置的默认值)来取消文件,并添加我真正想要的更改。然后,提交(如果需要多次提交,可以添加和提交更多文件),最后,签出当前目录,以清除revert
导致的任何未提交和未分级的修改。对于示例工作流:
git revert <sha-of-bad-commit> --no-commit
git reset # This gets them out of the staging area
# ...edit bad file to look like it should, if necessary
git add <bad-file>
git commit
git checkout . # This wipes all the undesired reverts still hanging around in the working copy
您可以使用checkout
命令交互式地应用旧版本的文件。
例如,如果您知道要重新添加的代码已被删除的COMMIT
,则可以运行以下命令:
git checkout -p COMMIT^ -- FILE_TO_REVERT
Git将提示您添加当前版本文件中缺少的块。您可以使用e
在应用更改之前创建更改的补丁。
您可以手动检出您想要使用git checkout
恢复的文件的旧的、好的内容。例如,如果您想将my-important-file
还原为abc123
版本中的版本,您可以执行
git checkout abc123 -- my-important-file
现在你有my-important-file
的旧内容回来了,甚至可以编辑他们,如果你喜欢,并像往常一样提交一个提交,这将恢复他所做的更改。如果你想要还原他提交的一些部分,使用git add -p
从你正在提交的补丁中只选择几个块。
我在Git邮件列表中找到了一种方法:
git show <commit> -- <path> | git apply --reverse
来源:http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html a6064406
<标题> 变化如果补丁没有干净地应用,该命令将失败(不引起任何更改),但使用--3way
,您将获得可以手动解决的冲突(在这种情况下Casey的答案可能更实用):
git show <commit> -- <path> | git apply --reverse --3way
您也可以使用它来部分地还原多个提交,例如:
git log -S<string> --patch | git apply --reverse
在任何提交中恢复与<string>
匹配的文件。这正是我在用例中所需要的(几个单独的提交对不同的文件引入了类似的更改,同时以不相关的方式更改了其他文件,我不想恢复)。
如果你在~/.gitconfig
中设置了diff.noprefix=true
,那么你需要在git apply
命令中添加-p0
,例如
git show <commit> -- <path> | git apply -p0 --reverse
标题>