2014-01-25 42 views
2

我知道这个问题已经在这里问:https://stackoverflow.com/questions/2329716/merging-changes-from-master-into-all-branches-using-git,但我希望看到真正的代码,这样做。Git在所有其他分支合并一个分支

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

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

+2

在你给的链接中,下一个答案是“对于$(ls .git/refs/heads)中的BRANCH;执行git rebase master $ BRANCH; done”。该代码缺少什么? –

+0

我有点害怕做rebase,尤其是在所有分支上,这可能会导致未来更大的问题:http://www.git-scm.com/book/en/Git-Branching-Rebasing#The - 重新装箱。问题是我需要查看我想合并的分支是否未发布。 – edi9999

+0

好吧,那么对于$(ls .git/refs/heads)中的BRANCH;执行git checkout $ BRANCH; git merge master; done“。如果这仍然是可怕的:你可以简单地保留一个名为“branches_to_merge.txt”的文件,其中包含你想与主合并的所有分支;然后在$(cat branches_to_merge.txt)中使用“for BRANCH”;执行git checkout $ BRANCH; git merge master; done“ –

回答

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) 

也完全可以在这种情况下,以变基,除非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') 

origin/master顶部将重播犯下盲目master衍合X,这是遗漏了origin/master重新装修。不好。

今天(2014年1月),来处理这种情况下,唯一的办法就是:

  • origin/master一个 'TMP' 标记的分支,
  • git fetch
  • 检查,如果git branch --contain tmp名单origin/master (已经被提取,如果被重新发布并被强制推送,可能会有不同的历史记录)。

明天(git 1。9,2014年第一季度),你不会有读取前,以纪念你的远程分支:

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部分(指那些本地COM MITS尚未推到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

+0

我喜欢新的' - 嘟嘟点',但哦,我恐怕试图*解释*新的' - '点...':-) – torek

+0

@torek但它确实返回了2个分支之间真正的共同祖先),从reflog中挖掘它似乎很容易,不是吗?开玩笑 :) – VonC