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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

gitk --all

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

Ответ 4

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

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

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

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

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

tig origin/feature/someones-decaying-feature

чтобы увидеть историю фиксации ветки без необходимости git checkout

Ответ 5

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

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

Ниже приведены шаги

  • Найти последний хеш-фиксацию на главной ветке
  • Найти последний хэш фиксации на "ветке"
  • Запустить команду git merge-base <commit-hash-step1> <commit-hash-step2>.
  • Если вывод шага 3 будет таким же, как вывод на шаге 2, то "ветвь" уже была объединена с мастером.

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

Ответ 6

Я использую следующую функцию bash, такую как: git-is-merged develop feature/new-feature New 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
}

Ответ 7

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

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

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

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

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

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

Чтобы не забыть сделать это, я уже использую расширения потока git (редакция AVH) для локального создания и объединения моих функциональных веток, поэтому я добавил следующий обработчик потока 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/Крючки/пост-флоу-функция-отделка

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

Ответ 8

Вот небольшая строка, которая сообщит вам, содержит ли ваша текущая ветвь данные из удаленной ветки 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

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