Я хочу увидеть все ветки, которые являются предками фиксации abcdef1234.

Это своего рода обратное:

git branch --contains abcdef1234

Вышеупомянутая команда перечислит все ветки, которые являются потомками abcdef1234. Я хочу увидеть список всех ветвей, которые являются предками abcdef1234.

Меня также интересует аналог для тегов.

ОБНОВЛЕНИЕ

Чтобы быть предельно ясным, я имею в виду, что хочу увидеть список всех коммитов, которые соответствуют двум критериям:

  1. Они предки abcdef1234
  2. В настоящее время на них указывают ветки (локальные или удаленные).

Очевидно, что у большинства коммитов в какой-то момент была ветка, указывающая на них, когда они были совершенно новыми. Меня интересует только то, являются ли они филиалами в данный момент.

git
7
Isaac Betesh 13 Май 2016 в 21:35

3 ответа

Лучший ответ

git branch --merged abcdef1234 должен делать то, что вы хотите. В нем перечислены все ветки, которые объединены в названный коммит (и, таким образом, являются его предками), то есть те, чьи вершины коммитов достижимы из названного коммита.

7
sschuberth 13 Май 2016 в 19:15

Вот то, что я предложил в качестве комментария, в развернутой форме. (Я думаю, это то, о чем вы просите.)

Мы устанавливаем K на выбранную вами фиксацию (abcdefg1234 в вашем примере). Затем мы хотим перебрать все ярлыки L , где L имеет форму refs/heads/* или refs/remotes/* (все ветви и ветви удаленного отслеживания). Каждая метка L указывает на конкретную фиксацию C . Если C является предком K , напечатайте этикетку L .

[ Изменить : как sschuberth ответил, это просто git branch --merged; новая функция, о которой я думал, заключается в том, что git for-each-ref теперь также реализует --merged, что означает, что вы можете легко создавать сценарии, но если все, что вам нужно, это имена , {{ X3}} делает это. Если вам нужны теги, см. git tag --merged, если они есть. Если ваша версия Git слишком старая, прочтите сценарий. :-)]

Вот сценарий оболочки (непроверенный!), Который это реализует. Обратите внимание, что git for-each-ref имеет новые возможности в более поздних версиях Git, которые упростят это, но это должно работать вплоть до уровня 1.6 - может быть, 1.7; Я забыл, когда git merge-base приобрел --is-ancestor.

#! /bin/sh

# find branches and remote-tracking branches that targt
# ancestors of $1.
showthem() {
    local tgt label lbltgt
    tgt=$(git rev-parse "$1") || return $?
    git for-each-ref --format='%(refname:short) %(objectname)' \
            refs/heads refs/remotes |
        while read label lbltgt; do
            if git merge-base --is-ancestor $lbltgt $tgt; then
                echo "$label"
            fi
        done
    return 0
}

case $# in
0) usage 1>&2; exit 1;;
1) showthem "$1";;
*) for i do "echo ${i}:"; showthem "$i" || exit; done
esac

(Вы можете немного подправить это, например, чтобы отказаться от символических ссылок, таких как origin/HEAD.)

2
Community 23 Май 2017 в 12:33
comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)

Это даст вам все ветки, в которых нет фиксации abcdefg1234; это результат git branch -a минус результат git branch -a --contains abcdefg1234.

1
Dan Fischer 13 Май 2016 в 19:07