在不切换分支的情况下合并到 Git 中的一个分支

50

我有一个应用程序在git存储库的分支(例如dev)上运行。该应用程序修改存储库中的某些内容并提交它们。现在我必须将这些更改合并到另一个分支(例如master),但问题在于我不想在此之前执行git checkout master命令。有没有一种方法可以说“将当前分支合并到主分支”?


6
你具体打算如何解决冲突? - sehe
5
假设我确定我不会有任何问题,那么我就能做到吗? - Noufal Ibrahim
3
+1 这确实是一个非常有趣的问题,它推动了 Git 知识的进步,并值得更多的赞! - ralphtheninja
4个回答

41

在你的情况中,“master”似乎是“可快进”的。你可以将该分支“推送”到master。

cd /path_to_dir_with_no_branch_switch/
git push . appbranch:master

有趣...我没有想到这个。 - Noufal Ibrahim
9
更快的方法是 git push . appbranch:master - sehe
2
+1 我从未想过推送到自身。非常整洁!简单的解决方案往往是最美丽的。 - ralphtheninja
我接受这个回答,因为它提供了一个替代我在提问时使用的方法。 - Noufal Ibrahim
4
这是什么神奇的东西?点.和冒号:是什么意思?还有appbranch:master是什么意思?难道不应该是dev:master吗?如果是,这代表什么意思? - aliopi

5

当我想要合并两个分支而不必检出它们中的任何一个时,这对我非常有效:

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

其他选项在这里描述。


4
一种可能的解决方案是从同一本地 repo 中 克隆 创建另一个工作树,并在该工作树中执行合并操作(使用已检出的 main),以便能够在那里解决潜在的冲突。
创建单独的工作树比创建单独的克隆要快得多(这是我在2011年提出的最初建议):它使用 Git 2.5+ (July 2015)git worktree 命令。
然后,在以后的某个日期,当能够在本地 repo 中切换到 main(您正在工作的第一个工作树)时,您将从单独的工作树中恢复更新的 main 分支。

或者,Bernardo Dal Corno建议在评论中使用一个2014年的工具/脚本:schuyler1d/git-forward-merge来自Schuyler Duveen

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


我将无法在我的原始存储库中检出“master”。我只需要将“dev”更改合并到其中。您的解决方案是我现在正在使用的。问题在于克隆需要一段时间,我正在寻找优化的方法。 - Noufal Ibrahim
2
@Noufal Ibrahim:如果克隆需要很长时间,那么这表明您正在使用一个不支持硬链接的URL。您尝试过在git clone命令中添加--local参数来强制执行吗? - Mark Longair
这是一个非常糟糕的hack。想象一下在大型代码库或频繁使用时这样做的情况。 - Bernardo Dal Corno
1
@BernardoDalCorno 十年后,我完全同意。我已更新答案,使用更现代的命令(git worktree),使该过程更快速且不“hackish”。 - VonC
1
感谢@VonC,这似乎是目前最好的方法。看起来值得检查一下这个git-forward-merge - Bernardo Dal Corno
@BernardoDalCorno 谢谢。我已经在答案中包含了你的评论,以增加其可见性。 - VonC

1
即使你的分支不能进行快进合并,甚至存在真正的冲突,你仍然可以在不进行完全检出的情况下进行合并。假设你想将当前的代码提交 dev 合并到 master 分支。如果你认为有可能行得通,值得尝试使用 git push . dev:master 命令,它会检查是否可以进行快进合并,如果可以就直接进行,但如果你不能只是重新挂标签,那么你的下一步是:
git clone -nsb master . `mktemp -d`
cd $_
git reset -q
git merge origin/dev
git push
cd -

现在你已经完成了“最小化合并”。克隆、切换目录和重置所需的时间比在一个十年前的中档电脑上输入(3.5G历史记录,1.2G完整检出>70K个文件)要少,因为它不会复制任何东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接