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

Chr*_*ris 178 git version-control

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

git checkout master
git merge dev
git checkout dev
Run Code Online (Sandbox Code Playgroud)

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

git merge dev to master
Run Code Online (Sandbox Code Playgroud)

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

小智 91

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

git remote add self file:///path/to/your/repository
Run Code Online (Sandbox Code Playgroud)

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

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

git push self dev:master
Run Code Online (Sandbox Code Playgroud)

  • 为什么是远程别名?`.`对我很好:`git push.头:主人`. (3认同)
  • 子模块!这不仅解决了问题的问题,而且还解决了在只有子模块时切换分支的问题.棒极了! (2认同)
  • +1这很有创意,根本不会触及工作树.只是澄清一下:`/ path/to/your/repository`是工作树的路径,即不包含`.git`目录.此外,这应该不言而喻:如果您移动回购,则必须更新遥控器. (2认同)
  • @ JosephK.Strauss您可以先将master合并到当前分支(`dev`),然后使用`git push self dev:master`推送合并提交. (2认同)

Kev*_*yda 56

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

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

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

git push $(git rev-parse --show-toplevel) dev:master
Run Code Online (Sandbox Code Playgroud)

  • `git push.dev:master`简化了我的生活!到目前为止最好的答案,谢谢 (2认同)
  • 我在 Windows 中得到 *无效的远程名称“.”*。我还需要做`git remote add self file:///myRepo`吗? (2认同)

Cas*_*bel 44

你最好的选择就是使用一个别名,放在你的全局gitconfig(~/.gitconfig)中:

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

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

git merge-to master dev
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个`merge-to ="!f(){export tmp_branch =`git branch | grep'*'| tr -d'*'`; git checkout $ 1 && echo git merge $ tmp_branch && echo git checkout $ tmp_branch; unset $ tmp_branch;}; f"`,它让我不必输入我当前正在使用的分支,所以如果我想将`dev`合并到`master`而我现在正在`dev`,我只需输入`git merge-to master`即可 (6认同)
  • 如果合并不是自动的,但需要合并解决方案会发生什么?(在这种情况下,我假设没有对master进行任何工作,所以它不会发生,但仍然)... (2认同)
  • 具有正确反引号且没有回声的更好版本:`merge-to =“!f(){export tmp_branch = \`git branch | grep'*'| tr -d'*'\`; git checkout $ 1 && git merge $ tmp_branch && git checkout $ tmp_branch;未设置$ tmp_branch;}; f“` (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;未设置tmp_branch;}; f“ (2认同)

Dmy*_*iak 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"
Run Code Online (Sandbox Code Playgroud)


小智 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"
Run Code Online (Sandbox Code Playgroud)

要像以下一样使用:

git merge-to other-branch-name
Run Code Online (Sandbox Code Playgroud)


ADT*_*DTC 5

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

快进合并

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

git branch -f master dev
Run Code Online (Sandbox Code Playgroud)

注意事项:这假设master指向也在dev分支或其他某个分支中的提交。否则,您将面临失去工作的风险!git merge在无法进行快进时创建合并提交(或抱怨)不同,此方法静默地强制分支指针指向另一个提交。

这也假设您是唯一一个在 repo 上工作的人,和/或您知道自己在做什么。

提示:如果你做了 agit fetch并且你有新的提交origin/master,你可以移动master分支而无需签出使用:

git branch -f master origin/master
Run Code Online (Sandbox Code Playgroud)

通过合并提交合并

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

如果你有在提交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
Run Code Online (Sandbox Code Playgroud)

解释:

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

    Merge branch 'master' into temp
    
    Run Code Online (Sandbox Code Playgroud)

    对此:

    Merge branch 'dev'
    
    Run Code Online (Sandbox Code Playgroud)

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

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

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