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

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

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

Ответы [ 8 ]

1584 голосов
/ 22 октября 2008

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

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

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

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

94 голосов
/ 22 октября 2008

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

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

25 голосов
/ 23 октября 2013

Существует также решение с графическим интерфейсом. Просто наберите

gitk --all

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

14 голосов
/ 22 марта 2018

Я использую следующую функцию 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
}
13 голосов
/ 13 октября 2016

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

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

Вот шаги

  1. Найти последний хеш коммита в основной ветке
  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

12 голосов
/ 23 октября 2013

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

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

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

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

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

tig origin/feature/someones-decaying-feature

для просмотра истории коммитов ветки без необходимости git checkout

5 голосов
/ 29 мая 2014

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

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

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

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

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

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

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

Пример создания / завершения ветви элемента

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

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

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

Пример команд в основной ветке:

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"
}
2 голосов
/ 15 ноября 2018

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

$ 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...