【发布时间】:2010-10-04 08:30:03
【问题描述】:
我想在过去的提交中修复一个文件。这可能会影响所有升序提交。
有没有简单的方法可以做到这一点?你能给我一个指导方针吗?
很多时候,当我提交两次时,我发现我在第一次提交时出错了,我希望修复错误,而不必“git reset”我最后一次好的提交。
为了澄清。我想改变实际的commit,也就是我想改变过去commit的内容。 IOW 我想改变历史!
【问题讨论】:
标签: git
我想在过去的提交中修复一个文件。这可能会影响所有升序提交。
有没有简单的方法可以做到这一点?你能给我一个指导方针吗?
很多时候,当我提交两次时,我发现我在第一次提交时出错了,我希望修复错误,而不必“git reset”我最后一次好的提交。
为了澄清。我想改变实际的commit,也就是我想改变过去commit的内容。 IOW 我想改变历史!
【问题讨论】:
标签: git
如果您只想修改倒数第二个提交(例如,不久前,尤其是在许多分支和合并之前),那么我使用此过程:
git checkout -b tmp bad-commitgit commit --amendgit rebase tmp master如果您之间有合并,您可能想尝试rebase -i -p,但结果可能会有所不同。
【讨论】:
rebase --onto tmp bad-commit master。按照目前的情况,rebase 将尝试将错误提交应用于可能没有效果但可能导致冲突或保留和不需要的更改,具体取决于“修复”的激进程度。
看起来像:
filter-branch(可以做你想做的复杂命令)您可以在this comment 中找到 rebase 交互的示例:然后您可以避免临时分支,但同样,它更复杂。
我还经常变基以清理开发历史,以便更改正确并正确分组。
虚构的例子:
我将函数foo重命名为bar并提交一条注释,上面写着“将 foo 重命名为 bar”。
然后我继续下一个功能或修复,并提交它,然后继续下一个。
在进行到一半时,我发现我错过了foo!
我提交正在进行的工作(或使用 git-stash),修复丢失的“foo”并提交,然后使用 @987654329 @ 将所有foo修复合并到一个干净的提交中。
如果我没有使用git-stash,那么当我最终完成正在进行的功能时,我将使用git-commit --amend(另一种形式的变基)。当我的补丁被推送以供审查时,所有部分都是正确的,并且讲述了一个连贯的故事。有时我使用
git-rebase --interactive只是为了进行影响相同位的相邻时间分离的更改,以便更改在上下文中。
【讨论】: