【问题标题】: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 cherry-pick。不过,不确定您的想法是什么!

标签: 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 和一些编辑来组合一个文本文件,列出您想要/不想撤消其更改的路径,然后在我谈到在命令行上使用路径列表来拉入该文件的地方。每行一个或空格分隔的对于这种事情都可以正常工作。哦,如果你的路径中有空格,你需要在文件中的路径周围加上引号才能工作。

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 2017-07-09
    • 2018-08-29
    • 2021-01-22
    • 2016-01-08
    • 2020-07-06
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多