如何使用Git修改非头提交?

如何使用Git修改非头提交?,git,Git,我已经向Git存储库中的本地主题分支提交了一系列更改。在每次提交之后,如果可能的话,我会运行一组小的冒烟测试来验证功能。在提交pull请求之前运行一组更大的测试之后,我发现前面遗漏了更多的bug。我可以为bug修复创建一个新的提交,但因为它只是一个本地主题分支,所以我想修改我已有的提交。我有两种方法: 进行更改,测试它们。将它们隐藏起来,然后在rebase-i期间在适当的位置弹出 进行一次新的提交,然后重新设置基址,以便对它们进行重新排序并将其压缩 如果在上一次提交中碰巧需要修复bug,那么我可

我已经向Git存储库中的本地主题分支提交了一系列更改。在每次提交之后,如果可能的话,我会运行一组小的冒烟测试来验证功能。在提交pull请求之前运行一组更大的测试之后,我发现前面遗漏了更多的bug。我可以为bug修复创建一个新的提交,但因为它只是一个本地主题分支,所以我想修改我已有的提交。我有两种方法:

  • 进行更改,测试它们。将它们隐藏起来,然后在rebase-i期间在适当的位置弹出
  • 进行一次新的提交,然后重新设置基址,以便对它们进行重新排序并将其压缩

  • 如果在上一次提交中碰巧需要修复bug,那么我可以使用--amend提交以解决问题。Git是否提供了修改HEAD父项的快捷方式,或者我是否坚持使用当前方法?

    Git不提供修改当前HEAD以外的提交的快捷方式。这是因为对提交的每一次更改都将有效地创建一个与以前的提交对象不兼容的全新提交对象。这也意味着,当您要更改HEAD的直接父级时,HEAD也需要更改。这是一种不明显的破坏性行为。编辑您以前发布的任何提交也是非常不鼓励的

    如果你真的想这样做,你必须做一个交互式的重基,其影响是非常清楚的:每个重基都会创建新的、不兼容的提交对象


    正确的解决方案是保持历史记录的原样,即使有错误,只需添加一个新的提交即可修复前面引入的错误。Git应该像在项目中一样尊重历史。正如您在以后实际识别并修复了该bug一样,您也应该创建一个提交,以便稍后修复该bug。将非完美代码作为历史的一部分并没有错。过去不断更改的提交只会引入更多的问题,您可以用它来解决,这有点违背“源代码管理精神”。

    您说过
    local branch
    ,我将回答,假设您还没有推动任何事情,否则不要这样做

    假设您要编辑的提交是'abcdef',您将运行一个重基

    git rebase abcdef~ 
    # the ~ is needed, you need the parent of the commit you want to edit
    

    然后,当编辑器启动时,将要编辑的提交从
    pick
    更改为
    edit
    e
    ,保存并关闭,
    标题将在该位置停止,做你想做的任何更改,然后进行阶段性更改,然后执行
    commit
    rebase--continue
    ,然后rebase将继续。

    还有另一种解决此问题的方法,即按以下方式使用:主题分支中的每个commit都将变成它自己的分支(当提交已经存在时,您可以使用
    tg import
    进行此操作)。要编辑提交,您只需切换到其相应的分支,编辑它,
    git commit
    it,然后运行
    tg update-a
    将更改转发到依赖它的所有修补程序。最后,您将运行
    tg export
    (选择适当的命令行选项)将临时TopGit分支转换为最终的修订系列。

    等等,你的意思是
    abcdef^
    ?我想
    ~
    总是要取一个数字,例如
    abcdef~1
    ,这就是我正在做的(#2)。想知道是否有快捷方式。我的存储库非常大,虽然不是无法清理的,但避免这些操作的时间(通常为几分钟)是有价值的.
    ~
    没有数字意味着一个家长向上,就像
    ^
    如果这就是你正在做的,那么你就是在用我所知道的最好的方式来做的,对于树上更高一层的家长来说,没有任何修正。我喜欢把话题分支看作可以随意编辑的故事。这有助于通过删减我所知道的最大的搅动使历史更具可读性n更改,这有助于减少代码审查的工作量。不过,我同意,一旦合并,重写历史将变得不吸引人。非常酷-看起来它肯定会解决我的问题。谢谢!