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

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

Как узнать, какие ветки уже объединены 9X_git-commands в основную ветку?

1381
0
11
Общее количество ответов: 11

Ответ #1

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

git branch --merged master перечисляет ветки, объединенные в главную

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

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

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

2124
7

  • Очевидно, `git branch -a --merged / no-merged` также работает, без со ...

Ответ #2

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

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

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

141
4

  • @AlexanderMills: `git branch -d` откажется удалить ветку, которая не была объединена с текущей веткой. Не у ...

Ответ #3

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

Чтобы проверить, какие ветки объединены 9X_git-commands в мастер, вы должны использовать следующие 9X_git команды:

  • git branch --merged master список всех веток, объединенных в главную.
  • git branch --merged master | wc -l подсчитать количество всех ветвей, объединенных в мастер.

Флаги:

  • -a флаг - (все), показывающий удаленные и локальные ветки.
  • -r флаг - (удаленный) показывает только удаленные ветки
  • - отображение только локальных веток

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

41
0

Ответ #4

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

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

gitk --all

Новое окно приложения предложит графическое 9X_git представление всего вашего репо, где очень 9X_git-commands легко понять, была ли ветка уже объединена 9X_git-commands или нет

34
1

  • Что для ясности, требует установки приложения, которое не является частью клиента `gi ...

Ответ #5

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

Я использую следующую функцию 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
}

9X_git-commands

31
2

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

Ответ #6

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

Используйте git merge-base .

Эта команда находит лучших 9X_git-commands общих предков между двумя коммитами. И если 9X_git-commands общий предок идентичен последней фиксации 9X_git-commands «ветки», то мы можем с уверенностью предположить, что 9X_git-commands эта «ветка» уже была объединена с мастером.

Вот шаги

  1. Найти хэш последней фиксации в главной ветке
  2. Найти хэш последней фиксации в «ветке»
  3. Выполните команду git merge-base .
  4. Если результат шага 3 такой же, как результат шага 2, значит, «ветвь» уже была объединена с мастером.

Дополнительная 9X_git информация о git merge-base https://git-scm.com/docs/git-merge-base.

28
1

  • Я думаю, это скажет вам, только если советы будут объединены. Например, это не скажет вам, был ли `master` объединен с` branch`, ...

Ответ #7

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

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

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

Здесь перечислены все удаленные ветки, за 9X_git которыми следует, в каких удаленных ветвях 9X_git находятся их последние SHA.

Это полезно для 9X_git-commands определения того, какие удаленные ветки 9X_git были объединены, но не удалены, а какие 9X_git-commands не были объединены и, таким образом, распадаются.

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

tig origin/feature/someones-decaying-feature

чтобы увидеть 9X_git-commands историю коммитов ветки без использования 9X_git git checkout

19
1

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

Ответ #8

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

Я использую git for-each-ref, чтобы получить список ветвей, которые 9X_git-commands либо объединены, либо не объединены в данную 9X_git удаленную ветку (например, origin/integration)

Перебрать все 9X_git-commands ссылки, соответствующие , и показать их в соответствии с заданным после сортировки в соответствии с заданным набором .

Примечание: замените origin/integration на integration, если вы предпочитаете использовать git pull вместо git fetch.

Список локальных веток, объединенных в удаленную ветку origin/integration

git for-each-ref --merged=origin/integration --format="%(refname:short)" refs/heads/
#                ^                           ^                           ^
#                A                           B                           C
branch1
branch2
branch3
branch4

A: возьмите только 9X_git-commands ветки, объединенные в удаленную ветку origin/integration
B: напечатайте 9X_git название ветки
C: смотрите только ссылки 9X_git-commands heads (т. Е. Ветки)

Список локальных веток, НЕ объединенных в удаленную ветку origin/integration

git for-each-ref --no-merged=origin/integration --format="%(committerdate:short) %(refname:short)" --sort=committerdate refs/heads
#                ^                              ^                                                  ^                    ^
#                A                              B                                                  C                    D
2020-01-14 branch10
2020-01-16 branch11
2020-01-17 branch12
2020-01-30 branch13

A: возьмите только ветки, НЕ 9X_git-commands объединенные в удаленную ветку origin/integration
B: вывести 9X_git-commands имя ветки вместе с датой последней фиксации 9X_git
C: отсортировать вывод по дате фиксации 9X_git-commands
D: смотрите только на heads ссылки (то есть 9X_git-commands ветки)

13
0

Ответ #9

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

Вот небольшое однострочное сообщение, которое 9X_git сообщит вам, включает ли ваша текущая ветвь 9X_git-commands данные из удаленной исходной / главной ветки 9X_git или нет:

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

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

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

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

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

$ git current origin/master

, чтобы 9X_git проверить, действую ли я.

6
0

Ответ #10

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

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

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

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

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

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

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

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

Пример создания / завершения функциональной ветви

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 / hooks / post-flow-feature-finish

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 Поиск по сообщению фиксации

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

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

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

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"
}

5
0

Ответ #11

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

Чтобы проверить, объединена ли исходная 9X_git-commands ветка с основной веткой, можно использовать 9X_git следующую команду bash:

git merge-base --is-ancestor  master && echo "merged" || echo "not merged"

5
0