【问题标题】:git revert multiple files of bulk commitgit revert 批量提交的多个文件
【发布时间】:2011-06-30 22:03:07
【问题描述】:
我正在熟悉 GIT,只是放弃 svn 并继续使用 GIT。现在我弄脏了我的手:
我创建了一个分支并使用 emacs 宏更改了一堆文件,并使用 commit -a 将它们全部提交。我也对其他一些文件做了一些其他更改。在将所有内容合并到 master 之前,我测试了一些东西,并且 emacs 宏缺少一些基本细节。因此,现在应该撤消大部分批量提交,但不是全部。并且批量提交之后的提交也很可靠。继续恢复大部分批量提交的最简单方法是什么?有樱桃采摘工具吗?
我目前正在使用命令行 git 和 emacs vcs (git-el)。我买了一本书,浏览了几个网站,但到目前为止我还没有找到满意的答案。
问候,
杰罗恩。
【问题讨论】:
标签:
git
commit
partial
bulk
revert
【解决方案1】:
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 或edit 开头。
此时,您可以使用git reset <hash of commit before bulk> -- <paths to revert> 后跟git commit --amend 来修复您的批量提交以排除某些文件中的更改。然后git rebase --continue 将在调整后的提交之上重写你所有剩余的历史;如果它们触及文件的还原位,您可能必须解决冲突并再次继续。在那之后,你的历史看起来就像你根本没有做过一些糟糕的改变;对于一个私人项目,这可能是一件好事,但请注意,在 rebase 之后,很难回到您正在重写的任何中间状态。你可以暂时使用git reflog,但最终旧版本的提交将过期并从存储库中删除。
在任何一种情况下,我都建议使用git diff --name-only 和一些编辑来组合一个文本文件,列出您想要/不想撤消其更改的路径,然后在我谈到在命令行上使用路径列表来拉入该文件的地方。每行一个或空格分隔的对于这种事情都可以正常工作。哦,如果你的路径中有空格,你需要在文件中的路径周围加上引号才能工作。