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

Respostas:

251

Depende se você está usando um logcomando ou um diffcomando. No logcaso, está na man git-rev-parsedocumentação:

Para excluir confirmações acessíveis de uma confirmação, é usada uma notação de prefixo ^. Por exemplo, ^ r1 r2 significa commit acessível a partir de r2, mas exclui os acessíveis a partir de r1.

Essa operação de conjunto aparece com tanta frequência que existe uma abreviação para isso. Quando você possui dois commits r1 e r2 (nomeados de acordo com a sintaxe explicada em ESPECIFICANDO REVISÕES acima), você pode solicitar commits acessíveis a partir de r2, excluindo aqueles acessíveis a partir de r1 por "^ r1 r2" e pode ser escrito como "r1..r2".

Uma notação semelhante "r1 ... r2" é chamada de diferença simétrica de r1 e r2 e é definida como "r1 r2 - e não $ (git merge-base - all r1 r2)". É o conjunto de confirmações que é alcançável a partir de um de r1 ou r2, mas não de ambos.

O que basicamente significa que você obterá todos os commits que estão em um dos dois ramos, mas não nos dois.

No diffcaso, está na man git-diffdocumentação:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

O que é um pouco confuso. Basicamente, significa que mostra apenas as diferenças nesse ramo em comparação com outro ramo: ele procura o último commit comum com o primeiro commit que você deu e depois difere o segundo commit para isso. É uma maneira fácil de ver quais alterações são feitas nesse ramo, em comparação com esse ramo, sem observar apenas as alterações nesse ramo.

O ..é um pouco mais simples: no git-diffcaso, é o mesmo que a git diff A Be apenas diferencia A contra B. No logcaso, mostra todos os commits que estão em B, mas não em A.

Pieter
fonte
31
É bastante ridículo como o significado da ..e ...é exatamente trocado por log e diff: log A..Bé alteração da base de mesclagem para B que é o que diff A...Bfaz
phiresky
1
@phiresky Sim, isso é realmente uma má usabilidade. Eu recomendo não usar as notações de ponto para git diff.
wisbucky
2
Isso significa A...B== A..B + B..A?
Danon
2
@Danon para git logisso é absolutamente sim
maoizm
659

Usando intervalos de confirmação com o log do Git

Quando você usa intervalos de confirmação como ..e ...com git log, a diferença entre eles é que, para os ramos A e B,

git log A..B

mostrará todos os commits que B possui que A não possui , enquanto

git log A...B

irá mostrar-lhe ambos os commits que um tem e que B não têm, e os commits que B tem que A não tem, ou em outras palavras, ele irá filtrar todos os commits que ambos A e B share, mostrando apenas os commits que eles não compartilham .

Visualização com diagramas de Venn e árvores de confirmação

Aqui está uma representação visual de git log A..B. As confirmações que a ramificação B contém que não existem em A são retornadas pelo intervalo de confirmação, destacadas em vermelho no diagrama de Venn e circuladas em azul na árvore de confirmação:

 Diagrama "git log A..B"Árvore 1

Estes são os diagramas para git log A...B. Observe que as confirmações compartilhadas por ambas as ramificações não são retornadas pelo comando:

 Diagrama "git log A ... B"Árvore 2

Fazendo o intervalo de confirmação de três pontos ... mais útil

Você pode tornar o intervalo de confirmação de pontos triplos ...mais útil em um comando de log usando a --left-rightopção para mostrar quais confirmações pertencem a qual ramificação:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

Na saída acima, você verá que os commits que pertencem mastersão prefixados <, enquanto os commit que pertencem origin/mastersão prefixados >.

Usando intervalos de confirmação com Git Diff

Algum dia eu poderia adicionar minha própria explicação sobre como os intervalos de confirmação funcionam git diff, mas por enquanto, você pode querer verificar quais são as diferenças entre ponto duplo ".." e ponto triplo "..." no commit do Git diff gamas? .

Veja também

Comunidade
fonte
35
Esta resposta realmente explica a diferença com um texto conciso, exemplos e imagens. Gosto muito mais do que a resposta atualmente mais votada, que apenas cita a documentação pouco clara. (tl; dr graças a esta resposta que eu realmente compreender a diferença.)
aerique
4
@ Cupcake você poderia adicionar o significado off ... em diff git?
Marius
1
@ Marius, na verdade, agora que você mencionou, vou seguir em frente e vincular a essa outra pergunta na minha resposta, para futuros leitores como você.
2
Isso não é realmente o oposto? dig diff a..b é ALL diffs, ou basicamente o mesmo que git diff a b. Considerando que git dif a ... b é SOMENTE as alterações que b fez desde a ramificação de a.
wejrowski
2
Pelo menos para o git log. Para git diff talvez as coisas se invertem: stackoverflow.com/questions/7251477/...
Benjamin Atkin