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

时间:2010-09-08 21:32:14

标签: git version-control

我有两个分支,master和dev。我一直在使用dev,只有在批准生产使用后才能将代码检入主分支。当我这样做时,我必须做以下事情:

git checkout master
git merge dev
git checkout dev

这非常冗长,而且由于我经常这样做,我想尽量减少它。有没有一个git命令可以用来从我当前的分支dev合并到另一个分支master而不必先检查master分支?有点像:

git merge dev to master

会很棒。我查看了git文档并没有看到任何内容。

8 个答案:

答案 0 :(得分:90)

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

答案 1 :(得分:55)

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

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

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

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

答案 2 :(得分:43)

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

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

以便您可以从任何存储库调用

git merge-to master dev

答案 3 :(得分:38)

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

所以你使用它:git merge-to dev

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

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

绝对是我的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"

答案 4 :(得分:6)

这是旧的,但是......

结合@ kevin-lyda和@ dmytrii-nagirniak的解决方案。此别名将当前分支合并到指定的分支中。它使用遥控器方法,并使用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

答案 5 :(得分:2)

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

快进合并

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

git branch -f master dev
  

警告:这假设master指向同时位于dev分支或其他某个分支的提交。如果没有,你可能会失去工作!git merge不同,git fetch会在无法快进的情况下创建合并提交(或投诉),此方法默默强制< / strong>指向另一个提交的分支指针。

     

这也假设你是唯一一个处理回购的人,和/或你知道你在做什么。

提示:如果您执行了origin/master并且master中有新的提交,则可以移动git branch -f master origin/master 分支,而无需使用以下命令进行检查:

master

通过合并提交合并

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

如果dev分支中的{strong>不git checkout -b temp git merge --no-ff -e master git branch -f master temp git checkout dev git branch -D temp 分支中有提交,您可以:

  

免责声明:这仅仅是一个概念验证,只是为了表明有时可以在不签出的情况下与其他分支合并。如果您想每天使用它,您可能希望使用shell重定向为它创建别名,或者为它创建一个shell脚本。然后,您还可以为问题中显示的较短过程创建一个shell脚本。

master

<强>解释

  1. 签出一个临时分支,指向与当前分支相同的提交。
  2. dev合并到临时分支并启动提交消息编辑器。如果您希望合并提交看起来像,那么您已将master分支合并到Merge branch 'master' into temp ,请根据此进行编辑:

    Merge branch 'dev'
    

    到此:

    -m "Merge branch 'dev'"

    提示:您可以使用-e代替master更快。

  3. 更新dev分支指针以指向合并提交。
  4. 查看master分支。
  5. 强制删除临时分支。
  6. 这仍然触及你的工作树,但最低限度。它不会将树一直回滚到原始{{1}}的状态,只是为了再次引入开发更改。 有些人可能并不关心,但对于其他人来说,这可能很重要。

答案 6 :(得分: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

答案 7 :(得分:0)

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

  • 为了便于阅读,该功能分为多行
  • 该函数调用set -ex,因此会打印每个命令,如果命令失败,函数会立即退出
  • 别名将第一个(目标分支)以外的参数传递给git merge
  • 该函数包含一个空命令: git merge,可确保制表符完成功能可用于某些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"