Ответы:
git branch --merged masterсписки веток объединены в мастер
git branch --mergedперечисляет ветви, объединенные в HEAD (т. е. верхушка текущей ветви)
git branch --no-merged перечисляет ветви, которые не были объединены
По умолчанию это относится только к локальным филиалам. -aФлаг будет показывать только локальные и удаленные ветви, а -rфлаг показывает только удаленные ветви.
git branch -a --merged/no-mergedтоже работает, без создания локальной ветки отслеживания в процессе.
git branch -r --merged/--no-mergedнайти только удаленные ветки.
--merged/--no-mergedпосле него берется необязательный аргумент коммита. По крайней мере, в моей версии git (1.9.1) добавление флага -aили -rпосле него приводит к фатальной ошибке. Добавьте -aили -r до --(no-)merged .
Вы можете использовать git merge-baseкоманду, чтобы найти последний общий коммит между двумя ветвями. Если этот коммит совпадает с вашим главой ветви, тогда ветка была полностью объединена.
Обратите внимание, что
git branch -dэто уже делает подобные вещи, потому что он откажется удалить ветку, которая еще не была полностью объединена.
git branch -dоткажется от удаления ветви, которая не была объединена с текущей веткой. Не удаляя текущую ветку.
Также есть решение с графическим интерфейсом. Просто введите
gitk --all
В новом окне приложения появится графическое представление всего вашего репо, где очень легко понять, была ли ветвь уже объединена или нет
gitклиента. На Ubuntu apt-get install gitk.
brew install git-guiбы попасть gitkв командную строку.
Я использую следующую функцию 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
}
Использование git merge-base <commit> <commit>.
Эта команда находит лучшего общего предка (ей) между двумя коммитами. И если общий предок идентичен последнему коммиту "ветки", то мы можем смело предположить, что эта "ветка" уже была объединена с мастером.
Вот шаги
git merge-base <commit-hash-step1> <commit-hash-step2>. Более подробная информация о git merge-base https://git-scm.com/docs/git-merge-base .
masterбыл ли слит в branch, а затем были добавлены еще 4 коммитов branch.
git log -1 $(git merge-base base-branch feature-branch)и если вы видите feature-branchв выводе, то знаете, что они объединены?
На тему очистки удаленных веток
git branch -r | xargs -t -n 1 git branch -r --contains
В этом списке перечислены все удаленные ветви, за которыми следуют последние удаленные SHA.
Это полезно для определения того, какие удаленные ветви были объединены, но не удалены, а какие не были объединены и, следовательно, разрушаются.
Если вы используете 'tig' (это похоже на gitk, но на основе терминала), то вы можете
tig origin/feature/someones-decaying-feature
чтобы увидеть историю коммитов в ветке, не имея git checkout
Чтобы проверить, какие ветви объединены в 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 покажет вам все удаленные репозитории, объединенные в мастер.
Вот мои приемы, когда мне нужно выяснить, была ли слита ветвь, даже если она была перебазирована, чтобы соответствовать современной основной ветке, что является распространенным сценарием для ветвей функций.
Ни один из этих подходов не является надежным, но я нашел их полезными много раз.
Используя визуальный инструмент, такой как gitk или TortoiseGit, или просто git log с --all, просмотрите историю, чтобы увидеть все слияния с основной веткой. Вы должны быть в состоянии определить, была ли эта конкретная ветвь объектов объединена или нет.
Если у вас есть хорошая привычка всегда удалять как локальную, так и удаленную ветви при объединении в ветви функций, то вы можете просто обновить и удалить удаленные ветки на другом компьютере, и ветви функций исчезнут.
Чтобы не забыть сделать это, я уже использую расширения потока 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
Если вы не всегда удаляете удаленную ветку, вы все равно можете искать похожие коммиты, чтобы определить, была ли ветка объединена или нет. Подводный камень здесь в том случае, если удаленная ветвь была переназначена до неузнаваемого, такого как фиксация при сжатии или изменение сообщений фиксации.
Примеры команд на главной ветке:
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"
}
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]"
git logвы можете добавить --mergesтолько показать коммитов слияния. stackoverflow.com/a/25986615/134761
Вот небольшая строка, которая позволит вам узнать, содержит ли ваша текущая ветвь данные из удаленной ветки 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
чтобы проверить, если я в курсе.
git branch --mergedи затем удалил локальную и удаленную ветки.