У меня есть репозиторий git с несколькими ветвями.
Как узнать, какие ветки уже объединены в главную ветку?
У меня есть репозиторий git с несколькими ветвями.
Как узнать, какие ветки уже объединены в главную ветку?
git branch --merged master
перечисляет ветки, объединенные в master
git branch --merged
перечисляет ветки, объединенные в HEAD (т.е. конец текущей ветки)
git branch --no-merged
перечисляет ветки, которые не были объединены
По умолчанию это относится только к локальным ветвям. Флаг -a
будет показывать как локальные, так и удаленные ветки, а флаг -r
показывает только удаленные ветки.
Вы можете использовать команду git merge-base
чтобы найти последний общий коммит между двумя ветвями. Если этот коммит совпадает с заголовком вашей ветки, тогда ветка была полностью объединена.
Обратите внимание, что git branch -d
делает git branch -d
вещи, потому что откажется удалить ветку, которая еще не была полностью объединена.
Существует также графическое решение интерфейса. Просто введите
gitk --all
В новом окне приложения появится графическое представление всего вашего репо, где очень легко реализовать, если ветвь уже была объединена или нет.
По теме очистки удаленных веток
git branch -r | xargs -t -n 1 git branch -r --contains
В этом списке указаны все удаленные ветки, после которых удаленные ветки их последних SHA находятся внутри.
Это полезно, чтобы определить, какие удаленные ветки были объединены, но не удалены и которые не были объединены и, следовательно, затухают.
Если вы используете 'tig' (это похоже на gitk, но на основе терминала), вы можете
tig origin/feature/someones-decaying-feature
чтобы увидеть историю фиксации ветки без необходимости git checkout
Используйте 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.
Я использую следующую функцию 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
}
Вот мои приемы, когда мне нужно выяснить, была ли слита ветвь, даже если она была перебазирована, чтобы соответствовать современной основной ветке, что является распространенным сценарием для ветвей функций.
Ни один из этих подходов не является надежным, но я нашел их полезными много раз.
Используя визуальный инструмент, такой как gitk или TortoiseGit, или просто журнал git с --all, просмотрите историю, чтобы увидеть все слияния с основной веткой. Вы должны быть в состоянии определить, была ли эта конкретная ветвь объектов объединена или нет.
Если у вас есть хорошая привычка всегда удалять как локальную, так и удаленную ветки при объединении в ветки функций, то вы можете просто обновить и удалить удаленные ветки на другом компьютере, и ветки функций исчезнут.
Чтобы не забыть сделать это, я уже использую расширения потока 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
Если вы не всегда удаляете удаленную ветвь, вы все равно можете искать похожие коммиты, чтобы определить, была ли ветвь объединена или нет. Подводный камень здесь в том случае, если удаленная ветвь была переназначена до неузнаваемого, такого как фиксация при сжатии или изменение сообщений о коммите.
Примеры команд в основной ветке:
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"
}
Вот небольшая строка, которая сообщит вам, содержит ли ваша текущая ветвь данные из удаленной ветки 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
чтобы проверить, если я в курсе.