2014-04-14 23 views
0

我senoir編碼器,每星期要我結賬的標籤發佈dev的服務器什麼結賬標籤意味着混帳

我沒有得到這之前,所以我所做的是

  1. git pull
  2. 查找提交該標記的哈希
  3. 的git的復位 - 硬哈希碼

,所以我總是在主BR錨

現在他做到了,當我檢查時他沒有在任何分支。

當我問他爲什麼代碼是no branch,他告訴我那就是它應該是。

我不明白這一點。任何人都可以請解釋他所做的,他想和我在做什麼錯

+2

*任何人都可以請他解釋他做了什麼* - 不,我們不能。你問過他嗎? –

+0

是的,這真的是你應該問你的高級開發者的。如果你不知道自己在做什麼,硬重置可能會導致你失去工作。 –

回答

1

要正確地理解這一點,開始與此:這些哈希碼(SHA-1的值一樣5f95c9f...)是提交的「真實姓名」。所有其他名稱 - 分支和標籤 - 只是別名,但當然更容易記住和關聯。我們稱之爲「用戶友好名稱」。例如,標籤v1.9.0告訴你,這是犯是Git版本1.9.0,而5f95c9f850b19b368c43ae399cc831b17a26a5ac 並不意味着什麼明顯。分支機構也有一個更特殊的屬性。

每次提交記錄(原始)SHA-1以前的(父)的提交,以及。 這意味着我們可以得出提交作爲鏈,與最新的在右邊和向左到其父每一個指向:

A <- B <- C 

(每個字母這裏表示一些SHA-1)。一個分支標籤「通過包含提交的原始SHA-1,指向「該分支上的提示最多的提交。例如,如果一個分支標籤dev包含提交C的SHA-1,則轉移dev提交C。同時C讓混帳找到BB讓混帳找到A,讓A <- B <- C也是「分支」 - 這是混亂的,可以肯定的:混帳同時呼籲整個序列的「分支」和尖端,最提交「分支」。 (然而,它通常是從上下文可以清楚「分支foo」是否表示「尖端最提交」或「通過啓動在所形成的分支的尖端最提交和向後工作。)

此外,git reset你想在這裏使用的命令;我們將馬上得到這個命令

現在,如果你創建了一個標籤名稱,那麼這個git將幫助你強制執行的約定是標籤名指向一個特別承諾,,永不移動。換句話說提交SHA-1對於給定的標籤名稱始終是「真名」的一個特定提交

如果你創建一個分支的名字,然而,公約是分支名確實舉動。像master這樣的分支名稱會解析爲該分支的當前提示,因此master可能會解析爲5f95c9f...。無論何時向分支添加新的提交(通過運行git commitgit merge,通常,儘管還有一些還會添加新提交的情況),分支名稱將更新爲指向剛剛添加的新提交。也就是說,現在它解決了新的分支提示。你做了一個git commit,所以你得到了一個新的提交,所以分支標籤被「移動」到新的提交。

這是git reset進來的地方。reset命令是您如何進行「非標準」移動。特別是,它可以讓您將分支名稱「向後」移動。

假設你有這一系列的提交:

... <- E <- F <- G <- H <-- master 

這裏提交H是分支master的當前尖端的。當提交H時,提交G已經是master的提示,即master解析爲類似9c8ce73...的東西。但隨後git commit創建5f95c9f...所以master現在解決了。

如果由於某種原因,你想刪除從分支master提交H,你可以使用git reset爲「向後移動標籤」,即指向它在提交G代替:

git reset --hard 9c8ce73 

這使得分支標籤master解析爲提交G。提交H被有效地刪除(它不是真的只是刪除 - git保留的東西,所以你可以「解除」他們一段時間 - 但它會看起來就像它已經消失了),如果你現在做一個新的提交,你通過一個新的,不同的SHA-1獲得新的,不同的提交。這當然不是你想要的。


如果您已經有一些標籤名稱,您可以做git checkout tagname。這告訴git關閉當前分支,導致git調用「分離的HEAD」。當你處於這種狀態時,如果你做了新的提交,git會像平常一樣添加它們,但是這裏沒有「用戶友好名稱」:你不是「在分支上」,所以git不會移動分支到新的提示。它不能:沒有分支可以移動。但是如果你不提交新的提交,這無關緊要。您可以通過git checkout branchname回到「支持」分支。

所以:

  • git checkout tagname把你關分支機構,分爲 「分離的頭」 狀態。在這裏,你可以看看樹,因爲它是原始SHA-1,tagname是一個別名。 (如果您只想看到SHA-1,請使用git rev-parse tagname。)
  • git checkout branchname將您置於給定分支上,檢查分支提示。 (如果你只想看看分支機構的SHA-1,請使用git rev-parse branchname。)
  • git checkout SHA-1的工作方式與git checkout tagname完全相同。實際上,這是git checkout tagname如何工作:它將標籤名解析爲原始SHA-1,並檢出該提交。這是git checkout branchname如何工作,除了git認識到branchname是一個分支名稱,所以它把你「的分支」,以便未來git commit將移動分支提示爲您。

但是:

  • git reset --hard commit需要你在任何分支,使分支名點提交您提供。換句話說,它從當前分支提示提交中「剝離」分支標籤並將其「粘貼」到您提供給git的任何SHA-1。如果你給git另一個標籤或分支名稱,它只是將名稱解析爲正確的原始SHA-1,然後使它成爲當前分支的新分支。 (它也可以檢查出來,隨着那去提交,當然這棵樹。)

實際上,標籤v1.9.0指向一個註釋標記對象,但反過來指向提交我在上面引用。雖然原理是一樣的。

或者,在合併提交的情況下,它會記錄所有其父代提交ID。但是,對於本討論的其餘部分而言,這些都不重要。或者,正如git本身一樣,一些帶註釋的標籤又反過來指向一個提交。當然,這個提交指向它的父提交,它指向它的父代,等等;所以標籤在某種意義上與分支一樣「一樣好」。

2

背景

的標籤,只是對應於提交的標籤。

分支與標籤相似,但是隨着工作的進展,分支從提交移動到提交。通常一個分支被稱爲它指向的提交,並且所有祖先都提交。

多個分支在其歷史記錄中可以具有相同的提交。 (例如,masterbranch-a均與哈希abcdef123456提交。)


回答

假設提交哈希是在master分支,你沒有任何非推的變化,你和你的朋友之間沒有什麼太大的區別,除了方式更容易。

的區別:

  • 你在提交,但混帳也知道你工作的分支上master(所以如果你做了一個承諾,是將是對分支master)。此外,如果自從標記以來master發生更改,--hard將從master中刪除這些更改。如果你沒有推他們,你可能會永遠失去他們。
  • 他在同一個提交,但沒有特定的分支(沒有承諾是可能的)。另外,checkout不會更改歷史記錄。

因此,檢出標籤更容易,更乾淨,不易出錯(失去任何當前工作,意外提交等),但出於您的目的,本質上相同。

+0

雖然在某些情況下可能會導致您丟失工作副本更改和整個提交,但您不能「意外提交」具有硬重置的任何內容。 –

+0

@Cupcake,真的。但是*硬重置後,你可以,因爲你在一個分支上。你對失去變化很好。我會補充一點。 –

0

這聽起來像你的高級開發人員希望你這樣做:

git checkout <tag> 

你看no branch當你這樣做,因爲你檢查出標籤的參考,而不是一個分支引用。

你之前在做什麼可能是不是你的高級開發人員希望你做什麼。 git reset用於將當前分支引用移動到其他提交,並且當您使用--hard,它實際上可能會導致您失去工作

當您使用git reset --hard時,您看不到no branch的原因是因爲重置會使您的結帳移動分支。與git checkout <tag>相比,它不會將分支移動到您的結帳處,而是將代碼簽出。