44

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

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

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 revert或者git rebase -i因为这些会引入新的提交或更改历史记录:我只希望引入的更改d9fd2bb不应用于我当前的工作副本。

4

3 回答 3

58

怎么样git revert -n

-n
--no-commit

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

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

于 2013-04-17T12:22:28.480 回答
21

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

这适用于任何差异,所以你可以做git diff [...] | git apply -R

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

于 2019-08-16T06:22:45.470 回答
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)
于 2020-11-30T15:00:15.500 回答