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

我有两个分支,主人和 Dev。我一直从事开发工作,只有在代码被批准用于生产环境时才将其签入主分支。当我这样做时,我必须做以下事情:

git checkout master
git merge dev
git checkout dev

这是非常冗长的,因为我经常这样做,我想最小化它。有没有一个 git 命令可以用来将当前的分支开发人员合并到另一个分支主机,而无需首先签出主机分支?比如说:

git merge dev to master

太棒了,我看了 Git 的文档,什么都没看到。

88509 次浏览

最好的办法是使用一个别名,放在全局 gitconfig (~/.gitconfig)中:

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

这样您就可以从任何存储库调用它,作为

git merge-to master dev

Jefromi 别名的一个小修改不需要你输入当前分支。

所以你可以这样使用: git merge-to dev

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

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

它肯定会进入我的文件夹:)

[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"

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

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

(或在视窗 git remote add self C:\path\to\your\repository)

推到自己的遥控器,例如:

git push self dev:master

目前@zerome 投票最多的答案是一个不错的答案,但是有点冗长。

在你的 git 回购的基础上,你可以这样做: git push . dev:master

一个在树上任何地方都可行的更普遍的解决方案是:

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

这是旧的,但是..。

结合上面@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

很多时候,您来自您想要合并当前分支的分支。在这种情况下,你可以做:

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

例如:

git checkout somebranch      // (while on master)


// add some commits


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

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

快进合并

这真的很简单。根据定义,快进合并只是意味着分支指针在提交树中向前移动。所以你需要做的就是 模拟:

git branch -f master dev

警告: 这里假设 master指向的提交也在 dev分支或其他分支中。如果没有,你会失去工作的!不像 git merge在不能快进时创建合并提交(或者抱怨) ,这个方法 无声的力量是指向另一个提交的分支指针。

这也假设你是唯一一个在回购中工作的人,并且/或者你知道你在做什么。

提示: 如果您执行了 git fetch并且在 origin/master中有了新的提交,那么您可以移动 master分支而不用使用:

git branch -f master origin/master

通过合并提交合并

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

如果在 master分支(dev分支中的 没有)中有提交,则可以:

免责声明: 这仅仅是一个概念验证,只是为了说明 有时候可以在不签出的情况下向另一个分支进行合并。如果您希望每天都使用它,那么您可能希望使用 shell 重定向为它创建一个别名,或者为它创建一个 shell 脚本。然后,您还可以为问题中显示的较短进程创建 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的状态,只是为了再次引入开发变更。有些人可能不在乎,但对其他人来说,这可能很重要。

我的解决方案与其他答案相似,但有以下不同之处:

  • 为了便于阅读,该函数被分成多行
  • 函数调用 set -ex,以便打印每个命令,如果命令失败,函数将立即退出
  • Alias 将其参数(第一个(目标分支)除外)传递给 git merge
  • 这个函数包含一个 null 命令 : git merge,它确保 tab 完成操作可以在一些 shell 设置中工作(例如,oh-my-zsh 中的 gitfast)
[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"