如何将当前分支合并到另一个分支


182

我有两个分支,master和dev。我一直从事开发工作,只有在批准将其用于生产时才将代码检入master分支。这样做时,我必须执行以下操作:

git checkout master
git merge dev
git checkout dev

这太冗长了,由于我经常这样做,所以我希望将其最小化。我可以使用任何一个git命令从当前分支dev合并到另一个分支master,而不必先检出master分支吗?可能是这样的:

git merge dev to master

会很棒。我浏览了git文档,却什么也没看到。


1
您是否尝试过使用git push?
杰伊·沙利文

11
推送的建议是什么?那是为了更新遥控器,而不是合并到自己的存储库中。
卡斯卡贝尔

4
Jefromi是正确的,在这里推送没有用。我说的是另一个本地分支,而不是远程分支。
克里斯(Chris

2
更糟糕的是,当你有未提交的本地修改:git stashgit checkout mastergit merge devgit checkout devgit stash pop
Mu Mind

2
好问题。我也想要这个,因为我想加入一个非当前分支。我想避免切换分支,因为如果工作树中的任何文件发生更改,我都有一个启动构建的过程。
开尔文2013年

Answers:


94

1.为本地存储库添加一个远程别名,例如:

git remote add self file:///path/to/your/repository

(或在Windows上git remote add self C:\path\to\your\repository

2.按到自我遥控器,例如:

git push self dev:master

2
子模块!这不仅解决了所提问题的问题,而且还解决了只有一个子模块时切换分支的问题。大提示!
eddiemoya 2012年

2
+1这是有创造力的,完全不影响工作树。只是澄清一下:这/path/to/your/repository是您的工作树的路径,即不包括.git目录。同样,这也不必说:如果移动存储库,则必须更新遥控器。
开尔文

我没有让它在Windows中运行的任何运气... git remote add self file:///c/projects只是返回了使用说明
Maslow 2013年

2
@ JosephK.Strauss您可以先将master合并到当前分支(dev)中,然后使用来推送合并提交git push self dev:master
Leonid Shvechikov

4
为什么使用远程别名?.对我来说效果不错:git push . head:master

60

@zerome当前投票最高的答案是一个很好的答案,但是有点冗长。

在您的git repo的基础上,您可以执行以下操作: git push . dev:master

在树中的任何地方都可以使用的更通用的解决方案是:

git push $(git rev-parse --show-toplevel) dev:master

3
git push . dev:master简化了我的生活!迄今为止最好的答案,谢谢
杰里米·贝洛洛

您打算将合并的母版推送到github之类的远程存储库吗?通过执行保存步骤git push origin dev:master
Alex R

1
可以复制merge --no-ff行为吗?
exhuma '17

1
我收到无效的远程名称“。” 在Windows中。我还需要做git remote add self file:///myRepo吗?
keewic

1
但是,这实际上并没有进行合并……如果dev领先于master,它将起作用,但是如果不是,它将如何呢?
托马斯·列维斯克

44

最好的选择是仅使用别名,将其放置在全局gitconfig(~/.gitconfig)中:

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

这样您就可以从任何存储库中调用它

git merge-to master dev

3
如果合并不是自动的,但是需要合并解析,将会发生什么?(在这种情况下,我假设没有对master进行任何工作,因此不会发生,但仍然可以)...
Stein G. Strindhaug 2011年

@Stein:因为我使用了&&not ;,所以合并失败,并且不尝试切换回去。希望用户足够聪明,可以看到“合并失败”消息并进行处理。
卡斯卡贝尔2011年

6
我更喜欢merge-to = "!f() { export tmp_branch=git分支| grep'*'| TR -d“*” ; git checkout $1 && echo git merge $tmp_branch && echo git checkout $tmp_branch; unset $tmp_branch; }; f",这让我没有分支目前我在打字,所以如果我想合并devmaster和我在dev现在,我只需键入git merge-to master
史蒂夫

2
带有正确反引号且没有回声的更好版本:merge-to = "!f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '`; git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset $tmp_branch; }; f"
Simon Epskamp

2
unset命令不正确。固定为:merge-to =“!f(){export tmp_branch = git branch | grep '* ' | tr -d '* '; git checkout $ 1 && git merge --no-ff $ tmp_branch && git checkout $ tmp_branch; unset tmp_branch;}; f”
萨斯曼

38

Jefromi别名的一点修改,不需要您键入当前分支。

因此,您可以像这样使用它git merge-to dev

这将切换到dev分支,将其与CURRENT合并,然后再切换回去。

例如,假设您在master分支上,它将把主服务器合并到dev中,而您仍将在主服务器上。

绝对是我的dotfiles :)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"

6

这是旧的,但是...

结合以上@ kevin-lyda和@ dmytrii-nagirniak的解决方案。此别名将当前分支合并到指定分支。它与remotes方法一起使用,并使用git命令获取上下文。

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

使用方式如下:

git merge-to other-branch-name

4

要将当前分支合并到另一个分支中而不签出另一个分支:

快进合并

这真的很容易。根据定义,快进合并仅表示分支指针在提交树中向前移动。因此,您只需模拟一下:

git branch -f master dev

注意事项:假设这master指向的提交也位于dev分支或其他分支中。如果没有,您可能会失去工作!git merge无法在无法进行快进的情况下创建合并提交(或抱怨)的方法不同,此方法以静默方式强制分支指针指向另一个提交。

这还假设您是唯一正在处理该回购协议的人,并且/或者您知道自己在做什么。

提示:如果您执行了a git fetch并且您有新的提交origin/master,则可以master使用以下方法移动分支而无需签出:

git branch -f master origin/master

通过合并提交进行合并

这并不总是可能的。要创建合并提交,您必须执行合并操作。要执行合并操作,您应该在另一个分支中拥有不在当前分支中的提交。

如果你有在提交master分支,它是不是dev分行,您可以:

免责声明:这仅仅是一个概念证明,只是为了表明有时可以在不签出的情况下合并到另一个分支。如果您想每天使用它,则可能要使用外壳重定向为其创建别名或为其创建外壳脚本。同样,您也可以为问题中所示的较短过程制作一个shell脚本。

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

说明:

  1. 签出一个临时分支,该分支指向与当前分支相同的提交。
  2. 合并master到临时分支中并启动提交消息编辑器。如果您希望合并提交看起来像已经将dev分支合并到中master,则可以从中进行编辑:

    Merge branch 'master' into temp
    

    对此:

    Merge branch 'dev'
    

    提示:您可以使用-m "Merge branch 'dev'"而不是-e更快。

  3. 更新master分支指针以指向合并提交。
  4. 签出dev分支。
  5. 强制删除临时分支。

这仍然会触及您的工作树,但至少会如此。它并不会完全还原到原始状态,master只是为了再次引入开发更改。有些人可能不在乎,但对另一些人来说可能很重要。


1

很多时候您想从分支中合并当前分支。在这种情况下,您可以执行以下操作:

git co - && git merge @{-1}

例如:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master

1

我的解决方案与其他答案类似,但有以下区别:

  • 该功能分为多行以提高可读性
  • 该函数调用,set -ex以便打印每个命令,如果命令失败,函数将立即退出
  • 别名将其参数(第一个(目标分支)除外)传递给 git merge
  • 该函数包含一个null命令: git merge,该命令可确保Tab补全功能可用于某些Shell设置(例如,gitfast从oh-my-zsh)
[alias]
  merge-to = "!f() { : git merge ; \
      set -ex ; \
      local this=$(git rev-parse --abbrev-ref HEAD) ; \
      local target=$1 ; \
      shift ; \
      git checkout $target ; \
      git merge $this \"$@\" ; \
      git checkout $this ; \
    } ; f"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.