【问题标题】:amending a single file in a past commit in git在 git 中修改过去提交中的单个文件
【发布时间】:2010-10-04 08:30:03
【问题描述】:

我想在过去的提交中修复一个文件。这可能会影响所有升序提交。

有没有简单的方法可以做到这一点?你能给我一个指导方针吗?

很多时候,当我提交两次时,我发现我在第一次提交时出错了,我希望修复错误,而不必“git reset”我最后一次好的提交。

为了澄清。我想改变实际的commit,也就是我想改变过去commit的内容。 IOW 我想改变历史!

【问题讨论】:

    标签: git


    【解决方案1】:

    如果您只想修改倒数第二个提交(例如,不久前,尤其是在许多分支和合并之前),那么我使用此过程:

    1. git checkout -b tmp bad-commit
    2. 修复文件
    3. git commit --amend
    4. git rebase tmp master

    如果您之间有合并,您可能想尝试rebase -i -p,但结果可能会有所不同。

    【讨论】:

    • 这将改变你的历史。在 rebase 之后,可以从分支顶端访问的具有正确名称的提交将是固定提交。当你推送时,错误的提交不会被发送到服务器。
    • 它认为最后一个变基命令应该是rebase --onto tmp bad-commit master。按照目前的情况,rebase 将尝试将错误提交应用于可能没有效果但可能导致冲突或保留和不需要的更改,具体取决于“修复”的激进程度。
    • @Charles Bailey:100% 确定,你必须使用你的命令。但是,我通常不会打扰,它会导致冲突(这很容易解决)。
    • Tbh 这甚至在执行了几次合并时也有效,我必须修复一个 2 周前的提交,运行 rebase 后有一些冲突,但在 10 分钟内排序。救命稻草!
    • 别忘了删除 tmp :)
    【解决方案2】:

    看起来像:

    您可以在this comment 中找到 rebase 交互的示例:然后您可以避免临时分支,但同样,它更复杂。

    我还经常变基以清理开发历史,以便更改正确并正确分组。

    虚构的例子:
    我将函数 foo 重命名为 bar 并提交一条注释,上面写着“将 foo 重命名为 bar”。
    然后我继续下一个功能或修复,并提交它,然后继续下一个。
    在进行到一半时,我发现我错过了 foo!
    我提交正在进行的工作(或使用 git-stash),修复丢失的“foo”并提交,然后使用 @987654329 @ 将所有 foo 修复合并到一个干净的提交中。
    如果我没有使用git-stash,那么当我最终完成正在进行的功能时,我将使用git-commit --amend(另一种形式的变基)。

    当我的补丁被推送以供审查时,所有部分都是正确的,并且讲述了一个连贯的故事。有时我使用git-rebase --interactive 只是为了进行影响相同位的相邻时间分离的更改,以便更改在上下文中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2011-07-16
      • 2021-04-30
      • 1970-01-01
      • 2014-06-29
      相关资源
      最近更新 更多