如何强制将我在本地拥有的所有内容合并到远程主机中?
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
从您的屏幕截图和错误消息看来,master
和 Head
没有任何共同的祖先。如果我没理解错的话,
- 您希望
master
的提示具有 Head
的当前内容(并且 正是 的内容,而不是 Head
的内容内容与 master
), 的内容合并
- 但您希望将两个分支的历史记录保存在
master
的祖先中。 (因此 git checkout master; git reset --hard Head
不是一个选项。)
您可以将 Head
提交变基到 master 之上,如 ,以产生线性历史记录,代价是 Head
的提交将被重新写了。
如果你想原样保留 Head
的提交,你可以做一个有点模糊的合并:
首先,确保您的本地 master
是最新的(从您的屏幕截图来看,它似乎不是)
git checkout master
git merge --ff-only origin/master
实际合并
git checkout Head
git merge --strategy ours master
获取合并提交到 master
git checkout master
git merge --ff-only Head
您现在可能想要摆脱名字奇怪的 Head
分支,
git branch -D Head
并将所有内容(包括分支删除)获取到远程仓库
git push origin master :Head # should not need a force-push as no commits are discarded on the remote site
问题是团队成员错误地创建了一个名为 "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
从您的屏幕截图和错误消息看来,master
和 Head
没有任何共同的祖先。如果我没理解错的话,
- 您希望
master
的提示具有Head
的当前内容(并且 正是 的内容,而不是Head
的内容内容与master
), 的内容合并
- 但您希望将两个分支的历史记录保存在
master
的祖先中。 (因此git checkout master; git reset --hard Head
不是一个选项。)
您可以将 Head
提交变基到 master 之上,如 Head
的提交将被重新写了。
如果你想原样保留 Head
的提交,你可以做一个有点模糊的合并:
首先,确保您的本地
master
是最新的(从您的屏幕截图来看,它似乎不是)git checkout master git merge --ff-only origin/master
实际合并
git checkout Head git merge --strategy ours master
获取合并提交到
master
git checkout master git merge --ff-only Head
您现在可能想要摆脱名字奇怪的
Head
分支,git branch -D Head
并将所有内容(包括分支删除)获取到远程仓库
git push origin master :Head # should not need a force-push as no commits are discarded on the remote site