将一个提交应用到工作副本的反向操作

53
为了调查之前提交引入的影响,我希望将其反向应用到我的工作副本中并尝试修改代码。
我已经使用了创建和应用补丁的工作流程,但想知道是否有更简便的方法。
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引入的更改取消应用到我的当前工作副本中。


你正在进行什么手动编辑? - John Zwinck
那是补丁没有干净地应用; 发出有关空格的警告。 - berkes
3个回答

65

那么 git revert -n 怎么样?

-n
--no-commit

通常,该命令会自动创建一些提交,其中包含说明已还原哪些提交的提交日志消息。此标志将逆转指定提交所需的更改应用于您的工作树和索引,但不会进行提交。此外,在使用此选项时,您的索引不必与HEAD提交匹配。还原是针对索引的起始状态完成的。

当要连续还原多个提交的影响到您的索引时,这很有用。


10
很遗憾,这仅适用于您的工作副本未对提交所影响的任何文件进行修改的情况(但可以对其他文件进行更改)。我猜,在这种情况下,您需要使用git stash; git revert -n <commit>; git stash pop命令,并解决冲突(如果有的话)。 - arekolek

27

另一种有效的方法是 git show | git apply -R。 这里的 -R 表示反转差异。

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

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


1
有趣的事实:还有git show -R - cambunctious
使用git show对我没有起作用。但是使用git diff <hash> -R | git apply起作用了。 - P.R.

1
如果您想获取之前的提交记录,那么最简单的方法是:
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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接