撤消或删除先前 Git 提交的更改
Undo or remove changes from a previous Git commit
假设我有一个提交列表:
A > B > C > D > E
,如何从历史记录中删除 C 中所做的更改,以获得 A > B > D > E
?
您可以随时恢复更改。
git revert C
如果你想改写历史,这就是rebase
的目的。您需要:
git rebase -i A
然后从提交列表中删除 C。
更长的解释:
第一个选项通过创建与原始提交相反的新提交来恢复更改。所以存储库看起来像:
A > B > C > D > E > C`
其中C`与C相反。基本上与patch --reverse
相同
第二个选项改变历史。 rebase
允许您 select 特定的提交、更改提交的顺序等等。我建议阅读 git-rebase。
-i
标志用于交互模式,允许用户在变基之前编辑提交列表。
如果从提交列表中删除 C 并执行变基,实际输出将是
A > B > D > E
您在分支中不再有 C 的历史记录。
注意:在这两种情况下,您可能会在过程中发生冲突。
在第一种情况下,因为您在 E 上应用 C`,在第二种情况下,因为您在 B 上应用 D。
尝试git revert C
...最好也阅读 man git-revert
你做不到和得到A > B > D > E
。
你将永远以 A > B > D' > E'
结尾
要删除 C 中引入的更改,您可以使用
git rebase --onto <newbase> <oldbase> <commit/branch>
你的情况:
git rebase --onto B C E
这会将 D..E
中引入的更改从旧基础 C
放到新基础 B
中(如果您没有遇到任何冲突)导致
A > B > D' > E'
重要 需要注意 D
和 E
获得新的 sha ID 导致 D'
和 E'
所以如果您已经发布了 C
、D
或 E
,请使用还原方法 (git revert C
),否则您可能会弄乱其他人的历史。
假设我有一个提交列表:
A > B > C > D > E
,如何从历史记录中删除 C 中所做的更改,以获得 A > B > D > E
?
您可以随时恢复更改。
git revert C
如果你想改写历史,这就是rebase
的目的。您需要:
git rebase -i A
然后从提交列表中删除 C。
更长的解释:
第一个选项通过创建与原始提交相反的新提交来恢复更改。所以存储库看起来像:
A > B > C > D > E > C`
其中C`与C相反。基本上与patch --reverse
第二个选项改变历史。 rebase
允许您 select 特定的提交、更改提交的顺序等等。我建议阅读 git-rebase。
-i
标志用于交互模式,允许用户在变基之前编辑提交列表。
如果从提交列表中删除 C 并执行变基,实际输出将是
A > B > D > E
您在分支中不再有 C 的历史记录。
注意:在这两种情况下,您可能会在过程中发生冲突。 在第一种情况下,因为您在 E 上应用 C`,在第二种情况下,因为您在 B 上应用 D。
尝试git revert C
...最好也阅读 man git-revert
你做不到和得到A > B > D > E
。
你将永远以 A > B > D' > E'
要删除 C 中引入的更改,您可以使用
git rebase --onto <newbase> <oldbase> <commit/branch>
你的情况:
git rebase --onto B C E
这会将 D..E
中引入的更改从旧基础 C
放到新基础 B
中(如果您没有遇到任何冲突)导致
A > B > D' > E'
重要 需要注意 D
和 E
获得新的 sha ID 导致 D'
和 E'
所以如果您已经发布了 C
、D
或 E
,请使用还原方法 (git revert C
),否则您可能会弄乱其他人的历史。