我對git合併感到困惑。與git中的主合併後,功能分支會發生什麼變化
想我已經從master
採取feature
分支,他們已經divergedliek這 和他們合併這樣
現在我想知道,這將是該圖此命令後
git checkout master
git merge new-feature
此命令後的圖表是什麼
git checkout master
git merge new-feature
後提供我不關閉功能分支後,只是做一提交之後的特性分支
我對git合併感到困惑。與git中的主合併後,功能分支會發生什麼變化
想我已經從master
採取feature
分支,他們已經divergedliek這 和他們合併這樣
現在我想知道,這將是該圖此命令後
git checkout master
git merge new-feature
此命令後的圖表是什麼
git checkout master
git merge new-feature
後提供我不關閉功能分支後,只是做一提交之後的特性分支
答案是:什麼也沒發生的feature
分支爲合併的結果。新的合併提交被添加到當前分支(合併完成時爲master
)。沒有現有的提交會受到影響,因爲根本不能改變現有的提交。
另外,提交之間的箭頭確實應該指向另一個方向。新的提交指向較舊的提交;較舊的提交不能被修改,而不是最小的提交,所以沒有辦法「向一個較舊的提交添加一個箭頭」。您只能對一個或多個較舊的提交進行新的提交,該提交具有一個或多個後向箭頭。 (每指向一次提交一個箭頭,也就是說,你甚至可以用一個新的提交來提交沒有指向箭頭:這是一個新的「根提交」,雖然這是一個更高級的事情, 。不是所有的共同在庫)
儘管ASCII技術版本不一樣漂亮,這些是相同的前和圖表後:
o-o <-- feature
/
o--o--o--o <-- master
[變爲:]
o-o <-- feature
/ \
o--o--o--o--o <-- master
如果您然後檢查出feature
並添加一個其他承諾feature
在此之後,就變成:
o-o--o <-- feature
/ \
o--o--o--o--o <-- master
編輯:讓我們重新繪製最後一張圖片(圖片一樣,我們只是把一個名字m1
,對於「合併#1」,在地方o
S的一個代表提交):
o-o--o <-- feature
/ \
o--o--o--o--m1 <-- master
現在假設你繼續發展走在feature
,增加兩次提交:
o-o--o--o-o <-- feature
/ \
o--o--o--o--m1 <-- master
然後決定再次合併feature
到master
。要做到這一點,git會需要作出一個新的合併提交,m2
:
o-o--o--o-o <-- feature
/ \ \
o--o--o--o--m1------m2 <-- master
爲新合併的合併基礎是通過看老合併得到的,這樣的git可以告訴大家,只三個最新feature
提交需要被帶到。
這就是爲什麼,如果你決定從feature
東西打破master
,你將合併m2
之前「撤消」,你需要手動「重做」,如果需要。也就是說,假設使合併m1
後,但增加對feature
三個新提交之前,你會發現master
被打破,您添加提交f
(「通過去除一塊功能的修復」):
o-o <-- feature
/ \
o--o--o--o--m1--f <-- master
現在,你像以前一樣繼續前進,工作feature
,添加三個提交:
o-o------o-o-o <-- feature
/ \
o--o--o--o--m1--f <-- master
現在,當你去git merge feature
爲master
,git會再次找到了基地,才知道採取從三個最新的變化提交併添加它們到f
:
o-o------o-o-o <-- feature
/ \ \
o--o--o--o--m1--f------m2 <-- master
但提交f
的新功能禁用故意一部分。您可能必須手動修復合併(在提交m2
之前或在m2
之後的單獨提交中 - 如何執行此操作取決於您),即「撤消」f
中的修復,重新啓用完整功能。
不管是否以及何時feature
要稍後再合併到master
,您可以選擇是否要合併到master
feature
。讓我們假設例如有什麼東西在master
特別G
洪水是應該納入feature
:
o-o <-- feature
/ \
o--o--o--G--m1 <-- master
在這裏你可以:
git checkout feature && git merge --no-ff master
帶來的G
的變化,m1
爲feature
。當然,在m1
的變化已經出現,但混帳可以算出來本身,所以它真的只在好東西從G
帶來:
o-o----m2 <-- feature
/ \/
o--o--o--G--m1 <-- master
的--no-ff
如果你想要一個明確的合併提交時,才需要這對於使「功能」的開發線脫穎而出非常有用。如果你離開了--no-ff
,git會看到,把m1
到feature
的結果,那麼,m1
,並且將只是移動分支標籤,在「快進」操作:
o-o
/ \
o--o--o--G--m1 <-- feature, master
如果你是「分支功能」(git checkout feature
),並作出新的承諾,這將離開標籤master
在m1
指指點點,feature
你的指點‘新最新的’承諾:
o-o
/ \
o--o--o--G--m1 <-- master
\
o <-- feature
我把feature
向下跌破至emphas請注意,「頂部」o-o
行有一次出現在feature
上並不明顯。
注意,此圖是一樣的這種替代繪圖看起來有點像蝸牛:
o-o o <-- feature
/ \/
o--o--o--G--m1 <-- master
其中的一種暗示,該o-o
威力已經對功能的;但是從這個繪圖,其中包括m2
很大的不同:
o-o----m2--o <-- feature
/ \/
o--o--o--G--m1 <-- master
和這使得它非常清楚,feature
有一個完整的血統可以追溯到早期的頂部o-o
。這基本上是「與--no-ff
合併的其他方向」。
(你要嗎?嗯,這取決於你,真的。像「蝸牛」一圖是很常見的,你習慣了它們,知道哪個分支標籤是一些犯序列一些在過去的時間往往不是很有用,但有時它是有用的,然後你想看起來更像帳篷和幾何事物,而不是蝸牛的圖形。:-))
謝謝,這是我誤解了,我認爲當我合併然後功能分支也得到主人的承諾,所以這意味着如果我必須繼續功能,那麼我必須合併主功能分支也? – user3147180
除非你想從'master'中選擇新的東西,否則你不能*將*''合併回''feature'。如果您只是繼續在'feature'上開發,然後再次將'feature'重新合併到'master'中,則「merge base」是合併到master中的最後一個點。我會添加一些圖表。 – torek
其實'功能'是我的本地分支,我做所有的東西,然後我從主人拉最新的東西,然後首先合併我的東西與主人,並推動主服務器,然後我也想有主人的東西,所以我需要合併掌握'特徵'分支。有沒有更好的方法呢? – user3147180