我可以在GIT中进行部分还原吗?



是否可以在多文件提交中只恢复单个文件或文件中的某些更改?

全部我提交了一堆文件。在多次提交之后,一个不愿透露姓名的人(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

最新更新