2015-11-10 2 views
3

У меня есть ветка A, которая расходится в другие отрасли. У меня также есть больше филиалов, которые не расходятся с этим A филиал. Как я могу найти, какие ветви отклоняются от A?git - найти расхождения в отрасли

Например:

-------------------------------- Master 
\ \ 
    \ -------------------------- A 
    \   \ 
    \   ----------------- B 
    \   \ 
     \   ------------- C 
     \ 
     \ 
      ---------------------- D 
       \ 
        -------------- E 

Я хочу выход быть B и C.

+0

Концепция ветви, которая расходится с другой веткой, немного нечеткая в git. Это связано с тем, что ветви просто указывают на одну фиксацию, и история репо не всегда является деревом. – GolfWolf

+0

Например, посмотрите [этот график] (http://pastebin.com/qc4Umc2g) и скажите, какие ветви «расходятся» от A – GolfWolf

+0

. Сказав это, вы можете попытаться найти ветви, чей [общий предок] (https : //www.kernel.org/pub/software/scm/git/docs/git-merge-base.html) с ветвью A впереди мастера. Однако, после того, как ветвь A и ее потомки объединены обратно в master, это больше не будет работать. – GolfWolf

ответ

3

git branch --contains должен обеспечить то, что вы хотите.

Опция --contains показывает нам все ветви, которые содержат конкретный commit-ish. Конец, который мы хотим, является первым на A после его разветвления от master. Было бы проще получить merge-base от A и master, но он также будет содержать master и что-нибудь, что ветвится от master после A.

Мы можем найти первый совершить SHA на A с:

git log --format=format:%h master..A | tail -1 

%h дает нам короткий совершить SHA, поэтому мы не должны нарезать выход по умолчанию после этого. tail выбирает самую раннюю фиксацию на A, или вы также можете передать log опцию --reverse и использовать head. Если ваш филиал длится миллион, это позволит обрабатывать die sooner, но на тот момент у вас есть другие проблемы.

Затем мы используем A «первый SHA в branch --contains:

git branch --contains $(git log --format=format:%h master..A | tail -1) --no-merged A 

Опция --no-merged A игнорирует ветви A сам, в котором четко содержит коммит мы выбрали.

Если вы в настоящее время проверили одну из ветвей, которые расходились от A, мерзавец будет означать, что с * как это происходит, когда вы просто запустите git branch. Я не могу найти способ снять это в чистом Git, но вы можете использовать любое количество команд unix, чтобы удалить его из вывода.

+0

почти правильный ответ - с учетом потребностей , а не название отрасли. исправьте его, чтобы иметь git log master..A --oneline | хвост -1, а затем я помечаю ваш ответ как правильно. BTW Я могу жить без -no-объединенной проблемы –

+0

Обновлен ответ, чтобы отразить, что '--contains' возьмет commit-ish. Используя ветку, я работал отлично (v2.2.1). –

+0

Я пробовал это с именем ветки, и единственным результатом, который я получил, была сама ветка. И логично, если вы посмотрите в моем примере, что только A содержится в A. –

Смежные вопросы