2012-10-22 88 views
0

假設以下提交結構:混帳:刪除後裔分支

master:  A-B-C-D-E---------------- 
        \     \ 
branch a:   F-G-H  branch d: N-O 
         \ 
branch b:    I-J 
          \ 
branch c:     K-L-M 

我要刪除所有分支從分支下降(在這種情況下,B和C)。有沒有辦法檢測到分支b和c來自分支a?

現在我正在想通過發現共同祖先(G)存在於哪個分支來完成這個任務;這將返回a,b和c;然後比較分支提供的時間。之後,刪除除最早分支以外的所有分支。

我想知道是否有更乾淨的方式來做到這一點,如果不是,我如何檢索分支創建的時間戳?

期望的結果:

master:  A-B-C-D-E---------------- 
        \     \ 
branch a:   F-H'  branch d: N-O 
+2

Btw。你錯過了什麼分支:分支是指向單個提交的指針;提交併非僅限於某些分支機構。 – poke

+0

通過刪除顯式不合併到其他任何東西的分支,你實際上失去了提交。這是你想要做的嗎? – meagar

+0

@poke:我明白。但初看之下,我認爲分支機構也有某種層次結構,因爲分支機構必須來自現有分支機構,對吧? – melder

回答

0

好吧,這未必是最優雅的方式,但以下似乎這樣的伎倆:

git reflog <branch> 

的「B」運行此,從上面的例子會返回類似的東西:

137c91f [email protected]{0}: branch: Created from a 

可以通過運行重構分支樹這個命令在每個與目標提交相關的分支上。

0

我會用一個非常小的shell腳本。

#!/bin/bash 

# identify the bad commit 
BAD_COMMIT=$(git rev-parse "$1") 

# loop through branches 
for BRANCH in $(git for-each-ref --format="%(refname)" refs/heads); do 
    # detect if the branch is in the history, for which fgrep will exit 0 
    if (git rev-list $BRANCH | fgrep -q $BAD_COMMIT); then 
    echo "Deleting $BRANCH" 
    git branch -D $BRANCH 
    else 
    echo "Keeping $BRANCH" 
    fi 
done 

參見:SO Answer: Iterating through branches

0

1)刪除C路 2)刪除支路B 我不知道什麼是H」是;我想猜你想要提交H進入提交G.

+0

假設H'是H的一個版本,它跳過了提交G.我不確定任何腳本都知道以不同的方式處理'branch a',但總是可以運行'git rebase --interactive'來從'分支a的歷史。 –