Git rebase不断失败,需要手动合并干预

我遇到了一个问题,就是从主服务器重新绑定到我的某个存储库中的“部署”分支。

我的回购设置如下:

master - of course, the main branch
deploy - a branch created where files like Capfile, deploy.rb etc are created and configured - these changes will NEVER be merged back into Master

通常我的工作流程是:

  • 在主分支上进行开发......测试,微笑,承诺。
  • 检出deploy分支
  • 在部署分支上执行git rebase master - 这用于没有问题的工作
  • 推送到远程,然后执行cap deploy
  • 放松
  • 我现在遇到的问题是,当我在deploy分支上执行git rebase master时,会出现一个3-way merge / manual merge required错误(我认为错误信息实际上不足以发布)。 Git告诉我执行合并,然后使用git rebase --continue - 继续完成 - 这从来没有工作。

    我发现'做'的工作是运行git rebase master --interactive ,清理选择列表(在此列表中有5个左右重复的“提交”,但具有不同的参考编号(相同的消息),所以我将选择其中之一),然后手动进行合并。 一旦我为每次提交完成了这一步,我就可以继续进行rebase和所有的快乐......

    直到下一次我需要执行rebase。

    所以有人知道什么可能会开心吗? 该项目不是真的“秘密”,所以如果需要,我可以发布消息,日志,分支图等。

    谢谢


    听起来似乎可能发生的是,你已经改变了那些“重复”提交的提交历史,使得它们具有不同的sha1。 每个sha1不仅对于提交而且对提交历史都是唯一的。 因此,在宇宙的一生中不可能发生(很可能不会发生),在同一历史中有两个同名的sha1,或者甚至在两个不同的历史中有两个sha1。 如果您在提交中更改了任何内容(例如修改或交互式底图),那么您将更改sha1。 所以两个可能看起来相同的提交实际上被区别对待。

    所以很有可能,你从另一个分支重新开始,做了某种类型的交互式rebase或修改了提交,继续提交更多代码来修改代码的相同部分,然后在下一次rebase时发生冲突,因为提交了你在你的本地分支中有不同于你重定义的分支的分支被从分支中移除,上游被拉入,包括你已经提交的那个提交并且改变了sha1,然后当提交被重放到分支上时你最终会遇到冲突,因为代码的状态已经改变了,因为它是从不同于你现在在你的分支上创建的历史创建的。 哇,那是一个很长的句子......

    当你“清理”选择列表时...你在做什么可能会在重新绑定之前删除这些重复的提交,所以现在你不会重新应用已经应用的更改,所以不会再有冲突。

    然而,如果你只是想解决rebase期间的冲突,这可能是最好的选择,所以你不会意外删除你想要的提交。 解决冲突将使得该提交的变更集适用于您拥有的历史记录。 一旦你推入这个合并冲突解决方案,除非你修改已经被再次推送的提交,否则你不应该再次看到问题。

    要查找哪些文件存在合并冲突,请执行

    git status
    

    要么

    git ls-files -u
    

    一旦你知道哪些文件有冲突,如果你有一个mergetool设置,你可以这样做:

    git mergetool <file>
    

    如果您想手动合并,可以通过执行以下操作找到合并标记和行:

    grep -Hnr '^={7}|^<{7}|^>{7}' *
    

    在您的回购路径的顶层并编辑。 当你手动编辑时,确保你删除了标记,并使文件的最终版本看起来像你想要的那样...... git对你没有做任何特别的标记。 手动完成编辑后,请确保执行

    git add <file>
    

    添加文件将其添加到索引并删除未合并的标志。 当您完成解决所有未合并的文件时,请执行

    git rebase --continue
    

    完成rebase。


    为了获得git rebase --continue继续工作,你必须实际合并冲突的文件(编辑它们,从冲突标记之间挑选你想要的部分“<<<<<<<”,“=======” ,“>>>>>>>”),然后git add它们git add到索引(索引是它们被记录为冲突的地方,添加文件会清除其冲突状态)。 用git diff --cached检查当前的diff,然后git rebase --continue如果看起来正确,继续。

    在你尝试你的rebase之前(或者在中止一个有问题的之前),检查一下git log -p master..deploy以查看你尝试重新绑定的提交。 这是与你在主人身上有任何冲突的其中之一。

    那些通过在git rebase -i删除他们的'选择'行的提交可能不完全相同(即使他们在提交消息中具有相同的'主题')。 事实上,你认为应该只有其中的一个,这表明你的部署分支正在发生一些可怕的事情。 这些“重复”提交是在部署的顶端,还是其他提交之后? 也许看到那些'腥'提交的内容( log -p ,above)会给你一个线索。


    您可以在“特定于部署”文件的父目录中定义一个属性,以便在合并的情况下始终选择部署分支的内容。

    有关合并经理的示例,请参阅此答案。

    其他策略已经讨论过,但关键依然存在:始终将合并视为“项目范围合并”,而不是基于文件的合并。 因此,当涉及到某些“特殊”文件时,这些属性可以优化项目范围的合并。

    链接地址: http://www.djcxy.com/p/42899.html

    上一篇: Git rebase continually fails and requires manual merge intervention

    下一篇: How can you read values from an open application in Windows?