修改git的重新基址

修改git的重新基址,git,Git,我做了一个git-rebase-master,这涉及到在三个文件中进行一些手动合并。在其中一个例子中,我遗漏了一个尾随的换行符,导致文件末尾出现以下情况: <<<<<<< HEAD ======= >>>>>>> ... commit message >。。。提交消息 这自然会导致PHP错误。我可以很容易地修复该文件,但我不想添加错误的“修复草率的重基”提交 我如何修改对重基的更改?或者,重复重新基址以便我

我做了一个
git-rebase-master
,这涉及到在三个文件中进行一些手动合并。在其中一个例子中,我遗漏了一个尾随的换行符,导致文件末尾出现以下情况:

<<<<<<< HEAD
=======

>>>>>>> ... commit message
>。。。提交消息
这自然会导致PHP错误。我可以很容易地修复该文件,但我不想添加错误的“修复草率的重基”提交


我如何修改对重基的更改?或者,重复重新基址以便我能捕捉到它?

您可以进行更改,然后
git commit--amend
这个问题基本上归结为“如何修改不是最新的提交?”。假设您没有将提交推到任何地方,并且进一步假设从提交开始,历史是线性的,这非常容易

  • 进行要应用于先前提交的更改
  • 找出要修改的较早提交是什么。出于这些说明的考虑,我们将其命名为
    $SHA
    ,但您可以使用任何想要标识此提交的方法
  • 运行git提交--fixup$SHA
  • 运行git-rebase-i--autosquash$SHA^
  • 这将为您提供一个包含提交列表的编辑器。第一次提交应该是
    $SHA
    ,第二次提交应该是您的编辑,接下来应该是
    HEAD
    之前的其余提交。保存并关闭此编辑器。Git现在将执行一个交互式重基,将您的更改应用于您想要修改的提交



    您可以使用另一种解决方案,该解决方案更为手动,但不需要交互式重新基址。基本上,您可以直接签出要修改的提交(生成一个分离的头部),进行更改,运行
    git commit--amend
    ,然后在新修改的提交之上重新设置分支的基础。实际上,您可能更喜欢这种风格,因为它更明确地说明了您正在做的事情,但交互式基础版本的好处是,您可以使用交互式基础做更多的事情。例如,您可以对提交重新排序、将多个提交挤压在一起、删除提交、重写提交等。您还可以使用
    --fixup
    --squash
    标志来
    git commit
    记录您希望执行的这些操作,而无需立即实际执行重基,完成后,您可以返回并执行一个大型交互式重基。

    这样做会删除上次提交时显示的行。这与纠正重基不同。顺便说一句,我现在还需要知道如何清理它。我明白了。其余的再基地成功了吗?如果是这样的话,您应该能够
    git reset--hard[ref在错误合并之前提交]
    ,然后再次重新设置基址。如果你不介意我问的话,稍微草率的承诺有什么大不了的?很抱歉幸灾乐祸,但是你的第二句话让我哈哈大笑。@umbrane:你可以用reflog撤销你的修正。如果
    git commit--amend
    是您执行的最后一个命令(至少是修改任何内容的最后一个命令),那么您可以使用
    git reset--hard HEAD@{1}
    撤销它(或者
    --soft
    在索引中保留您的更改)。我要修改的commit是分支的第一个提交吗?错误的行显示了该提交和来自master的最新提交之间的差异,只是重新设置了基础。请解释“然后将分支重新设置到新修改的提交之上”。我不清楚我是应该在分离头中运行
    git-rebase[branch]
    ,还是在分离头之后运行
    git-rebase[commit]
    。@umbrane:无论commit引入了哪些行,您要修改的行都是您要针对的行。听起来这可能是您的分支的第一次提交。至于解释,当你处于分离状态时,在修改提交后,你可以使用
    git-rebase-head[branch]
    (它检查分支,并在原来的
    head
    ,即你修改的提交之上对其进行重定)。按照你上一次评论中所述的重定提交对我有效。非常感谢。