Imagine a seguinte história:
c---e---g--- feature
/ \
-a---b---d---f---h--- master
Como posso descobrir quando a consolidação "c" foi mesclada no mestre (ou seja, encontrar a consolidação de mesclagem "h")?
Seu exemplo mostra que a ramificação feature
ainda está disponível.
Nesse caso, h
é o último resultado de:
git log master ^feature --ancestry-path
Se a ramificação feature
não estiver mais disponível, você poderá mostrar os commits de mesclagem na linha do histórico entre c
e master
:
git log <SHA-1_for_c>..master --ancestry-path --merges
No entanto, isso também mostrará todas as mesclagens que ocorreram depois h
e entre e
e g
depois feature
.
Comparando o resultado dos seguintes comandos:
git rev-list <SHA-1_for_c>..master --ancestry-path
git rev-list <SHA-1_for_c>..master --first-parent
fornecerá o SHA-1 h
como a última linha em comum.
Se você o tiver disponível, poderá usar comm -1 -2
esses resultados. Se você estiver no msysgit, poderá usar o seguinte código perl para comparar:
perl -ne 'print if ($seen{$_} .= @ARGV) =~ /10$/' file1 file2
(código perl de http://www.cyberciti.biz/faq/command-to-display-lines-common-in-files/ , que retirou de "alguém do grupo de notícias comp.unix.shell").
Consulte a substituição do processo se você deseja torná-lo uma linha.
master
sido mesclado efeature
, imediatamente,feature
mescladomaster
como um avanço rápido (dica defeature
substituiçõesmaster
). Isso causaria o--first-parent
retorno do pai errado?comm -1 -2
mas não funcionou.comm
só funciona em linhas classificadas. (O perl one-liner funciona, embora eu não poderia lê-lo.)git find-merge h master
(não retorna nada, mas deve retornar h),git find-merge d master
(retorna f, mas deve retornar d),git find-merge c feature
(retorna e, mas deve retornar g).Adicione isto ao seu
~/.gitconfig
:Então você pode usar os aliases como este:
Para ver a mensagem do commit de mesclagem e outros detalhes, use
git show-merge
com os mesmos argumentos.(Com base na resposta de Gauthier . Agradecemos a Rosen Matev e javabrett por corrigir um problema
sort
.)fonte
sort -k2 | uniq -f1 -d | sort -n | tail -1 | cut -f2
não encontrar corretamente a última linha em comum. Aqui está um exemplo em que falha.16db9fef5c581ab0c56137d04ef08ef1bf82b0b7
aqui quando eu o executo na sua pasta, isso não é esperado? Em qual SO você está?29c40c3a3b33196d4e79793bd8e503a03753bad1
O git-get-merge irá localizar e mostrar o commit de mesclagem que você está procurando:
O comando segue os filhos do commit fornecido até que uma mesclagem em outro ramo (presumivelmente mestre) seja encontrada.
fonte
Ou seja, para resumir o post de Gauthier:
EDIT: porque usa substituição de processo "
<()
", não é compatível com POSIX, e pode não funcionar com seu shell. Funciona combash
ouzsh
embora.fonte
<()
não é compatível com POSIX. Você precisa usarbash
,zsh
ou uma concha apoiar substituição processo . Eu editei minha resposta de acordo.Eu precisava fazer isso e, de alguma forma, encontrei
git-when-merged
(o que realmente faz referência a essa pergunta do SO, mas Michael Haggerty nunca adicionou uma referência ao seu muito bom script Python aqui). Então agora eu tenho.fonte
Com base na grande resposta de Gauthier, não precisamos usar
comm
para comparar as listas. Como estamos procurando o último resultado no--ancestry-path
qual também está--first-parent
, podemos simplesmente saudar o último na saída do primeiro:Ou, para algo rápido e reutilizável, aqui está uma função para aparecer
.bashrc
:fonte
comm
não funcionou quando as entradas não foram classificadas.Para a multidão de Ruby, há coisas sem sentido . Muito fácil.
fonte
Eu uso o script bash abaixo, que coloco no caminho
~/bin/git-find-merge
. É baseado na resposta de Gauthier e na resposta do evilstreak com poucos ajustes para lidar com casos de canto.comm
lança quando as entradas não são classificadas.grep -f
funciona perfeitamente.Caixas de canto:
~/bin/git-find-merge
roteiro:O que me permite fazer isso:
Este script também está disponível no meu github .
fonte
Em seguida, procure a primeira mesclagem antes da confirmação.
fonte
Minha versão ruby da idéia do @ robinst, funciona duas vezes mais rápido (o que é importante ao procurar por commit muito antigo).
find-commit.rb
Você pode usá-lo assim:
fonte
Você pode tentar algo assim. A idéia é percorrer todos os commit de mesclagem e ver se o commit "c" é acessível a partir de um deles:
fonte
git rev-list <SHA-1_for_c>..master --ancestry-path --merges
Eu tive que fazer isso várias vezes (obrigado a todos que responderam a essa pergunta!) E acabei escrevendo um script (usando o método de Gauthier) que eu poderia adicionar à minha pequena coleção de utilitários git. Você pode encontrá-lo aqui: https://github.com/mwoehlke/git-utils/blob/master/bin/git-merge-point .
fonte