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

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

问题是团队成员错误地创建了一个名为 "Head" 的单独分支(主要分支是 master)。 "Head" 有最新的代码,我现在想覆盖它给主控(因为它是所有代码的最新代码)。

当我尝试执行 "Merge Head into master" 时,我收到一条错误消息 "unrelated branches"。我搜索了一下,发现我需要在本地拉分支 ("Head"),然后将其推送(或强制推送)到远程 "master" 分支以合并代码。

我使用了以下命令: git fetch && git checkout Head 并将其签出(克隆)到本地。现在,当我尝试推送时,它显示我落后了 17 个提交,并且有 3 个更改要推送。

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

谢谢

编辑

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

截图:

首先,不要调用分支 "Head":它与 HEAD, which references the "current commit" 非常接近。

您可以轻松重命名它:git branch -m Head Tip

关于unrelate branch的情况,你可以尝试在master之上cherry-pick:

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 option is a bit more complex)

一旦本地一切正常,您就可以更新远程仓库上的新分支名称:

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

从您的屏幕截图和错误消息看来,masterHead 没有任何共同的祖先。如果我没理解错的话,

  • 您希望 master 的提示具有 Head 的当前内容(并且 正是 的内容,而不是 Head 的内容内容与 master),
  • 的内容合并
  • 但您希望将两个分支的历史记录保存在 master 的祖先中。 (因此 git checkout master; git reset --hard Head 不是一个选项。)

您可以将 Head 提交变基到 master 之上,如 ,以产生线性历史记录,代价是 Head 的提交将被重新写了。

如果你想原样保留 Head 的提交,你可以做一个有点模糊的合并:

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

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

    git checkout Head
    git merge --strategy ours master
    
  3. 获取合并提交到 master

    git checkout master
    git merge --ff-only Head
    
  4. 您现在可能想要摆脱名字奇怪的 Head 分支,

    git branch -D Head
    
  5. 并将所有内容(包括分支删除)获取到远程仓​​库

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