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

Git 如何将当前分支合并到另一个分支中,git,version-control,Git,Version Control,我有两个分支,master和dev。我总是在dev上工作,并且只有在主分支被批准用于生产时才将代码签入主分支。当我这样做时,我必须做到以下几点: git checkout master git merge dev git checkout dev 这是非常冗长的,因为我经常这样做,我想尽量减少它。是否有任何一个git命令可以用于从当前分支dev合并到另一个分支主节点,而不必首先签出主节点分支?比如: git merge dev to master 那太棒了。我查看了git文档,没有看到任何内

我有两个分支,master和dev。我总是在dev上工作,并且只有在主分支被批准用于生产时才将代码签入主分支。当我这样做时,我必须做到以下几点:

git checkout master
git merge dev
git checkout dev
这是非常冗长的,因为我经常这样做,我想尽量减少它。是否有任何一个git命令可以用于从当前分支dev合并到另一个分支主节点,而不必首先签出主节点分支?比如:

git merge dev to master

那太棒了。我查看了git文档,没有看到任何内容。

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

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

git merge-to master dev

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

所以您可以像这样使用它:
git合并到dev

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

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

它肯定会进入我的dotfiles:)


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

git remote add self file:///path/to/your/repository
(或在windows
git remote上,将自己的C:\path\to\your\repository

2.按下自动遥控器,例如:

git push self dev:master

@zerome目前投票率最高的答案是一个很好的答案,但有点不必要的冗长


在git回购的基础上,您可以这样做:
git推送。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

要将当前分支合并到另一个分支而不签出另一个分支,请执行以下操作:

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

注意事项:这假设
master
指向的提交也位于
dev
分支或其他某个分支中。否则,你就有失去工作的危险与无法快进时将创建合并提交(或投诉)的
git merge
不同,此方法以静默方式强制分支指针指向另一个提交

这还假设你是唯一一个从事回购的人,和/或你知道自己在做什么

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

git branch -f master origin/master
通过合并提交进行合并 这并不总是可能的。要创建合并提交,必须执行合并操作。要执行合并操作,您应该在其他分支中提交不在当前分支中的内容

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

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

说明:

  • 签出指向与当前分支相同提交的临时分支
  • master
    合并到临时分支中并启动提交消息编辑器。如果希望合并提交看起来像是将
    dev
    分支合并到
    master
    ,请从此处编辑它:

    Merge branch 'master' into temp
    
    为此:

    Merge branch 'dev'
    
    提示:您可以使用
    -m“合并分支“dev”
    而不是
    -e
    来加快速度

  • 更新
    master
    分支指针以指向合并提交
  • 查看
    dev
    分支
  • 强制删除临时分支

  • 这仍然会影响到您的工作树,但至少是这样。它不会将树一直回滚到原始
    master
    的状态,只是为了再次引入开发更改。有些人可能不在乎,但对另一些人来说,这可能很重要。

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

    • 为了便于阅读,该函数被分成多行
    • 该函数调用
      set-ex
      ,因此打印每个命令,如果命令失败,该函数立即退出
    • alias将其参数(第一个(目标分支)除外)传递给
      git merge
    • 该函数包括一个null命令
      :git merge
      ,该命令确保制表符完成与某些shell设置(例如,从oh my zsh)一起工作
    [别名]
    merge to=“!f(){:git merge\
    set-ex\
    本地this=$(git rev parse--abbrev ref HEAD)\
    本地目标=1美元\
    转移\
    git checkout$target\
    git合并$this\“$@”\
    git checkout$this\
    };f“
    
    您尝试过使用git push吗?push的建议是什么?这是为了更新远程设备,而不是在自己的存储库中合并。Jefromi是对的,推送在这里没有用处。我说的是另一个本地分支,而不是远程分支。更糟糕的是,当您有未提交的本地更改时:
    git stash
    git checkout maste
    
    git branch -f master origin/master
    
    git checkout -b temp
    git merge --no-ff -e master
    git branch -f master temp
    git checkout dev
    git branch -D temp
    
    Merge branch 'master' into temp
    
    Merge branch 'dev'