关于git:force如何将我在本地拥有的所有内容合并到远程主服务器中?

How do force merge everything i have locally into the remote master?

问题是,一个团队成员错误地创建了一个单独的分支(主分支是主分支)称为"head"。head"有最新的代码,我现在想重写给master(因为它是所有代码的最新版本)。

当我尝试执行"合并头到主控形状"时,我得到一个错误,说"不相关的分支"。我继续搜索,发现我需要在本地拉分支("head"),然后将它推(或强制推)到远程"master"分支以合并代码。

我使用了以下命令:git fetch && git checkout Head并将其签出(克隆)到本地。现在,当我试图推动它时,它显示出我落后了17个承诺,还有3个改变要推动。

如何强制将本地所有内容合并到远程主机中?

谢谢

SourceTree

编辑

我按照DAS-G的说法做了,但我在远程看到的唯一变化似乎是删除了Head分支。最初出现在Head中的代码更改已消失(或丢失)!!!!)。我可以看到标签和历史记录,但似乎更改永远被删除!!!!

截图:

氧化镁


从你的截图和错误信息看来,masterHead没有任何共同的祖先。如果我正确理解你,

  • 您希望master的尖端具有Head的当前内容(而不是Head的内容与master的内容合并)。
  • 但你要把这两个分支的历史都保存在以东人的祖先中。(因此,git checkout master; git reset --hard Head不是一种选择。)

正如VONC所建议的,您可以在主服务器上重新平衡Head提交,以产生线性历史,代价是Head提交的提交将被重新写入。

如果您希望保留Head的承诺,那么可以进行一个稍微模糊的合并:

  • 首先,确保您的本地master是最新的(从您的屏幕截图来看,似乎不是)

    1
    2
    git checkout master
    git merge --ff-only origin/master
  • 实际合并

    1
    2
    git checkout Head
    git merge --strategy ours master

  • 将合并提交到master

    1
    2
    git checkout master
    git merge --ff-only Head
  • 现在你可能想除掉这个名字奇怪的Head分支。

    1
    git branch -D Head

  • 把所有东西(包括删除分支)放到远程回购上

    1
    git push origin master :Head # should not need a force-push as no commits are discarded on the remote site


  • 首先,不要将分支称为"head":它离head非常近,它引用了"当前提交"。

    您可以很容易地重命名它:git branch -m Head Tip

    对于未恢复的分支情况,您可以尝试在master上挑选它:

    1
    2
    3
    4
    5
    git checkout master
    git checkout -b tmp
    git cherry-pick Tip~2 Tip~1 Tip
    git branch -f Tip tmp
    git checkout Tip

    (rebase --onto选项比较复杂)

    一旦在本地一切正常,您将在远程报告上更新新的分支名称:

    1
    2
    git push origin --set-upstream Tip
    git push origin :Head