Como posso saber se uma ramificação já foi mesclada no mestre?

1140

Eu tenho um repositório git com várias ramificações.

Como posso saber quais ramificações já foram mescladas na ramificação mestre?

hectorsq
fonte

Respostas:

1793

git branch --merged masterlista ramificações mescladas no mestre

git branch --mergedlista 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 -asinalizador mostrará ramificações locais e remotas, e -rmostrará apenas as ramificações remotas.

hectorsq
fonte
2
Apenas uma observação, quando tentei verificar se uma ramificação remota foi mesclada, primeiro configurei uma ramificação de rastreamento local, identifiquei o status git branch --mergede excluí as ramificações local e remota.
Kenneth Kalmer 01/07
83
Aparentemente, git branch -a --merged/no-mergedtambém funciona, sem criar uma filial de rastreamento local no processo.
Fresskoma
70
Ou apenas git branch -r --merged/--no-mergedpara encontrar apenas ramificações remotas.
Asfand Qazi
5
Alguma maneira de excluir ramificações não imersas que foram realmente mescladas após o rebaseamento?
Ashfame 22/02
9
Observe que --merged/--no-mergedrecebe um argumento de confirmação opcional depois dele. Pelo menos na minha versão do git (1.9.1), adicionar o sinalizador -aou -rdepois dele gera um erro fatal. Adicione o -aou -r antes --(no-)merged .
Jonathan Gawrych
113

Você pode usar o git merge-basecomando 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 -disso já ocorre porque se recusará a excluir um ramo que ainda não foi completamente mesclado.

Greg Hewgill
fonte
3
A resposta da @ hari entra em mais detalhes sobre como usar isso.
Muhd
como podemos fazer isso automaticamente / programaticamente?
Alexander Mills
1
"ainda não foi completamente mesclado" ... completamente mesclado em qual ramo?
Alexander Mills
@AlexanderMills: no seu ramo atual.
22818 Greg Hewgill
2
@AlexanderMills: git branch -dse recusará a excluir um ramo que não foi mesclado no ramo atual. Não está excluindo a ramificação atual .
Greg Hewgill 16/07/2018
27

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

iberbeu
fonte
17
O que fica claro, requer a instalação de um aplicativo que não faz parte do gitcliente. No Ubuntu apt-get install gitk,.
metame
No macOS, se você tiver o Homebrew instalado, seria brew install git-gui, para entrar gitkna linha de comando.
program247365 29/04
24

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
}
Carl G
fonte
3
isso realmente não funciona. Se o ramo de origem tem sido incorporado ao ramo de destino já, e depois ramo de destino fica mais alguns commits, ele não funciona mais, mas eu não sei por que
Alexander Mills
1
veja a pergunta aqui: stackoverflow.com/questions/51355331/…
Alexander Mills
18

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

  1. Localizar o último hash de confirmação na ramificação principal
  2. Encontre o último hash de confirmação em uma "ramificação"
  3. Executar comando git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. Se a saída da etapa 3 for igual à saída da etapa 2, uma "ramificação" já foi mesclada no mestre.

Mais informações sobre git merge-base https://git-scm.com/docs/git-merge-base .

Hari
fonte
2
Eu acho que isso só informa se as dicas foram mescladas. Por exemplo, isso não informa se masterfoi mesclado branche mais quatro confirmações foram adicionadas branch.
Mkobit
Por que não git log -1 $(git merge-base base-branch feature-branch)e se você vê feature-branchna saída, sabe que eles são mesclados?
22718 Carl G
12

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

xxjjnn
fonte
3
Muito bem, esse homem! Muito útil depois de entender o que realmente está sendo exibido! O aplicativo GitHub precisa incorporar isso em uma exibição visual de suas ramificações, em vez de uma lista em ordem alfabética sem hierarquia!
CMash
12

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:

  • -aflag - (todos) mostrando ramificações remotas e locais
  • -rflag - (remoto) mostrando apenas ramificações remotas
  • <emptyFlag>- mostrando apenas filiais locais

por exemplo: git branch -r --merged master mostrará todos os repositórios remotos mesclados no master.

avivamg
fonte
5

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.

1 Mostrar log para todas as filiais

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.

2 Sempre remova a ramificação remota ao mesclar em uma ramificação de recurso

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

3 Pesquise por mensagem de confirmação

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.

  • Buscar e podar todos os controles remotos
  • Localizar mensagem da última confirmação na ramificação do recurso
  • Veja se um commit com a mesma mensagem pode ser encontrado na ramificação principal

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"
}
angularsen
fonte
@anjdeas - etapa 1 - como você sabe em quais filiais foram mescladas as principais. Eu estive olhando para as ferramentas de logs e GUI - e não consigo encontrar em nenhum lugar onde isso mostra explicitamente isso ???
The Huff
@TheHuff Tente o seguinte: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]"
angularsen 15/09/2015
@TheHuff No TortoiseGit, se você estiver no ramo principal, ele deve mostrar todas as mesclagens no principal.
Angularsen 15/09/2015
Obrigado - mas como sei o que é uma mesclagem? Estou assumindo que todos eles são confirmados - isso está certo?
The Huff
@TheHuff: Você deve ver visualmente dois fluxos / caminhos de commits mesclados em um único commit "downstream" (mais acima na exibição de log). Esse commit é um commit de mesclagem. Além disso, git logvocê pode adicionar --mergesapenas para mostrar confirmações de mesclagem. stackoverflow.com/a/25986615/134761
angularsen
4

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.

Radke
fonte