我可以在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
,那么你需要添加-p0
到git apply
命令,例如
git show <commit> -- <path> | git apply -p0 --reverse