Quais são as diferenças entre o ponto duplo “..” e o ponto triplo “…” nos intervalos de confirmação do diff do Git?

Quais são as diferenças entre os seguintes comandos ?:

git diff foo master # a git diff foo..master # b git diff foo...master # c 

O manual do diff fala sobre isso:

Comparando filiais

 $ git diff topic master  $ git diff topic..master  $ git diff topic...master  
  1. Alterações entre as dicas do tópico e as ramificações mestras.
  2. O mesmo que acima.
  3. Mudanças que ocorreram no branch master desde quando o branch de tópicos foi iniciado.

mas não é totalmente claro para mim.

Como eu já havia criado essas imagens, achei que valeria a pena usá-las em outra resposta, embora a descrição da diferença entre .. (ponto-ponto) e ... (ponto-ponto-ponto) seja essencialmente a mesma como na resposta dos manojls .

O comando git diff tipicamente mostra apenas a diferença entre os estados da tree entre exatamente dois pontos no gráfico de confirmação. As notações ... e ... no git diff possuem os seguintes significados:

Uma ilustração das diferentes maneiras de especificar commits para git diff

Em outras palavras, git diff foo..bar é exatamente o mesmo que git diff foo bar ; ambos mostrarão a diferença entre as pontas dos dois ramos foo e bar . Por outro lado, git diff foo...bar mostrará a diferença entre a “base de mesclagem” das duas ramificações e a ponta da bar . A “base de mesclagem” é geralmente o último commit em comum entre essas duas ramificações, então este comando mostrará as mudanças que seu trabalho na bar introduziu, enquanto ignora tudo o que foi feito no foo nesse meio tempo.

Isso é tudo que você precisa saber sobre o .. e ... notações no git diff . Contudo…


… uma fonte comum de confusão aqui é que .. e ... significam coisas sutilmente diferentes quando usadas em um comando como git log que espera um conjunto de commits como um ou mais argumentos. (Todos esses comandos acabam usando git rev-list para analisar uma lista de commits de seus argumentos.)

O significado de .. e ... para git log pode ser mostrado graficamente como abaixo:

Uma ilustração das diferentes maneiras de especificar intervalos de commits para o git log

Então, git rev-list foo..bar mostra tudo na bar ramificação que também não está no branch foo . Por outro lado, git rev-list foo...bar mostra todos os commits que estão em foo ou bar , mas não em ambos . O terceiro diagrama mostra apenas que, se você listar as duas ramificações, obterá as confirmações que estão em uma ou ambas.

Bem, eu acho tudo um pouco confuso, de qualquer forma, e acho que os diagramas de grafia de ajuda ajudam 🙂

¹ Eu só digo “tipicamente” desde quando resolvendo conflitos de mesclagem, por exemplo, o git diff mostrará uma mescla de três vias.

git diff foo master Diferente entre o topo (head) commits de foo e master.

git diff foo..master Outra maneira de fazer a mesma coisa.

git diff foo...master Dif do ancestral comum ( git merge-base foo master ) de foo e mestre a ponta do mestre. Em outras palavras, mostra apenas as mudanças que o branch master introduziu desde seu ancestral comum com foo.

Este exemplo do GitHub explica quando usar os dois:

Por exemplo, se você criar uma ramificação ‘dev’ e adicionar uma function a um arquivo, volte para a ramificação ‘principal’ e remova uma linha do README e, em seguida, execute algo assim:

 $ git diff master dev 

Ele irá dizer-lhe que uma function foi adicionada a partir do primeiro arquivo e uma linha foi adicionada ao README. Por quê? Porque na ramificação, o README ainda tem a linha original, mas em ‘master’ você o removeu – então comparar diretamente os instantâneos parece que ‘dev’ o adicionou.

O que você realmente quer comparar é o que ‘dev’ mudou desde que suas filiais divergiram. Para fazer isso, o Git tem um pequeno resumo:

 $ git diff master...dev 

Minha versão consolidada do .. vs com diff vs log

Dif vs log & .. vs ..

 git diff foo master 

mostrará as diferenças entre o tópico e a ramificação mestre naquele ponto no tempo

 git diff foo..master 

isso também mostrará as diferenças entre o tópico e a ramificação mestre nesse ponto no tempo

 git diff foo...master 

isso mostrará todas as diferenças entre quando o tópico foi feito a partir do ramo e depois

então os dois primeiros comandos são os mesmos e o último apenas mostra uma visão mais ampla no histórico de diferenças