我正在熟悉GIT的过程中,只是放弃了svn,继续使用GIT。现在我弄脏了我的手:
我创建了一个分支,并使用emacs宏更改了一堆文件,然后使用commit -a提交了所有这些文件。我也对其他一些文件做了一些其他的修改。在将所有东西合并到master之前,我测试了一些东西,emacs宏缺少一些必要的细节。因此,现在批量提交的大部分应该被撤消,但不是全部。并且批量提交之后的提交也是可靠的。恢复大部分批量提交的最简单方法是什么?有没有樱桃采摘实用程序?我目前使用的是命令行git和emacs vc (git-el)。我买了一本书,浏览了几个网站,但到目前为止还没有找到令人满意的答案。
致以敬意,
杰伦。
发布于 2011-02-21 05:50:12
git revert -n <hash of bulk commit>将尝试在您的工作树中撤销批量提交中的更改。完成后,您可以使用--patch运行git reset HEAD -- <paths to keep changes in> (用于交互式地选择要保留的更改)。然后,您可以像其他任何提交一样进行提交。
您的存储库是私有的还是非推送的?如果是这样的话,您还有另一个选择,尽管我不建议这样做。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将在调整后的提交之上重写所有剩余的历史记录;如果冲突触及文件的还原部分,您可能必须解决冲突并再次继续。在那之后,你的历史将看起来像你从来没有做过一些糟糕的更改;对于一个私人项目来说,这可能是一件好事,但要意识到,在重新基址之后,很难回到你正在重写的任何中间状态。您可以使用git reflog执行一段时间,但最终提交的旧版本将过期并从存储库中删除。
在这两种情况下,我都建议使用git diff --name-only和一些编辑将列出您想要/不想撤消其更改的路径的文本文件放在一起,然后在我讨论在命令行上使用路径列表的地方使用$(< badfiles)之类的外壳结构来提取该文件。每行一个或空格分隔的行可以很好地处理这类事情。哦,如果您的路径中有空格,则需要在文件中的路径两边加上引号才能使其工作。
https://stackoverflow.com/questions/5060192
复制相似问题