Как я могу узнать, была ли ветка уже объединена с мастером?

1140

У меня есть git-репозиторий с несколькими ветками.

Как я могу узнать, какие ветви уже объединены с основной веткой?

hectorsq
источник

Ответы:

1793

git branch --merged masterсписки веток объединены в мастер

git branch --mergedперечисляет ветви, объединенные в HEAD (т. е. верхушка текущей ветви)

git branch --no-merged перечисляет ветви, которые не были объединены

По умолчанию это относится только к локальным филиалам. -aФлаг будет показывать только локальные и удаленные ветви, а -rфлаг показывает только удаленные ветви.

hectorsq
источник
2
Еще одно замечание: когда я попытался увидеть, была ли удаленная ветвь объединена, я сначала настроил локальную ветвь отслеживания, идентифицировал состояние с помощью git branch --mergedи затем удалил локальную и удаленную ветки.
Кеннет Калмер
83
Видимо, git branch -a --merged/no-mergedтоже работает, без создания локальной ветки отслеживания в процессе.
фресскома
70
Или просто git branch -r --merged/--no-mergedнайти только удаленные ветки.
Асфанд Кази
5
Любой способ удалить несжатые ветви, которые были фактически объединены после перебазирования?
Ashfame
9
Обратите внимание, что --merged/--no-mergedпосле него берется необязательный аргумент коммита. По крайней мере, в моей версии git (1.9.1) добавление флага -aили -rпосле него приводит к фатальной ошибке. Добавьте -aили -r до --(no-)merged .
Джонатан Гаврич
113

Вы можете использовать git merge-baseкоманду, чтобы найти последний общий коммит между двумя ветвями. Если этот коммит совпадает с вашим главой ветви, тогда ветка была полностью объединена.

Обратите внимание, что git branch -dэто уже делает подобные вещи, потому что он откажется удалить ветку, которая еще не была полностью объединена.

Грег Хьюгилл
источник
3
Ответ @ hari более подробно о том, как это использовать.
Чт
как мы можем сделать это автоматически / программно?
Александр Миллс
1
"еще не полностью слил" ... полностью слился в какую ветку?
Александр Миллс
@AlexanderMills: в вашу текущую ветку.
Грег Хьюгилл
2
@AlexanderMills: git branch -dоткажется от удаления ветви, которая не была объединена с текущей веткой. Не удаляя текущую ветку.
Грег Хьюгилл
27

Также есть решение с графическим интерфейсом. Просто введите

gitk --all

В новом окне приложения появится графическое представление всего вашего репо, где очень легко понять, была ли ветвь уже объединена или нет

iberbeu
источник
17
Что должно быть понятно, требует установки приложения, которое не является частью gitклиента. На Ubuntu apt-get install gitk.
метам
На macOS, если у вас установлен Homebrew, можно было brew install git-guiбы попасть gitkв командную строку.
program247365
24

Я использую следующую функцию Bash, как: git-is-merged develop feature/new-feature

git-is-merged () {
  merge_destination_branch=$1
  merge_source_branch=$2

  merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
  merge_source_current_commit=$(git rev-parse $merge_source_branch)
  if [[ $merge_base = $merge_source_current_commit ]]
  then
    echo $merge_source_branch is merged into $merge_destination_branch
    return 0
  else
    echo $merge_source_branch is not merged into $merge_destination_branch
    return 1
  fi
}
Карл Дж
источник
3
это на самом деле не работает. Если исходная ветвь уже была объединена с целевой ветвью, а затем целевая ветвь получает еще несколько коммитов, она больше не работает, но я не знаю почему
Александр Миллс
1
см. вопрос здесь: stackoverflow.com/questions/51355331/…
Александр Миллс
18

Использование git merge-base <commit> <commit>.

Эта команда находит лучшего общего предка (ей) между двумя коммитами. И если общий предок идентичен последнему коммиту "ветки", то мы можем смело предположить, что эта "ветка" уже была объединена с мастером.

Вот шаги

  1. Найти последний хеш коммита в ветке master
  2. Найти последний хеш коммита на "ветке"
  3. Запустить команду git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Если выходные данные шага 3 совпадают с выходными данными шага 2, тогда «ветвь» уже объединена с ведущей.

Более подробная информация о git merge-base https://git-scm.com/docs/git-merge-base .

Хари
источник
2
Я думаю, что это скажет вам только, если советы объединены. Например, это не скажет вам, masterбыл ли слит в branch, а затем были добавлены еще 4 коммитов branch.
mkobit
Почему нет git log -1 $(git merge-base base-branch feature-branch)и если вы видите feature-branchв выводе, то знаете, что они объединены?
Карл Джи
12

На тему очистки удаленных веток

git branch -r | xargs -t -n 1 git branch -r --contains

В этом списке перечислены все удаленные ветви, за которыми следуют последние удаленные SHA.

Это полезно для определения того, какие удаленные ветви были объединены, но не удалены, а какие не были объединены и, следовательно, разрушаются.

Если вы используете 'tig' (это похоже на gitk, но на основе терминала), то вы можете

tig origin/feature/someones-decaying-feature

чтобы увидеть историю коммитов в ветке, не имея git checkout

xxjjnn
источник
3
Молодец этот человек! Очень полезно, когда вы разберетесь с тем, что он на самом деле отображает! Приложение GitHub должно включать это в визуальное отображение ваших ветвей, а не в алфавитном списке без иерархии!
CMash
12

Чтобы проверить, какие ветви объединены в master, вы должны использовать эти команды:

  • git branch <flag[-r/-a/none]> --merged master список всех веток, объединенных в мастер.
  • git branch <flag[-r/-a/none]> --merged master | wc -l Подсчитать количество всех веток, объединенных в мастер.

Флаги являются:

  • -aфлаг - (все) показывает удаленные и локальные ветви
  • -rфлаг - (удаленный) показывает только удаленные ветви
  • <emptyFlag>- показывает только локальные филиалы

например: git branch -r --merged master покажет вам все удаленные репозитории, объединенные в мастер.

avivamg
источник
5

Вот мои приемы, когда мне нужно выяснить, была ли слита ветвь, даже если она была перебазирована, чтобы соответствовать современной основной ветке, что является распространенным сценарием для ветвей функций.

Ни один из этих подходов не является надежным, но я нашел их полезными много раз.

1 Показать журнал для всех филиалов

Используя визуальный инструмент, такой как gitk или TortoiseGit, или просто git log с --all, просмотрите историю, чтобы увидеть все слияния с основной веткой. Вы должны быть в состоянии определить, была ли эта конкретная ветвь объектов объединена или нет.

2 Всегда удаляйте удаленную ветвь при слиянии в ветке объектов

Если у вас есть хорошая привычка всегда удалять как локальную, так и удаленную ветви при объединении в ветви функций, то вы можете просто обновить и удалить удаленные ветки на другом компьютере, и ветви функций исчезнут.

Чтобы не забыть сделать это, я уже использую расширения потока git (редакция AVH) для локального создания и объединения моих функциональных веток, поэтому я добавил следующую ловушку git flow, чтобы спросить меня, хочу ли я также автоматически удалить удаленную ветку.

Пример создания / завершения ветки объектов

554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'

Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'

Now, start committing on your feature. When done, use:

     git flow feature finish tmp

555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.

[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.

Deleted branch feature/tmp (was 02a3356).

Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'

556 Andreas:ScDesktop (develop)$

.git / Крючки / пост-флоу-функция-отделка

NAME=$1
ORIGIN=$2
BRANCH=$3

# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty

while true; do
  read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
  if [ "$yn" = "" ]; then
    yn='Y'    
  fi
  case $yn in
      [Yy] ) 
        echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
        git push $2 :$3; 
        break;;
      [Nn] ) 
        echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
        break;;
      * ) echo "Please answer y or n for yes or no.";;
  esac
done

# Stop reading user input (close STDIN)
exec <&-
exit 0

3 Поиск по сообщению фиксации

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

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

Примеры команд на главной ветке:

gru                   
gls origin/feature/foo
glf "my message"

В моем конфиге bash .profile

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}
angularsen
источник
@anjdeas - шаг 1 - как узнать, какие ветви были объединены в основную. Я смотрел на журналы и инструменты GUI - и не могу найти где-нибудь, где это явно показывает это ???
Хафф
@TheHuff Попробуйте это:git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
angularsen
@TheHuff В TortoiseGit, если вы находитесь на основной ветке, она должна показать все слияния с основной.
angularsen
Спасибо - но откуда мне знать, что такое слияние? Я предполагаю, что они все коммиты - это правильно?
Хафф
@TheHuff: вы должны визуально увидеть, как два потока / пути коммитов объединяются в один коммит "вниз по течению" (выше в журнале). Этот коммит является коммитом слияния. Кроме того, git logвы можете добавить --mergesтолько показать коммитов слияния. stackoverflow.com/a/25986615/134761
angularsen
4

Вот небольшая строка, которая позволит вам узнать, содержит ли ваша текущая ветвь данные из удаленной ветки origin / master или нет:

$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master

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

Чтобы обобщить этот тест, я добавил следующий псевдоним в мой ~ / .gitconfig:

[alias]
   current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

Тогда я могу позвонить:

$ git current origin/master

чтобы проверить, если я в курсе.

Радке
источник