2013-12-23 62 views
1

比方說,例如,我有樹枝主,foo和酒吧。如何找到指向相同樹木的所有頭部

master 
    \--foo 
     | 
    bar 

foo和bar是相同的東西。想象一下有些工作是在foo上進行的,然後用戶做了git checkout -b bar,但從來沒有做任何事情來阻止。所以,他們都指向同樣的樹木。

現在,讓我們說時間過去了,我忘記了那個其他分支的名字和foo是一樣的,或者我只是想清理我的分支。

在foo分支上需要執行什麼命令才能看到指向相同樹的所有其他分支(本例中只是bar)?

這是/爲什麼這很有用?那麼,因爲Github上的pull請求是可以被跟蹤的分支,所以我可以看看我坐下來的一個老分支,運行這個命令,並讓它顯示我origin/pr/42,現在我有舊的請求的標識(42)去Github看看吧。

回答

1

一個Git慣用的方法是使用for-each-refrev-parse找到所有共享樹十歲上下的引用。舉例來說,假設bash作爲外殼:

git for-each-ref --format="%(refname)" | \ 
xargs -I refname \ 
    sh -c '[[ $(git rev-parse HEAD^{tree}) == $(git rev-parse refname^{tree}) ]] && echo refname' 

這將列出所有的裁判,包括共享樹十歲上下的遠程裁判。

下面是一個示例輸出:

$ git branch foo 
$ git for-e... 
refs/heads/foo 
refs/heads/master 
refs/remotes/origin/master 
$ git checkout foo 
$ git branch bar 
$ git for-e... 
refs/heads/bar 
refs/heads/foo 
refs/heads/master 
refs/remotes/origin/master 
$ echo 「new content」 >> README && git add README && git commit –m 「New tree-ish」 
$ git for-e... 
refs/heads/foo 
+0

這是有效的,我接受它作爲答案,但如果你能解釋爲什麼它是'HEAD^{tree}'和'refname^{tree}',我會喜歡它。當我開始閱讀它時期待它將'rev-parse HEAD'與'rev-parse refname'進行比較。你的比較有什麼優勢? – masukomi

+0

Git引用可以是標籤,否則指向提交。您對提交不感興趣,而是對提交對象進行解引用,直到達到相關樹形目錄爲止 - 例如,如果運行'git show HEAD'和'git show HEAD^{tree}',則可以說明不同之處。 – mockinterface

1
git log --all --simplify-by-decoration --pretty=format:'%T %h %d %s' \ 
| awk ' 
    $3~/,/  { seen[$1]=2 }   # late addition to handle same-commit refs 
    ++seen[$1]==1 { save[$1]=$0; next } 
     seen[$1]==2 { print save[$1] } 
        { print } 
' 
+0

可能應該允許> = 2的情況下,有超過兩個l abel /承諾最終指向同一棵樹。 – torek

+0

@torek我錯過了什麼?我認爲當檢測到dup時,== 2部分打印第一個,無條件打印所有其餘部分。 – jthill

+0

@torek啊,好吧,我明白了 - 這是兩個指向相同的_commit_,它沒有處理的裁判,我得到了很難的部分是正確的,除了它對我來說是困難的部分也是容易的部分權利:-) – jthill

0

這可能不是什麼幻想,但我會得到散列提交目前我在 這樣例如

git log -1 --oneline 

然後採取散列和做

git branch --all --contains [hash] 
+0

不完全一樣的東西。我不希望包含散列的所有分支,我想要所有分支的頭是散列。 – masukomi