2011-05-19 79 views
16

更新:示例存儲庫,https://github.com/so-gitdemo/so-gitdemorepo在git中,我如何找到創建分支的版本?

在github回購的上下文中。如何輕鬆找到rev「b0430cee」?我知道我可以看看,但這個存儲庫模仿的真實例子有十幾個提交者和多個其他分支。使用檢查不太容易。

如何在多次合併分支時找到分支創建修訂?

我知道這個問題的:How to determine when a Git branch was created?

的解決方案似乎並沒有對已合併多次分組工作。我們通常會將發佈分支中的錯誤修復合併到主分支。也許我們甚至做這個部分是錯誤的......對git還是新的。

想象一下下面的簡單。真正的東西有來自多個人的主/分支上的更多提交。也有幾個版本分支(認爲1.0,1.1,1.2,1.3)

 Future dev ? 
        | 
        | 
    Merge 1.0 back * ? Potential future fixes 
        |\ | 
        | \| 
        | \ 
      New work * | 
        | * Emergency bug fix 
        | | 
    Merge 1.0 back * | 
        |\ | 
        | \| 
        | * Another bug fix 
        | | 
        | | 
     New feature * * First bugfix on branch 1.0 
        |/
        |/
        |/ 
        * Feature 
        | 
        | 
        | 
        * Some feature 
        | 
        | 
        | 
        * The past (master) 

我們還是新的Git和制定管理髮布和分支機構的最佳方式,我們已經決定,我們需要追溯添加一些標籤到回購。例如1.0分支的1.0標籤以及後來的1.0.1標籤修正了bugfix版本。

後續獎金問題:添加我想要的標籤的最佳方式是什麼?以及我應該在哪個版本上加標籤?首先在新分支上提交?或者在分支提交之前第一次通用提交

+5

+1,漂亮的圖表! – oliholz 2011-05-19 12:04:23

+0

我認爲一個優秀的git分支模型可以遵循(它聽起來像你可能已經試圖遵循它)已經在[一個成功的Git Branchning模型。](http://nvie.com/posts/a-successful -git-branching-model /)我不知道你爲什麼會在「功能」上分支,除非那是標誌着主要版本。 – Diego 2011-05-19 12:08:56

+0

「特徵」僅僅是最後一個共同的祖先。我們分支是因爲團隊的其他成員需要繼續前進,然後有人發現了一個需要在「1.0」版本中修復的bug ...標籤會使這一點更清晰 – basszero 2011-05-19 12:19:21

回答

6

由於您添加了一個git repo ...我遠程工作以測試事情。

如何輕鬆找到rev「b0430cee」?

在這種情況下,這個漂亮的oneliner爲我做的工作:

git rev-list --reverse --topo-order --left-right --boundary 1.0...master | 
    grep "^>" -B1 | 
    head -1 | 
    cut -c2- 

如果你想獲得469c14a1fa8a40237700(New feature work)來代替,這個工作對我來說:

git rev-list --reverse --topo-order --left-right --boundary 1.0...master | 
    grep "^>" | 
    head -1 | 
    cut -c2- 

HTH

+1

似乎在我的主要回購工作!感謝您的時間和耐心。 – basszero 2011-05-19 14:47:25

5

在閱讀問題時,我對你在詢問的內容有些反覆拋出。

如果你真的想要一個分支的不僅僅是根,我想你想要像

git rev-list --merges --boundary branch1 branch2 | tail -1 

的東西,如果你想驗證分支實際上是相關

git rev-list --left-right --merges --boundary branch1 branch2 | 
    grep '^-' | 
    tail -1 | 
    cut -c2- 

然而,很可能漂亮高你想要

git merge-base branch1 branch2 

此外,以下將證明是有益的下次要漂亮的燕尾圖:

git show-branch # [--mergebase] branch1 branch2 

您可以使用Git日誌得到稍微控制:

git log --graph --left-right --merges --boundary HEAD MP26/MP26 

> commit 0118d9979d1d27f08fa14cddfffa3e9c2cd5fe9c 
|\ Merge: 8958c53 e1cd319 
| | Author: Seth Heeren <[email protected]> 
| | Date: Fri Feb 18 12:05:49 2011 +0100 
| | 
| |  Merge branch 'MP26' into tmp 
| | 
| o commit e1cd31926d01c08092a95226ac7b49bbea19ac92 
| Author: Seth Heeren <[email protected]> 
| Date: Thu Feb 17 16:39:17 2011 +0100 
| 
|  xxxxx 
| 
o commit 8958c534b034cbb28bf1e853de0bfec0a9b0ddbb 
    Author: Seth Heeren <[email protected]> 
    Date: Fri Feb 18 12:05:30 2011 +0100 

     fixup 

Git的日誌還支持--decorate選項如果你喜歡從分支名稱顯示git show-branch

+1

'git merge-base'找到從分支到主的最新近合併。我想找到當主分支FIRST分歧 – basszero 2011-05-19 12:14:07

+0

git rev-list branch1 |尾巴-1(從主人或1。0)導致非常優先承諾整個回購。 :(我覺得我們正在接近...... – basszero 2011-05-19 12:22:15

+0

'git rev-list分支-not master'不會輸出任何東西,這可能是因爲我們已經將1.0中的每一項變更都合併到了主控制器中嗎?希望它不會'如果我有困難,不要試圖成爲 – basszero 2011-05-19 12:30:19

0

這是很容易添加標籤追溯在git。所有你需要做的就是給SHA1哈希與git tag命令(感謝Sehe):

git tag 1.0 abcd1232 
git push origin 1.0 

很難回答你的第二個問題,因爲很難定義什麼是「最好的」。在工作中,我們有一個開發分支,每個人都與之對抗,當我們決定要發佈時,我們創建一個發佈分支,例如, rel-1.0,並且該分支直到我們決定完成它。然後我們將它合併到master中,使用1.0標記並刪除發佈分支。所以我們應該總是認爲我們的標籤是聖潔和穩定的。所以在我們的情況下,總是在我們將發行版分支合併到主版本時創建的合併提交。

+1

我認爲'git tag 1.0 abcd1232'稍微更高效 – sehe 2011-05-19 12:37:26

+0

@Sehe:我同意你的意見:D – ralphtheninja 2011-05-19 12:40:50

2

也許我誤解了這個問題,但分支是由它們的提示定義的,並且該提交的每個祖先都包含在分支中。例如,假設emergency-bug-fix是一個分支,其小費位於圖中的Emergency bug fix - 該分支上最舊的提交將爲The past (master)。如果您只是查看提交圖,那麼「創建分支的修訂版」不是一個明確定義的概念。

如果你只是擔心當了分公司,在一個特定的存儲庫已創造了約,你可以使用的「引用日誌」 - 例如,看看最後一行的輸出:

git reflog show emergency-bug-fix 

但是,該命令的結果將從存儲庫到存儲庫不同,具體取決於在那裏創建ref的時間,例如通過讀取或推送。此外,默認情況下,reflog在90天后到期,它可能不再有這些信息。如果你有一個幸運的中央倉庫,那麼你可以在那裏做同樣的嘗試,並且這可能會給你在集中式倉庫中首次創建ref的提交。然而,我不認爲這是你想要的解決方案。

正如您已經正確計算出來的,只需在您感興趣的提交圖中標記點即可。Magnus Skog's answer告訴您如何執行該操作。

+0

reflogs的問題,他們默認有過期時間。這可能是一個高流量分支的問題 – sehe 2011-05-19 12:43:13

+0

@sehe:我在我的答案中提到了到期時間。此外,這不是我所推薦的,只是提到了一種可能性。 – 2011-05-19 12:55:56

相關問題