問題是我需要看看我想合併的分支是否未發佈。
如果他們沒有發佈,你應該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/master
到master
。
在你給的鏈接中,下一個答案是「對於$(ls .git/refs/heads)中的BRANCH;執行git rebase master $ BRANCH; done」。該代碼缺少什麼? –
我有點害怕做rebase,尤其是在所有分支上,這可能會導致未來更大的問題:http://www.git-scm.com/book/en/Git-Branching-Rebasing#The - 重新裝箱。問題是我需要查看我想合併的分支是否未發佈。 – edi9999
好吧,那麼對於$(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「 –