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


190

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 ramos

$ git diff topic master    <1>
$ git diff topic..master   <2>
$ git diff topic...master  <3>
  1. Alterações entre as dicas do tópico e as ramificações principais.
  2. O mesmo que acima.
  3. Alterações que ocorreram na ramificação principal desde quando a ramificação do tópico foi iniciada.

mas não está totalmente claro para mim.


Embora a pergunta não seja duplicada, esta resposta mostra graficamente o significado de ..e ...em git diffe seus diferentes significados em git log.
precisa saber é o seguinte

Respostas:


335

Como já criei essas imagens, pensei 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 que na resposta de manojlds .

O comando git diffnormalmente¹ mostra apenas a diferença entre os estados da árvore entre exatamente dois pontos no gráfico de confirmação. As notações ..e têm os seguintes significados:...git diff

Uma ilustração das diferentes maneiras de especificar confirmações 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 fooe bar. Por outro lado, git diff foo...barmostrará a diferença entre a "base de mesclagem" dos dois ramos e a ponta de bar. A "base de mesclagem" geralmente é a última confirmação em comum entre essas duas ramificações; portanto, este comando mostra as alterações introduzidas pelo seu trabalho bar, ignorando tudo o que foi feito foonesse meio tempo.

É tudo o que você precisa saber sobre as anotações ..e . Contudo......git diff


... uma fonte comum de confusão aqui é que ..e ...significar coisas sutilmente diferentes quando usado em um comando como git logque espera um conjunto de commits como um ou mais argumentos. (Todos esses comandos acabam usando git rev-listpara analisar uma lista de confirmações de seus argumentos.)

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

Uma ilustração das diferentes maneiras de especificar intervalos de confirmações para o log git

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

Bem, acho que tudo isso é um pouco confuso, e acho que os diagramas de gráfico de confirmação ajudam :)

¹ Digo apenas "normalmente", pois ao resolver conflitos de mesclagem, por exemplo, git diffmostramos uma mesclagem de três vias.


1
Eu gosto dos seus diagramas. Também inventei a minha há um tempo . Tenho algumas idéias para meus próprios git diffdiagramas que farei mais tarde.

34
Alguém notou? Os efeitos da ..e ...sensação revertida em git diff(em comparação com git rev-list)!
Robert Siemer

2
Você me teve em "Isso é tudo que você precisa saber [...]. No entanto ...". :-) O Git está cheio de coisas assim, onde notação e terminologia semelhantes significam coisas diferentes em contextos diferentes; obrigado por esclarecer isso tão bem.
ShreevatsaR

Obrigado por mencionar a lista de rev. Me deparei com essa pergunta enquanto procurava uma maneira de fazer o que rev-list faz via rev-parse.
May Physicist

"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 galhos foo e bar". O que exatamente você quer dizer com "diferença entre as pontas dos dois galhos"?
Asad Moosvi

60

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

Diff vs Log & .. vs ..


3
isso seria muito bom, se não tivesse tantas cores diferentes e operações de conjunto misturadas com ../ ...stuff. Por exemplo log A...B, não está claro se o comando retorna a interseção (parte branca do diagrama) ou o restante da união AB (verde). Seria mais direto ao ponto sem operandos definidos e com apenas uma cor.
Xealits

1
Deve ser realmente diff A..B<—> log A...B, ou seja, realmente difere com 2 pontos, corresponde ao log com 3 (!) Pontos? Ou há um erro de digitação na imagem. Observando como os pontos são codificados por cores, parece-me que há um erro de digitação na imagem. O canto inferior esquerdo: log A...Bdeve estar log A..B, certo (?). E log apenas para a direita ...não deve ser ...
KajMagnus 9/01/19

1
Olá DolphinDream, obrigado pela sua figura. Eu usá-lo como referência aqui: gitlab.com/tortoisegit/tortoisegit/issues/3427#note_227200695
Yue Lin Ho

1
@KajMagnus, na verdade, as cores vermelho / azul são usadas apenas para distinguir entre 2 pontos e 3 pontos (independentemente de serem usados ​​com diff ou log). O diagrama está correto. Na primeira coluna, o resultado do diff com 2 pontos é semelhante ao log com 3 pontos (daí o diagrama de propósito geral para começar). O diff com 2 pontos fornece as alterações de código em ambas as rotações até o ponto de divergência (ilustrado pelas bolhas verdes ao redor dos commits e as partes verdes dos diagramas de van) enquanto o log com 3 pontos fornece os logs de alterações (mensagens de confirmação) em ambas as rotações até o ponto de divergência.
DolphinDream 07/11/19

28

git diff foo master A diferença entre o topo (cabeça) compromete o foo e o mestre.

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

git diff foo...masterDifere do ancestral comum ( git merge-base foo master) de foo e master para a ponta do master. Em outras palavras, mostra apenas as alterações que o ramo principal 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 função a um arquivo, volte para a ramificação 'master' e remova uma linha do README e execute algo parecido com isto:

$ git diff master dev

Ele informará que uma função foi adicionada do primeiro arquivo e uma linha foi adicionada ao README. Por quê? Como no ramo, o README ainda tem a linha original, mas no 'master' você a removeu - comparar diretamente os snapshots parece que 'dev' a adicionou.

O que você realmente deseja comparar é o que 'dev' mudou desde que seus ramos divergiram. Para fazer isso, o Git tem uma pequena abreviação:

$ git diff master...dev

2
git diff foo ... mestre muda que branch master introduziu uma vez que é ancestral comum com foo
0fnt

@manojlds ok, pergunta tão diferente, se você estiver no ramo dev e confirmar suas alterações (a função) e enviar as alterações para um ramo dev remoto, isso significa que a alteração visível é apenas a função ou a função e o leia-me?
David David

Se não me engano, a solicitação de solicitação do GitHub usa o ponto triplo. Isso está certo?
Shaun Luttin 21/03/19

Link quebrado para a página de exemplo do GitHub.
K.-Michael Aye

6
git diff foo master

mostrará as diferenças entre o tópico e a ramificação principal naquele momento

git diff foo..master

isso também mostrará as diferenças entre o tópico e a ramificação principal naquele momento

git diff foo...master

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

então os 2 primeiros comandos são os mesmos e o último mostra apenas uma visão mais ampla no histórico do diff


1

árvore de log git

A imagem superior é equivalente à árvore do gráfico inferior

A0 <- A1 <- A2 <- A3 (master)
   \
    C0 <- C1 (test)

Uma imagem vale mais que mil palavras, a diferença entre .. ... ^é mostrada abaixo.

$ git log master..test
# output C0 C1

$ git log ^master test
# output C0 C1

$ git log master…test
# output A1 A2 A3 C0 C1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.