如何撤消任意提交中的更改?

亚历克斯·博尔巴赫

我有一些提交是在HEAD. 在提交时,有一些我没有注意到的变化。浏览我的git log我注意到这些不需要的变化。在 google 中搜索'undo changes for an arbitrary commit',在撤消整个提交和删除索引中的更改时返回许多结果。但是,在这种任意提交中删除这些更改的方法是什么?

轴心

首先,确保您的工作树是干净的。git status帮助你找到这个。它不应报告任何等待提交的更改。如果有更改,您可以提交它们(如果需要,在临时分支中)或隐藏它们。

确保工作树是干净的后,在当前提交上创建一个分支,但不要检查它:

$ git branch backup

它不是真正需要的,您可以使用 reflog 代替,但这种方式更容易(也更明显)。backup只是我为分支选择的名称,它没有什么特别之处;唯一的限制是它不能已经存在。

假设你想修改过去的第三次提交,运行:

$ git rebase --interactive HEAD~4

Git 在默认编辑器中打开一个临时文件,其内容如下所示:

pick 7f0c5e794 the commit you want to change
pick 9f96dcae9 commit message #2
pick 02ed04062 commit message #3
pick beac35780 the most recent commit

这是 rebase 的计划。当然,它包含您最近三个提交的哈希值和主题。它们是HEAD~4按时间顺序排列的最后四次提交(因为)(较旧的在前)。

编辑要修改的提交行(第一行);更改pickedit然后保存文件并退出编辑器。

当您退出编辑器时,Git 会启动变基。它检查提交HEAD~3并退出,允许您edit按照您在计划中的要求进行提交。

进行您想要的更改,暂存它们,然后运行git commit --amend以修改提交(您的目标)。进行更改的最佳方法是运行:

$ git reset --mixed HEAD~1

这使 repo 处于您要修改的提交之前的状态,工作树中的文件已更改,并且没有向索引添加任何内容。仅将您需要的文件添加到索引并提交(没有 --amend)。这是您想要的“编辑” 1 次提交。

编辑提交后,工作树中仍有未提交的更改。您必须提交它们(创建一个在原始历史记录中不存在的新提交),隐藏它们(并在完成 rebase 后应用它们)或完全丢弃它们(git reset --hard是否;确保您真的不需要他们在运行此命令之前)。

在以一种或另一种方式解决未提交更改的问题后,运行:

$ git rebase --continue

Git 继续 rebase;它会按照您在计划中的说明处理其他提交。我们的计划提到pick了其他提交,这意味着 Git 只应用您不想修改的这些提交的更改。

如果一切顺利,在此命令完成后,您将拥有一个看起来像您想要的新历史记录行。如果它看起来不像你想要的,你可以运行

$ git reset --hard backup

回到你开始的地方并重新开始。

如果 rebase 没有成功完成(它可能会遇到冲突),您始终可以通过运行git rebase --abort. Git 将撤消所有更改,您将回到起点(在backup分支指向的提交上)。

或者,您可以解决冲突、提交和运行,git rebase --continue直到变基完成。

在以某种方式结束 rebase 并且您对结果感到满意或已经放弃更改过去提交的想法后,运行git branch -D backup以删除备份分支。


1 Git 提交是不可变的。无法编辑提交。“编辑”一个提交实际上会创建一个新的提交来代替旧的提交。当然,新提交的哈希值与原始提交不同。

旧提交仍然存在于存储库中,并且可以通过其哈希或使用分支访问。当没有可用于到达它的分支并且reflog 中没有对它的引用时,提交对象将在下一个垃圾收集周期中删除。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章