git revert -n <hash of bulk commit>
将尝试反转工作树中批量提交中的更改。完成后,您可以运行git reset HEAD -- <paths to keep changes in>
(--patch
以交互方式选择要保留的更改)。然后你像任何其他提交一样提交它。
您的存储库是私有的/未推送的吗?如果是这样,您还有另一种选择,尽管我不建议这样做。 git rebase -i <hash of commit before bulk>
. 编辑第一行(应该有第一行批量提交)以e
or开头edit
。
此时,您可以使用git reset <hash of commit before bulk> -- <paths to revert>
其次git commit --amend
来修复您的批量提交以排除某些文件中的更改。然后git rebase --continue
将在调整后的提交之上重写所有剩余的历史;如果它们触及文件的还原位,您可能必须解决冲突并再次继续。在那之后,你的历史看起来就像你从来没有做过一些糟糕的改变;对于一个私人项目,这可能是一件好事,但请注意,在 rebase 之后,很难回到您正在重写的任何中间状态。您可以暂时这样做git reflog
,但最终旧版本的提交将过期并从存储库中删除。
在任何一种情况下,我都建议使用git diff --name-only
和一些编辑来组合一个文本文件,列出您想要/不想撤消其更改的路径,然后使用一个 shell 结构,就像$(< badfiles)
我谈论使用路径列表的地方一样在命令行上拉入该文件。每行一个或空格分隔的文件可以很好地处理这种事情。哦,如果路径中有空格,则需要在文件中的路径周围加上引号才能使其工作。