Respostas:
git branch --merged master
lista ramificações mescladas no mestre
git branch --merged
lista ramificações fundidas em HEAD (ou seja, dica da ramificação atual)
git branch --no-merged
lista ramificações que não foram mescladas
Por padrão, isso se aplica apenas às ramificações locais. O -a
sinalizador mostrará ramificações locais e remotas, e -r
mostrará apenas as ramificações remotas.
git branch -a --merged/no-merged
também funciona, sem criar uma filial de rastreamento local no processo.
git branch -r --merged/--no-merged
para encontrar apenas ramificações remotas.
--merged/--no-merged
recebe um argumento de confirmação opcional depois dele. Pelo menos na minha versão do git (1.9.1), adicionar o sinalizador -a
ou -r
depois dele gera um erro fatal. Adicione o -a
ou -r
antes --(no-)merged
.
Você pode usar o git merge-base
comando para encontrar o último commit comum entre os dois ramos. Se esse commit for igual ao seu chefe de ramificação, ele será completamente mesclado.
Observe que
git branch -d
isso já ocorre porque se recusará a excluir um ramo que ainda não foi completamente mesclado.
git branch -d
se recusará a excluir um ramo que não foi mesclado no ramo atual. Não está excluindo a ramificação atual .
Também existe uma solução de interface gráfica. Apenas digite
gitk --all
Uma nova janela do aplicativo solicitará uma representação gráfica de todo o seu repositório, onde é muito fácil perceber se um ramo já foi mesclado ou não
git
cliente. No Ubuntu apt-get install gitk
,.
brew install git-gui
, para entrar gitk
na linha de comando.
Estou usando a seguinte função bash como: 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
}
Use git merge-base <commit> <commit>
.
Este comando encontra os melhores ancestrais comuns entre dois commits. E se o ancestral comum for idêntico ao último commit de um "branch", podemos assumir com segurança que um "branch" já foi mesclado no master.
Aqui estão os passos
git merge-base <commit-hash-step1> <commit-hash-step2>
. Mais informações sobre git merge-base https://git-scm.com/docs/git-merge-base .
master
foi mesclado branch
e mais quatro confirmações foram adicionadas branch
.
git log -1 $(git merge-base base-branch feature-branch)
e se você vê feature-branch
na saída, sabe que eles são mesclados?
Sobre o tópico de limpeza de filiais remotas
git branch -r | xargs -t -n 1 git branch -r --contains
Isso lista cada ramificação remota seguida pelas ramificações remotas em que os SHAs mais recentes estão.
Isso é útil para discernir quais ramificações remotas foram mescladas, mas não excluídas, e quais não foram mescladas e, portanto, estão se deteriorando.
Se você estiver usando 'tig' (é como o gitk, mas baseado em terminal), poderá
tig origin/feature/someones-decaying-feature
para ver o histórico de consolidação de uma ramificação sem precisar sair do git
Para verificar quais ramificações são mescladas no mestre, você deve usar estes comandos:
git branch <flag[-r/-a/none]> --merged master
lista de todos os ramos mesclados no mestre.git branch <flag[-r/-a/none]> --merged master | wc -l
número de contagem de todas as ramificações mescladas no mestre.Os sinalizadores são:
-a
flag - (todos) mostrando ramificações remotas e locais-r
flag - (remoto) mostrando apenas ramificações remotas<emptyFlag>
- mostrando apenas filiais locaispor exemplo: git branch -r --merged master
mostrará todos os repositórios remotos mesclados no master.
Aqui estão minhas técnicas quando preciso descobrir se uma ramificação foi mesclada, mesmo que possa ter sido reestruturada para estar atualizada com a ramificação principal, que é um cenário comum para ramificações de recursos.
Nenhuma dessas abordagens é à prova de idiotas, mas eu as achei úteis muitas vezes.
Usando uma ferramenta visual como gitk ou TortoiseGit, ou simplesmente git log com --all, percorra o histórico para ver todas as mesclagens na ramificação principal. Você poderá identificar se esse ramo de recurso específico foi mesclado ou não.
Se você costuma remover sempre as ramificações local e remota ao mesclar uma ramificação de recurso, basta atualizar e remover controles remotos no outro computador, e as ramificações de recursos desaparecem.
Para ajudar a lembrar de fazer isso, eu já estou usando extensões de fluxo git (edição AVH) para criar e mesclar minhas ramificações de recursos localmente, então adicionei o seguinte gancho de fluxo git para me perguntar se eu também quero remover automaticamente a ramificação remota.
Ramificação de recurso de criação / conclusão de exemplo
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
Se você nem sempre remover a ramificação remota, ainda poderá procurar confirmações semelhantes para determinar se a ramificação foi mesclada ou não. A armadilha aqui é se a ramificação remota foi redimensionada para o irreconhecível, como esmagar confirmações ou alterar mensagens de confirmação.
Comandos de exemplo na ramificação principal:
gru
gls origin/feature/foo
glf "my message"
Na minha configuração 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
você pode adicionar --merges
apenas para mostrar confirmações de mesclagem. stackoverflow.com/a/25986615/134761
Aqui está uma pequena linha que permitirá que você saiba se sua filial atual incorpora ou está sem dados de uma origem / filial remota:
$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master
Me deparei com essa pergunta ao trabalhar em um ramo de recursos e frequentemente querendo ter certeza de que o trabalho mais recente foi incorporado ao meu próprio ramo de trabalho separado.
Para generalizar esse teste, adicionei o seguinte alias ao meu ~ / .gitconfig:
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
Então eu posso ligar para:
$ git current origin/master
para verificar se eu sou atual.
git branch --merged
e excluí as ramificações local e remota.