2017-09-26 96 views
1

我最近創建了一個分支,branchA關閉了master以開發一個功能。在開發這個功能的同時,額外的提交被推到master。我希望把這些變爲分公司,因此而在branchA,我跑主站包含將主站合併到分支後的分支更改

git merge master 

然後我犯下最重要的是改變(B)。不過,後來我意識到,我已經合併主到分支很差,所以我恢復使用

git revert [hash of merge of master in branchA] -m 1 

我再重新申請從B變化,承諾它的承諾。最後,我將master重新合併爲branchA

我對這次合併感到滿意,所以我想把branchA的變化變成master。令我驚訝的是,這些變化已經在master。當我檢查了主跑

git merge branchA 

我看到

已經是最新的。

這裏發生了什麼事?

我來自SVN背景,所以我本來預計需要合併branchA回到master,但似乎似乎自動發生了?這種行爲與快進有關嗎?如果我不希望發生這種行爲(即將更改從主分支引入分支而沒有將分支溢出更改回主分支),該怎麼辦?

在此先感謝!

+1

你推你的分支到遠程嗎?還是僅限於本地? – 3D1T0R

+0

@ 3D1T0R:我已經將所有內容都推送到了遠端。 – Anonymous

+0

在https://www.atlassian.com/git/tutorials/merging-vs-rebasing的教程中,「合併選項」下似乎表明,合併到主分支會自動讓這個主點該分支,如果歷史符合某一套標準? – Anonymous

回答

1

開始用masterbranchA,都與每個幾個提交,branchA被檢出(顯示爲*):

m1 - m2 - m3  <--- master 
\ 
    a1 - a2  <--- branchA* 

[編輯:更新的合併結果,每個評論,表明master不向前移動到合併提交自動]

然後合併成主branchA,示爲合併提交a2m3:

m1 - m2 - m3  <-- master 
\   \ 
    a1 - a2 - a2m3 <-- branchA* 

合併的還原只是適用的變化「撤消」,它不會撤消實際的合併 - 顯示爲a2m3' :

m1 - m2 - m3  <-- master 
\   \  
    a1 - a2 - a2m3 - a2m3' <-- branchA* 

而且因爲你這樣做是恢復與branchA仍檢出,然後branchA引用將指向新的提交,並且master ref仍指向m3提交。

您又添加了承諾:

m1 - m2 - m3  <-- master 
\   \  
    a1 - a2 - a2m3 - a2m3' - a3 <-- branchA* 

最後,當你簽出master和合並在branchA,你猜到了,這只是一個快進,其轉發master指向同一個commit爲branchA。這是可能的,因爲從m3到a2m3的合併鏈接仍然存在(回覆沒有移除它),所以master被認爲是a3的父提交(對於a3有一個不間斷的鏈)並且可以快進到它。

m1 - m2 - m3 
\   \  
    a1 - a2 - a2m3 - a2m3' - a3 <-- branchA/master* 

這是你試圖合併branchAmaster,但得到的迴應,這是「已經更新了」的地步。

現在,之前第二合流嘗試,如果你已經簽出masterbranchA合併前承諾至少一次,或其他人已承諾master遙控器上的,你拉下來,然後你的分支將有再次分道揚((想想新的m4承諾爲m3的權利)。如果發生了這種情況,從branchAmaster的合併將是一次完全合併,而不僅僅是一個快進。


如何看待分支

關於如何看待分支機構對我的突破,是分支實際上只是一個參考提交 - 和技術上,所有的父母犯下連接到它。當你合併兩個分支時,你只是創建了一個有兩個父母的提交,而不是一個,此時沒有兩個分支,有一個 - 即使是分開的一系列提交,它們以前是分開的masterbranchA,不再分開 - 它們已經真正合並,現在兩個分支都指代它們全部。


你還能做什麼?

基於我認爲你想做什麼,你可以這樣做:

警告:有「不好的事情可能發生(TM)」,如果你推到一個遠程後更改的歷史,其他人(TM)可以訪問......但至少在這種情況下,只會重寫branchA歷史,不master

  1. 而不是恢復的master合併爲branchA,只是重置branchA到事先提交a2

    git reset --hard <hash of a2> 
    

    復位這樣的刪除所有引用a2m3所以它實際上是從回購刪除。它仍然會在您的回購中有一段時間,但除非您將散列保存在某處,否則將無法實現。 Git跟蹤此類提交一段時間,然後垃圾收集並刪除它們,如果它們不被重用足夠長時間。

  2. 此時你會:

    m1 - m2 - m3 <-- master 
    \ 
        a1 - a2  <-- branchA 
    

    就像在合併之前。

+0

驚人的解釋!對於「你還能做什麼」的選項,是否會使用「重置」,然後是強制推送? 關於如何思考分支,這是否意味着合併BranchA-> master與合併master-> branchA是一回事? – Anonymous

+1

@匿名謝謝!要設置爲先前的提交(或整個回購中的任何提交),您可以使用'reset'命令,是的。谷歌在軟,複合和硬復位之間的區別。當你準備在遙控器上進行永久變更時,最後需要強制推動 - 你不需要每次在本地改變任何東西時就推動(事實上,當你正在進行改變和避風港的時候)所有的東西都沒有經過測試,通常你不會推動,只保留一切地方,除非有人需要訪問你的工作)。 – LightCC

+1

@Anonymous對於合併,不 - 如果一個在提交行中領先於另一個,那麼只有後面的一個可以快進(即與前一個合併);實際上,我不確定它會在另一個方向上說些什麼,但是某種錯誤或者需要強制標誌。在這種情況下,您可能會更好地直接重置爲所需的提交以便後退(請記住在推送後對遠程用戶的影響)。另外,如果沒有首先標記主要提交或在那裏創建臨時分支,就不要倒退,否則可能會失去訪問權限。 – LightCC

相關問題