如何强制将我在本地拥有的所有内容合并到远程主机中?
Posted
技术标签:
【中文标题】如何强制将我在本地拥有的所有内容合并到远程主机中?【英文标题】:How do force merge everything i have locally into the remote master? 【发布时间】:2015-10-23 22:39:29 【问题描述】:问题是团队成员错误地创建了一个名为“Head”的单独分支(主分支是主分支)。 “Head”有最新的代码,我现在想把它重写给 master(因为它是最新的所有代码)。
当我尝试执行“将 Head 合并到 master”时,我收到一条错误消息,说“不相关的分支”。我搜索了一下,发现我需要在本地拉分支(“头”),然后将其推送(或强制推送)到远程“主”分支以合并代码。
我使用了以下命令:
git fetch && git checkout Head
并将其签出(克隆)到本地。现在,当我尝试推送时,它显示我落后 17 次提交,并且要推送 3 次更改。
谢谢
编辑
我做了das-g 告诉我的事情,但似乎我在远程看到的唯一变化是Head
分支被删除。最初在Head
中的代码更改已经消失(或丢失!!!)。我可以看到标签和历史记录,但似乎这些更改被永远删除了!!!
截图:
【问题讨论】:
我会拉入并合并到真正的(服务器)分支中。然后移动本地头指向服务器/源头。这样,没有什么是“强迫”的。 Git 就像一棵树,而不是高速公路。 请用命令而不是指示给我一个可行的解决方案。我要走出这个烂摊子!! Re:编辑关于明显丢失的更改: Hu?在您的第二个屏幕截图中,我仍然可以看到相同的修订,只是本地Head
分支消失了。 (尽管由于缺少提交消息而中止了合并,但您是否删除了它?)git checkout -b Head origin/Head
应该恢复您的本地Head
分支(因为远程Head
分支仍然指向正确的修订版09298ea
,就我可以从你的截图中看到)。
【参考方案1】:
首先,不要称分支为“Head”:与HEAD, which references the "current commit" 非常接近。
您可以轻松重命名:git branch -m Head Tip
关于不相关的分支情况,您可以尝试在 master 之上挑选它:
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
【讨论】:
分支“Head”在远程仓库中。我是否也需要在远程仓库中重命名?您能否使命令更具体到我提供的屏幕截图。谢谢,说到 git,我是菜鸟。 @Nezam 这些命令特定于您的屏幕截图。它不会重命名远程分支。为此:***.com/a/4754132/6309 @Nezam 是的(如果你先重命名了你的分支):你从最旧的到最新的挑选。 @Nezam 如果有任何东西“消失”,请输入“git reflog”,然后查找提交 09298ea:执行git checkout -B Tip 09298ea
,您的分支就会回到最初的位置。
@Nezam 在推送任何地方之前,您是否按照我在答案中提到的那样在本地 master 分支上重放了您的 Tip 提交?只有在本地情况正常时,您才会推送。【参考方案2】:
从您的屏幕截图和错误消息看来,master
和 Head
没有任何共同的祖先。如果我理解正确的话,
master
的提示具有Head
的当前内容(正是该内容,而不是Head
的内容与master
的内容合并),
但您希望将两个分支的历史都保存在master
的祖先中。 (因此git checkout master; git reset --hard Head
不是一个选项。)
您可以将Head
的提交基于VonC suggests 重新设置在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
【讨论】:
这看起来很详细,是我回答的一个很好的替代方案。 +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]
),即写(=保存)并退出(=关闭编辑器)。以上是关于如何强制将我在本地拥有的所有内容合并到远程主机中?的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种简单的方法可以将我在一个环境中拥有的相同 Python 库安装到新的 Python 环境中? [复制]