Git在所有其他分支中合并一个分支

时间:2014-01-25 23:00:56

标签: git merge

我知道这个问题已在此处提出:https://stackoverflow.com/questions/2329716/merging-changes-from-master-into-all-branches-using-git,但我希望看到真正的代码来执行此操作。

我有一个主分支和许多功能分支。我希望在master中做出的所有更改都会反映在所有功能分支中。

当我进入master时,所有的更改都应该反映在所有其他分支上(基本上它与检查所有分支并合并master,但是使用自动化过程相同)。

1 个答案:

答案 0 :(得分:1)

  

问题是我需要查看我想要合并的分支是否未发布。

如果它们没有发表,你应该改变它们 但是检查一下实际上是否可以使用rebase是有点棘手的:


首先,在提取之后,您可以轻松查看if you have local commits not yet pushed

 git log origin/master..master

        o--o--o (origin/master)
       /
x--x--x--y--y   (master)

在此实例中进行rebase是完全可以的,除非master已经从你的回购中推送到另一个分支。
但您也可以通过以下方式轻松检查:

git branch -r --contains master

如果任何远程(-r)分支包含您要重新分支的分支,那么这是一个不太安全的想法,并且合并更可取。

但是,如果远程分支本身被重新命名(并被强制推送),那么您需要小心,如“How do you deal with a public repository that has already been rebased?”中所述:

        o--o--o (OLD origin/master)
       /
x--x--X--y--y   (master)
    \
     o'--o'--o' (origin/master, as seen after a 'git fetch')

master之上盲目重新origin/master将重播提交X,当origin/master被重新定位时,被忽略。不好。

今天(2014年1月),处理此案件的唯一方法是:

  • origin/master上创建'tmp'标记分支,
  • git fetch
  • 检查git branch --contain tmp是否列出了origin/master(已被提取,如果已经重新定位并强制推送,则可能具有不同的历史记录)。

明天(git 1.9,2014年第1季度),您无需在获取之前标记远程分支:

fork_point=$(git merge-base --fork-point origin/upstreamBranch yourBranch)
# return X
git rebase --onto origin/upstreamBranch $fork_point yourBranch

回顾一下:

git fetch之后(在提取之前标记origin/master 之后),

  • 如果git log origin/master..master返回master的提交,这些提交不属于origin/master(意味着那些本地提交尚未推送到origin/master
  • 并且如果git branch -r --contains master为空(意味着master未被推送到任何其他位置,则可以在任何远程跟踪分支上看到git fetch

然后:

  • 如果origin/master包含标记分支“tmp”(意味着origin/master本身没有重新定位),则可以git rebase origin/master master
  • 其他:你可以git rebase --onto origin/master $(git merge-base tmp master) master
    (你需要tmp来重新绑定你的分支.Git 1.9将需要一个tmp分支不必要)

在任何其他情况下:merge origin/mastermaster