我可以在GIT中进行部分恢复吗?

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

全文我犯了一堆文件。 后来的一些提交人将保持无名(JACK !!!)将文件复制到他的存储库并提交了多个文件,覆盖了我所做的一些更改。 我想恢复一个被破坏或更好的文件,进入并恢复该文件中的两个更改。 这将是一个单独的恢复提交,因为它被拉和推。

您可以通过添加'–no-commit'选项来恢复提交而不创build新提交。 这会将所有还原的文件留在暂存区域中。 从那里,我会执行软重置,并添加我真正想要的更改。 对于示例工作stream程:

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 checkout . // This wipes all the undesired reverts still hanging around in the working copy git commit 

您可以使用checkout命令以交互方式应用旧版本的文件。

例如,如果您知道将要添加的代码删除的COMMIT ,则可以运行以下命令:

 git checkout -p COMMIT^ -- FILE_TO_REVERT 

Git会提示你添加当前文件版本中缺less的文件。 您可以使用e创build修改的补丁,然后再应用它。

你可以用git checkout手工检查你想要恢复的文件的旧内容。 例如,如果你想把my-important-file恢复到版本号为abc123的版本,你可以这样做

 git checkout abc123 -- my-important-file 

现在你已经拥有了my-important-file的旧内容,如果你愿意的话,甚至可以编辑它们,并且像往常一样承诺提交一个将恢复他所做的修改的提交。 如果只有他想提交的部分提交,请使用git add -p从您正在提交的补丁中只select几个hunk。

我在Git邮件列表中find了一种方法:

 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 ,那么你需要添加-p0git apply命令,例如

 git show <commit> -- <path> | git apply -p0 --reverse