合并到 git 中的分支而不切换到它

Posted

技术标签:

【中文标题】合并到 git 中的分支而不切换到它【英文标题】:Merging to a branch in git without switching to it 【发布时间】:2011-09-26 17:50:42 【问题描述】:

我有一个应用程序在一个分支的 git 存储库中运行(比如dev)。应用程序修改一些存储库中的内容并提交它们。我现在必须将这些更改合并到另一个分支中(比如master),但问题是在这样做之前我不想git checkout master。有没有办法说“将当前分支合并到master”?

【问题讨论】:

您打算如何解决冲突? 可以说我确定我不会有。那我可以吗? +1 这确实是一个非常有趣的问题,它推动了 git 知识的发展,值得更多的支持! Merge, update, and pull Git branches without using checkouts的可能重复 【参考方案1】:

一种可能的解决方案是 clone 从同一个本地 repo 创建另一个工作树并在所述工作树中执行合并(main 签出),从而能够解决那里的潜在冲突. 创建一个单独的工作树比创建一个单独的克隆要快得多(这是我在 2011 年最初的建议):它使用 Git 2.5+ (July 2015) git worktree 命令。

然后,稍后,当能够在本地存储库(您的第一个工作树,您正在工作的地方)中切换到 main 时,您将从单独的工作树恢复更新的 main 分支。


或者,Bernardo Dal Corno 建议 in the comments 2014 工具/脚本:schuyler1d/git-forward-merge 来自 Schuyler Duveen。

git forward-merge 创建一个临时的 Git 索引文件和工作目录,仅用于合并,不会干扰实际的索引文件和工作目录。 (除非合并是快进的,在这种情况下,合并只需通过本地推送即可轻松完成。)

【讨论】:

我将无法在我的原始存储库中签出master。我只需要将 dev 更改合并到其中。你的解决方案就是我现在使用的。问题是克隆需要一段时间,我正在寻找优化方法。 @Noufal Ibrahim:如果克隆需要很长时间,这表明您使用的 URL 不是默认的硬链接。您是否尝试将 --local 添加到您的 git clone 调用中以强制执行此操作? 这是一个可怕的黑客攻击。想象一下,使用大型存储库或经常这样做。 @BernardoDalCorno 10 年后,我完全同意。我已经更新了答案以使用更现代的命令 (git worktree),这使得该过程更快而不是“hackish”。 感谢@VonC,这似乎是当今最好的方法。似乎也值得检查一下git-forward-merge【参考方案2】:

即使您的分支不是可快速转发的,即使它存在真正的冲突,您仍然可以在没有完整结帐的情况下合并。假设您要将当前提示 dev 合并到 master。如果您认为 git push . dev:master 可行,值得尝试一下,它会检查快进是否是正确的举动,如果是,那么它就在那里,但如果您不能只是重新挂上标签,那么下一步就是

git clone -nsb master . `mktemp -d`
cd $_
git reset -q
git merge origin/dev
git push
cd -

您现在已经完成了“最小结帐合并”。克隆、cd 和重置运行所需的时间比在一个十年前的中端设备上键入一个不小的项目(3.5G 历史记录,1.2G 完整签出大于 70K 文件)所需的时间更少,因为它不会重复任何东西。

【讨论】:

【参考方案3】:

当我想要合并两个分支而无需签出其中任何一个时,这对我来说非常有效:

git fetch . <modified branch>:<destination branch>

其他选项描述here。

【讨论】:

【参考方案4】:

在您的情况下,“master”似乎是“fast-forwardable”。您可以将分支“推送”到 master。

cd /path_to_dir_with_no_branch_switch/
git push . appbranch:master

【讨论】:

有趣...我没有想到这个。 git push . appbranch:master 会快很多 +1 我从没想过要逼自己。确实非常整洁!简单的解决方案往往是最漂亮的。 我接受这一点,因为它提供了我提出问题时使用的替代方案。 这是什么神奇的东西? . 的点是什么,: 的列是什么,appbranch:master 是什么?不应该是dev:master吗?如果是,是什么意思?

以上是关于合并到 git 中的分支而不切换到它的主要内容,如果未能解决你的问题,请参考以下文章

Git 分支的创建、切换、合并以及解决冲突、删除

git 基础用法、分支、切换、合并等

git从入门到精通(新建分支,合并分支)

git合并分支

git切换分支不合并当前分支的修改--git stash

git 把分支代码合并给master主分支