2014-01-25 38 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