2011-03-22 90 views
62

Mercurial中的tagbookmark有什麼區別?我似乎無法找到任何關於這兩者如何不同的討論。hg標籤和hg書籤有什麼區別?

+3

你可能會發現這篇關於Mercurial中分支的指南非常有幫助:http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ – alexandrul 2011-03-22 21:50:25

回答

33

讓我們考慮您的存儲庫爲「選擇您自己的冒險書籍」,以不同的觀點。

  • 一個標籤就像是戳編輯器把你的稿子說「OK,我們保持當前的工作跟蹤,在情況還是發生了。」
  • A 命名分支將是一章。你必須在某一時刻選擇哪一章你必須寫,而且他們留在那裏。有些會合並回來,有些會結束(對不起,你死了)。
  • A 書籤是一個書籤。它在你閱讀(提交)書的同時跟隨你。它可以幫助你保持「當時你正在閱讀的內容」的軌跡,所以你可以刪除它們,將它們移到不同的「章節」。當你分享這本書時(推),你通常不會共享你的書籤,除非你明確地想要。所以你通常在匿名分支上使用它們,因爲它們的生命週期比命名分支短。
+9

一個意想不到的比喻** O_O ** – 2012-03-23 08:19:38

+30

我沒有得到這個比喻。我是在寫這本書還是在讀別人正在寫的書?發佈者版本是否控制手稿?他是否蓋印我的副本或他的?我正在寫手稿,複印它們嗎?使用tippex處理它們?在計算機上做它並以某種方式進行版本控制? – 2012-04-18 20:45:07

+17

這個比喻*很混亂,可以使用精煉。 試試這個。你正在看書。 1頁= 1變更集。 * A **標籤**在您感興趣的頁面上粘貼便條。它在同一頁面上保持 ,並可用於輕鬆找到該頁面。 *一個**命名分支**是一章。每個頁面都有一個章節編號爲 的餘量。這將相關頁面組合在一起。 * A **書籤**是書籤。隨着您逐頁移動,您將向前移動 書籤。您可以使用多個書籤來跟蹤本書不同部分的進度。 – 00dani 2012-07-21 03:05:42

22

書籤在您希望助記符(foo_feature)指向隨着工作進展而改變的提交ID時使用。它們比普通Mercurial分支更輕量化,並且與git分支的工作方式有些相似。

標籤通常指向固定的提交ID。他們可以手動重新分配,但這是不鼓勵的。

+0

更輕量級?我很困惑,主要來自svn,其中分支和標籤對於相同的實現僅僅是不同的約定。 – 2011-03-22 01:56:07

+1

@Jason,這有點棘手。在我知道足夠的git進行比較之前,我不認爲我真的明白了。但是,基本思想是,對於重分支,分支名稱是變更集的(不可變)屬性。對於輕量級分支,分支名稱是特定變更集的移位*別名*。我建議閱讀Mercurial wiki上的[Branch](http://mercurial.selenic.com/wiki/Branch)和[GitConcepts](http://mercurial.selenic.com/wiki/GitConcepts)。 – 2011-03-22 03:04:21

12

最大的區別在於書籤在您提交時會自動向前移動。這裏有一個例子:

hg init 
..edit a file.. 
hg commit -m 'my commit' # creates revision 0 
hg tag -r 0 mytag  # creates revision 1 
hg bookmark -r 0 mybookmark # doesn't create a revision 
hg update 0 # get back to r0 
..edit a file.. 
hg commit -m 'another commit' # creates revision 2 

此時mytag仍然指向版本0和mybookmark現在指向修訂2.另外,標籤創建變更和書籤都沒有。

而且,當然,書籤創建revisio

21

實際上有五個概念玩:

  • 標籤
  • 局部變量
  • 書籤
  • 輕量級分支
  • 命名分支

輕量級分支是如果你只是使用mercurial會發生什麼。您的存儲庫歷史記錄分叉,有時會在您更改內容並移動歷史記錄時進行合併。

其他四種是註解輕量級分支的方法以及構成它們的變更集。

命名分支和標籤是mercurial-only概念,其中分支名稱和標籤實際上通過向存儲庫提交更多的記錄而被記錄在存儲庫中。他們傾向於以不一定明顯的方式傳播到其他存儲庫。

本地標籤和書籤更像是什麼git調用標籤和分支。它們是元數據,而不是與版本化對象混合在一起。所以他們沒有被描述成倉庫歷史記錄的一部分。他們往往是你的倉庫本地化的,並且不會傳播,除非你故意傳播它們。

至少我認爲這就是它們的工作原理。在每天使用mercurial大約十二個月後,我還沒有真正掌握它的模型。如果有人比我更清楚,那麼可以隨意編輯這個答案,這是正確的。


我在實際中如何使用這些東西。

我正在與大約20個其他人共享單個共享存儲庫。我在自己的私有存儲庫中製作了許多實驗和輕量級分支,這些分支永遠不會推送到我們的主中央存儲庫。偶爾,一旦實驗結果出來,我將修改主線並將變更集推入中央存儲庫,從中找到其他人機器的路徑。

我偶爾會將一些變更集推送給同事,如果他們是對mercurial工作方式感到滿意的人之一。但有幾個人有點害怕它,並且傾向於如果我向他們發送差異,他們可以使用補丁。

對於實驗我期望是短暫的和私人的,我只是讓輕量級分支發生在他們可能的地方,並且記住發生了什麼。如果我感覺自己的記憶力正在滑落一段時間,那麼我將它收藏起來。

我使用本地標籤來標記修訂,我可能會回來一天。他們使過去的有趣狀態更容易找到。

我自己幾乎從不製作非本地標籤或命名分支(除非意外,如果我這樣做,我會銷燬它們)。但我們的發佈人員呢。我們發佈的主要版本的主線都有自己的命名分支,次要版本在這些分支上有標籤。這確保了這些重要的分支和標籤對所有人都是一樣的。

再一次,我不知道這是怎麼使用mercurial,但它似乎是一個適合我們團隊規模的模型。

如果我們三四個人想在實驗上合作,那可能會值得一個命名分支,我們可能會分享自己的分支,但不推向中央回購。我不知道這樣做會有多好!

相關問題