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

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】:

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

您希望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 在 vi​​m 中做了什么。对于合并,我通常对 git 已经填充编辑器的消息感到满意,所以我只需输入 :x[ENTER],它是 :wq[ENTER] 的缩写(或 :w[ENTER] 后跟 :q[ENTER]),即写(=保存)并退出(=关闭编辑器)。

以上是关于如何强制将我在本地拥有的所有内容合并到远程主机中?的主要内容,如果未能解决你的问题,请参考以下文章

Remmina 文件夹共享如何在 Linux 中工作?

如何修复`EF Core中的远程主机`错误强制关闭现有连接

有没有一种简单的方法可以将我在一个环境中拥有的相同 Python 库安装到新的 Python 环境中? [复制]

PostgreSQL:如何将多行的值放在不同的列中,并将所有值合并到一行中?

localhost 将我重定向到另一个 url

常用git命令