How do force merge everything i have locally into the remote master?
问题是,一个团队成员错误地创建了一个单独的分支(主分支是主分支)称为"head"。head"有最新的代码,我现在想重写给master(因为它是所有代码的最新版本)。
当我尝试执行"合并头到主控形状"时,我得到一个错误,说"不相关的分支"。我继续搜索,发现我需要在本地拉分支("head"),然后将它推(或强制推)到远程"master"分支以合并代码。
我使用了以下命令:git fetch && git checkout Head并将其签出(克隆)到本地。现在,当我试图推动它时,它显示出我落后了17个承诺,还有3个改变要推动。
如何强制将本地所有内容合并到远程主机中?
谢谢
。
编辑
我按照DAS-G的说法做了,但我在远程看到的唯一变化似乎是删除了Head分支。最初出现在Head中的代码更改已消失(或丢失)!!!!)。我可以看到标签和历史记录,但似乎更改永远被删除!!!!
截图:
氧化镁
- 我会拉合并到真正的(服务器)分支。然后移动本地头指向服务器/原始头。这样就没有什么是"强迫的"。吉特就像一棵树,而不是高速公路。
- 请用命令而不是指示给我一个有效的解决方案。我想从这混乱中走出来!!
- 回复:关于明显丢失的更改的编辑:胡?在您的第二个屏幕截图中,我仍然可以看到相同的修订,只是本地的Head分支不见了。(虽然合并由于缺少提交消息而中止,但您删除了它吗?)git checkout -b Head origin/Head应该恢复您的本地Head分支(因为远程Head分支仍然指向正确的版本09298ea,从您的屏幕截图中我可以看到)。
从你的截图和错误信息看来,master和Head没有任何共同的祖先。如果我正确理解你,
- 您希望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 push origin master :Head # should not need a force-push as no commits are discarded on the remote site |
。
- 这看起来很详细,是我回答的一个很好的选择。+ 1
- 当我执行git merge --strategy ours master时,我得到了一个vim。如何正确输入commit msg并继续?
- 当我执行git merge --strategy ours master时,我得到了一个vim。我按了ZZ,得到了一个消息error: There was a problem with the editor 'vi'. Not committing merge; use 'git commit' to complete the merge.,所以我执行了git commit -m"Merge",然后继续,但我仍然看到远程有来自早期分支的代码,而不是当前分支的代码。唯一不同的是删除了Head。
- 看来我有麻烦了,请检查编辑!!
- 我不知道ZZ在Vim中做了什么。对于合并,我通常对Git已经填充编辑器的消息感到满意,所以我只键入:x[ENTER],它是:wq[ENTER]的缩写(或:w[ENTER],后面是:q[ENTER]),即write(=save)和quit(=关闭编辑器)。
首先,不要将分支称为"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 |
号
- 分支"head"在远程回购中。我也需要在远程回购中重命名吗?你能根据我提供的屏幕截图使命令更具体一点吗?谢谢,说到吉特,我可不高兴。
- @Nezam这些命令特定于您的屏幕截图。但它不会重命名远程分支。为此:stackoverflow.com/a/4754132/6309
- 我要用Tip~2 Tip~1 Tip这个吗?…
- @Nezam是的(如果你先改名了你的分支):你从最老的到最新的。
- 看来我有麻烦了,请检查编辑!!
- @如果有任何"消失",输入"git reflog",并查找commit 09298ea:执行git checkout -B Tip 09298ea,您的分支将回到最初的位置。
- 谢谢!!好了,现在我有一个新的分支叫Tip,它有更新的代码。如何将其推到远程master上。所以移除主程序只有一个分支,而这个更新的代码呢?
- @Nezam在推到任何地方之前,你有没有像我在回答中提到的那样,在你的本地主分支上重放你的提示承诺?只有当本地情况正常时,您才会推。
- 让我们在聊天中继续讨论。