1

我正在熟悉 GIT,只需放弃 svn 并继续使用 GIT。现在我弄脏了我的手:
我创建了一个分支并使用 emacs 宏更改了一堆文件,并使用 commit -a 将它们全部提交。我也对其他一些文件进行了一些其他更改。在将所有内容合并到 master 之前,我测试了一些东西,并且 emacs 宏缺少一些基本细节。所以现在大部分的批量提交应该被撤消,但不是全部。并且批量提交后的提交也很可靠。继续恢复大部分批量提交的最简单方法是什么?有樱桃采摘工具吗?我目前正在使用命令行 git 和 emacs vcs (git-el)。我买了一本书并浏览了几个网站,但到目前为止我还没有找到一个令人满意的答案。

问候,
杰伦。

4

1 回答 1

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>. 编辑第一行(应该有第一行批量提交)以eor开头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)我谈论使用路径列表的地方一样在命令行上拉入该文件。每行一个或空格分隔的文件可以很好地处理这种事情。哦,如果路径中有空格,则需要在文件中的路径周围加上引号才能使其工作。

于 2011-02-20T21:50:12.333 回答