我在理解如何在git中使用標籤與分支時遇到一些困難。 html
我剛剛將當前版本的代碼從cvs移動到git ,如今我將爲特定功能處理該代碼的子集。 其餘一些開發人員也會參與其中,但並不是全部開發人員都會關注此功能。 我應該建立分支仍是標記? 在什麼狀況下我應該使用一個與另外一個? git
看起來最好的解釋方式是標籤做爲只讀分支。 您能夠將分支用做標記,但可能會無心中使用新提交更新它。 只要它們存在,標籤就保證指向相同的提交。 加密
標籤能夠是簽名的也能夠是未簽名的 ; 分支從未簽署。 spa
簽名標籤永遠不會移動,由於它們以加密方式綁定(帶有簽名)到特定提交。 未簽名的標籤沒有綁定,能夠移動它們(但移動標籤不是正常的用例)。 .net
分行不只能夠移動到不一樣的提交,但預計這樣作。 您應該爲本地開發項目使用分支。 將工做提交到「標記」上的Git存儲庫是沒有意義的。 線程
標籤表示某個時刻特定分支的版本。 分支表明一個單獨的開發線程,能夠與同一代碼庫上的其餘開發工做同時運行。 對分支的更改最終可能會合並回另外一個分支以統一它們。 指針
一般你會標記一個特定的版本,以便你能夠從新建立它,例如, 這是咱們發送給XYZ公司的版本 。 分支更像是一種策略,能夠在繼續對其進行開發的同時提供特定版本代碼的持續更新。 您將建立交付版本的分支,繼續在主線上進行開發,但對錶明交付版本的分支進行錯誤修復。 最後,您將這些錯誤修復程序合併回主線。 一般你會同時使用分支和標記。 您可使用各類標籤,這些標籤能夠應用於主線及其分支,用於標記您可能要從新建立的每一個分支的特定版本(例如,傳遞給客戶的那些版本) - 用於傳遞,錯誤診斷等。 rest
它實際上比這更復雜 - 或者像你想要的那樣複雜 - 可是這些例子可讓你瞭解這些差別。 code
從理論的角度來看: htm
從技術角度來看:
refs/tags/
namespace中,而且能夠指向標記對象 (帶註釋和可選的GPG簽名標記)或直接提交對象 (本地名稱使用較少的輕量級標記),或者在極少數狀況下指向樹對象或blob對象 (例如GPG簽名)。 refs/heads/
namespace中,而且只能指向提交對象 。 HEAD
指針必須引用分支(符號引用)或直接引用提交(分離的HEAD或未命名的分支)。 refs/remotes/<remote>/
namespace中,並遵循遠程存儲庫<remote>
普通分支。 另見gitglossary聯機幫助頁:
科
「分支」是一個積極的發展路線。 分支上的最新提交稱爲該分支的提示。 分支的尖端由分支頭引用,分支頭在分支上進行額外的開發時向前移動。 單個git存儲庫能夠跟蹤任意數量的分支,可是您的工做樹只與其中一個分支相關聯(「當前」或「已檢出」分支),HEAD指向該分支。
標籤
指向標記或提交對象的ref。 與頭部相反,標記不會被提交更改。 標籤(不是標籤對象)存儲在
$GIT_DIR/refs/tags/
。 [...]。 標記最經常使用於標記提交祖先鏈中的特定點。標籤對象
包含指向另外一個對象的ref的對象,該對象能夠包含與提交對象相似的消息。 它還能夠包含(PGP)簽名,在這種狀況下,它被稱爲「簽名標記對象」。
Git Parable解釋瞭如何建立典型的DVCS以及他們的創做者爲何會這樣作。 另外,你可能想看看Git for Computer Scientist ; 它解釋了Git中每種類型的對象的做用,包括分支和標記。