【问题标题】:Reverse Apply a commit to working copy反向将提交应用到工作副本
【发布时间】:2013-04-10 04:47:20
【问题描述】:

为了研究先前提交引入的效果,我想将其反向应用到我的工作副本并摆弄代码。

我管理着围绕创建和应用补丁的工作流程,但想知道这是否可以更轻松地完成。

git checkout -b "tmp-fiddle"
git diff -R -p d9fd2bb^ d9fd2bb > patch_to_examine.patch
# Manually edit the patch a little
git apply patch_to_examine.patch

请注意,我没有查看 git revertgit rebase -i,因为它们会引入新的提交或更改历史记录:我只希望 d9fd2bb 中引入的更改不应用于我当前的工作副本.

【问题讨论】:

  • 你在做什么手动编辑?
  • 那是补丁应用不干净;发送有关空白的警告。

标签: git revert


【解决方案1】:

git revert -n怎么样?

-n
--no-commit

通常该命令会自动创建一些提交,其中包含提交日志消息,说明哪些提交已被还原。此标志应用必要的更改以将命名提交恢复到您的工作树和索引,但不进行提交。此外,使用此选项时,您的索引不必匹配 HEAD 提交。恢复是针对索引的开始状态完成的。

这在将多个提交的效果连续还原到您的索引时很有用。

【讨论】:

  • 不幸的是,这只有在您的工作副本没有修改任何受提交影响的文件时才有效(尽管它可以在其他文件中进行更改)。我想,在这种情况下,您需要git stash; git revert -n <commit>; git stash pop 并解决冲突(如果有)。
【解决方案2】:

另一种可行的方法是git show | git apply -R-R 代表反向差异。

这适用于任何差异,因此您可以使用git diff [...] | git apply -R

或者反转一个隐藏git stash show -p stash@{0} | git apply -R

【讨论】:

    【解决方案3】:

    如果您在之前的提交之后。那么最简单的方法就是

    git reset HEAD~ -- .
    

    它的作用是使您的工作树完好无损,但会更改索引以匹配先前的提交。 Git diff 和 GUI 工具将突出显示更改,并允许您通过它们删除、恢复或更改一些大块。随后的git -a commit --amend / git -a commit 将修复当前提交或创建单独的修复提交,而git reset --hard 将放弃它们。

    选择任意更改并将树留在 HEAD。

    git revert -n <changeset> # or changeset range
    git reset -s HEAD . # restore worktree to the tip (but leave staging as above)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-15
      • 2015-11-26
      • 2015-09-12
      • 2011-02-23
      • 2012-05-01
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      相关资源
      最近更新 更多