То, что я пытаюсь сделать, это проверка версии. Я хочу, чтобы код оставался поверх минимальной версии. Поэтому мне нужен способ узнать, содержит ли текущая ветвь указанную фиксацию.

TieDad

Ответов: 8

Ответы (8)

Есть несколько способов добиться этого результата. Первый наивный вариант - использовать git log и искать конкретную фиксацию с помощью grep, но это не всегда точно

git log | grep 

Лучше использовать git branch напрямую, чтобы найти все ветки, содержащие данные COMMIT_ID, используя

git branch --contains $COMMIT_ID

Следующим шагом будет определение текущей ветки, которая может быть выполнена, начиная с git 1.8.1, используя

git symbolic-ref --short HEAD

И вместе как

git branch $(git symbolic-ref --short HEAD) --contains $COMMIT_ID

Но приведенная выше команда не возвращает true или false, и есть более короткая версия, которая возвращает код выхода 0, если фиксация находится в текущей ветви, ИЛИ код выхода 1, если нет

git merge-base --is-ancestor $COMMIT_ID HEAD

Код выхода хорош, но, поскольку вы хотите строку true или false в качестве ответа, вам нужно добавить немного больше, а затем объединить с if из bash вы получите

if [ 0 -eq $(git merge-base --is-ancestor $COMMIT_ID HEAD) ]; then echo "true"; else echo "false"; fi

Поскольку на этот вопрос есть несколько хороших скриптовых ответов, я добавляю свои избранные.

Это покажет вам, для последнего $ n фиксируется в $ br, каждая ветвь которого содержит:

br=mybranch
n=10
git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'

Это похоже, но делает то же самое для списка веток:

br="mybranch yourbranch herbranch"
n=4
for br in $brs; do git log --oneline -n$n $br | awk '{print; system("git branch --contains "$1)}'; done

Проверяет только в локальных филиалах, которые были проверены.

git branch --contains $COMMIT_ID

Проверяет все ветки (локальные и удаленные, которые выбираются)

git branch -a --contains $COMMIT_ID

Обязательно загрузите пульт

git fetch origin

Ага, еще одна альтернатива:

git rev-list  | grep `git rev-parse `

This works best for me since it would also work on locally cached remote branches such as remotes/origin/master, on which git branch --contains won't work.

Это касается не только вопроса OP о «текущей ветке», но я считаю глупым задавать «любую версию» этого вопроса, поэтому я все равно решил опубликовать здесь.

Чтобы вывести список локальных веток, содержащих фиксацию:

git branch --contains

и перечислить все ветки, включая только удаленные, содержащие фиксацию:

git branch -a --contains

Аналогично, чтобы проверить, находится ли фиксация в конкретной ветке:

git log <ветка> | grep

и, если ветка не существует, локально префикс имени ветки с origin /

Извлеченный комментарий @torek в качестве ответа:

См. Предлагаемый дубликат, чтобы узнать, как найти все ветки, содержащие указанную фиксацию.

Чтобы узнать, содержит ли текущая ветка фиксация C, используйте команду "сантехника" git merge-base --is-ancestor. Текущая ветвь содержит C, если C является предком HEAD, поэтому:

if git merge-base --is-ancestor $hash HEAD; then
    echo I contain commit $hash
else
    echo I do not contain commit $hash
fi

(Примечание: в сценариях оболочки команда, выходящая из нуля, является «истиной», а команда, выходящая из ненулевого значения, - «ложь».)

git branch --contains  --points-at 

Он вернет имя целевой ветки, если в этой ветке существует идентификатор фиксации. В противном случае команда завершится ошибкой.

Получить список ветвей, содержащих конкретную фиксацию.

# get all the branches where the commit exists
$ git branch --contains 

Проверить, есть ли в ветке конкретный коммит.

# output the branch-name if the commit exists in that branch
$ git branch --contains  | grep 

Искать в ветке (например, feature) с точным соответствием.

$ git branch --contains  | grep -E '(^|\s)feature$'

например, Если у вас есть 3 локальных филиала, называемых feature, feature1, feature2, тогда

$ git branch --contains  | grep 'feature'

# output
feature
feature1
feature2

$ git branch --contains  | grep -E '(^|\s)feature$'

# output
feature     

Вы также можете искать в ветвях local и remote (используйте -a) или только в ветвях remote (используйте -r).

# search in both 'local' & 'remote' branches  
$ git branch -a --contains  | grep -E '(^|\s)feature$'

# search in 'remote' branches  
$ git branch -r --contains  | grep -E '(^|\s)feature$'

2022 WebDevInsider