【问题标题】:Change an old commit in GIT更改 GIT 中的旧提交
【发布时间】:2014-07-12 18:10:46
【问题描述】:

通过从某处复制代码并在已经完成的大量工作(包括来自其他分支的许多合并)的基础上,提交了一项重大更改(包括对许多文件的更改以及文件的添加和删除)。现在我们必须知道之前复制了错误版本的代码。

我现在有什么方法可以通过复制正确版本的代码来更改该提交?

我查看了this,但这是一个线性历史。我还看了this,但示例仅用于添加新文件。

就我而言,我确信在更改旧提交后会出现冲突。我也可以添加新提交而不是更改现有提交。

【问题讨论】:

  • 你熟悉 git rebase 吗?
  • 是的,如前所述,两者之间有很多合并,我认为 rebase 没有成功,还是我想错了?

标签: git


【解决方案1】:

我同意 websterridge,修改历史可能不是要走的路;仅当您想永久删除旧提交的所有痕迹(并且存在一系列问题)时,这才有意义。

最好的解决方案可能是创建一个带有必要更改的新提交。这个想法是在提交的版本和应该提交的版本之间创建一个差异,并将该差异应用到当前版本。

你可以这样做(未经测试):

  • 在提交了错误代码的旧提交之上创建(并签出)一个分支:git checkout -b fix-branch SHA_OF_OLD_COMMIT
  • 将应提交的代码的正确版本复制到工作目录中。您可以直接覆盖错误的文件而不必担心冲突,因为您已经使用原始代码导入返回到旧提交。
  • 提交:git add --all . ; git commit -m "Fix import of wrong code."

现在你在 git 中有正确的代码,但是在分支“fix-branch”上。

您现在可以使用 git 的工具将正确的代码放入您当前的分支(假设是 master):要么在 master 之上 rebase fix-branch,要么将其合并到 master。 在这种情况下,合并可能会更好,因为这样存储库历史记录包含冲突解决之前新的、正确的代码导入的原始版本。

不管怎样,你可能会遇到很多冲突,但没有办法解决这个问题。

祝你好运!

【讨论】:

  • 非常感谢。我正在这样做,幸运的是没有预期的那么多冲突。只是想确认一件事。在将fix-branch 合并到功能分支时,如果我从fix-branch 到我的功能分支中发生了不冲突的更改,那么我认为它没有覆盖任何更改是正确的完成了错误的提交?因为如果是这样的话,就会有冲突。我说的对吗?
  • @iSid:是的,完全正确。如果在合并过程中“双方”都发生了变化,git 会报告冲突。没有冲突 - 没有被覆盖的更改。
【解决方案2】:

虽然听起来很合理,但改变历史是个坏主意,而且很复杂。另外,人们已经在他们的信息流中拥有了当前的历史记录。

更好的做法是硬着头皮用新的提交来纠正。

【讨论】:

  • 是的。最简单的解决方案可能是在提交的版本和应该提交的版本之间创建一个差异,并将该差异应用到当前状态。
  • 这种对话表明,像 git 一样伟大和简单,知道它的人值得他们在避免恶化中发挥作用!我希望我是一个:)
  • 我同意改变历史不好。因此,如果在不改变历史的情况下有可能,那就太好了。 @sleske,您能否提供一些命令以便我更好地理解它?
猜你喜欢
  • 2018-12-30
  • 2021-02-06
  • 1970-01-01
  • 2020-07-30
  • 2021-02-15
  • 2010-12-25
  • 2010-10-02
相关资源
最近更新 更多