2012-08-22 408 views
9

我遇到了工作中的困難(如下面的簡化草圖所示)。在創建分支期間,由於某種原因,默認分支被作爲父分支繼續使用,但仍然單獨保留默認分支(這是我們前面使用的默認分支)。這給我們留下了兩個默認分支。在分支分支提交後,在Mercurial中留有兩個默認分支

有人誤解了如何在分支之前提交更改,因此我們最終將branch1中所做的更改合併到了branch2中。

我一直在調查Mercurial: the definitive guide看看這是否是一個可以解決的問題,但無法找出什麼命令退出或關閉將有所幫助。最簡單的方法是,如果可以重新命名剩餘的默認分支。

什麼是解決此問題的最佳和/或最簡單的方法?

我正在準備將開發分支合併到正確的默認分支中,並希望在開始任何主要合併之前修正此頭痛問題,這可能會使得將來更難以解決此問題。

branch problems

回答

7

記住分支名稱只是標籤放在提交 - 沒有什麼真正打破你的圖表。分支名稱不會影響合併時發生的情況,只有文件內容在合併時很重要。

話雖這麼說,你可以在default關閉多餘的頭,下面branch1之一:

$ hg update "min(heads(branch(default)))" 
$ hg commit --close-branch -m "closing this head" 

這會在你的圖表,這是很好的離開晃來晃去接近變更。關閉變更集將隱藏頭部hg heads,並且諸如hg merge之類的命令將不再建議與該頭部合併。

+0

我認爲它已經排序。你有'hg rebase'和/或'hg strip'的經驗嗎?最好將branch1和branch2作爲一個分支。 branch2基本上是在branch1中進行的更改,但沒有包含缺省分支。 – Patrick

+0

在閱讀rebase和strip之後,我現在看到它們通常只用於未提交或與存儲庫共享的提交。 – Patrick

+0

@帕特里克:你對rebase和strip的看法是正確的:如果你已經把變更集推到了別的地方,那麼這兩個命令都是低效的。什麼都不會中斷,但是當你從服務器上取下時,你會發現你獲得了原始的變更集。這或者否定命令的效果(對於'hg strip')或者看起來很亂(對於'hg rebase')。 –

2

老問題,但我雖然這可能是有用的人。

..此問題發生在單個分支發散時,通常在有人執行hg push -f而不是拉取和更新時發生。在你的情況下,被迫頭部碰巧也在另一個分支上,但這也可能發生在單個分支上。我的解決方案是讓它坐落在分支合併之前 - 至少,如果有計劃在某個時候合併它們。在我看來,這個解決方案比關閉錯誤的頭更加乾淨。

但是,在做hg update default會帶你到最新的提交與'默認'的名稱。儘管我認爲這個想法在你的案例中是正確的,但這是因爲你實際需要的「默認」是最新的「默認」分支名稱的提交,所以應該沒有問題。但是,如果錯誤的頭部更新,hg update default會將人們帶到錯誤的頭部,這可能相當混亂。

無論是哪種情況,這樣就解決了問題:

hg update <revision number of correct 'default' head> 
hg merge <branch the erroneous 'default' head is on> 

因此,在這種情況下,hg update default將更新到錯誤的頭:

1-2(default) 
\ 
    3(default)-4(branch1) 

你需要做的:

hg update 2 
hg merge branch1 
# results in this graph: 
# 1-2---5(default) 
# \ /
# 3-4(branch1) 

而在下面,hg update default將更新爲您所採取的行爲無論如何想要反正:

1-2------------5(default) 
\ 
    3(default)-4(branch1) 

..你可以忽略錯誤的默認值,因爲它不會影響任何人。然後,一旦某人做了一個hg update default; hg merge branch1,錯誤的頭會默默地消失,因爲那時它是錯誤的「默認」的祖先。 ..這會導致這樣的事情:

1-2-5----------11(default) 
\   /
    3-4-[...]-10(branch1) 

..你也做一個無用的承諾在您需要的默認值,那麼這將是最新的,這將是當他們這樣做的一個人先hg update default,但我真的不喜歡有歷史上的垃圾提交。

+0

我想知道爲什麼我有2個默認分支機構,並且真的回答了我的問題。我不得不合並,但這不是一個簡單的選擇,因爲強迫提交的人避開了它,並且我的更改被覆蓋 –

+0

是的,這種情況幾乎不可避免地是由於某人不想與其他人的工作集成。強行推動將工作強加給其他人。 –