Quais são as diferenças entre o ponto duplo ".." e o ponto triplo "..." nos intervalos de confirmação do Git?
412
Alguns comandos Git assumem intervalos de confirmação e uma sintaxe válida é separar dois nomes de confirmação com dois pontos .., e outra sintaxe usa três pontos ....
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.
É 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:
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:
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:
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.
Respostas:
Depende se você está usando um
log
comando ou umdiff
comando. Nolog
caso, está naman git-rev-parse
documentação:O que basicamente significa que você obterá todos os commits que estão em um dos dois ramos, mas não nos dois.
No
diff
caso, está naman git-diff
documentação: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: nogit-diff
caso, é o mesmo que agit diff A B
e apenas diferencia A contra B. Nolog
caso, mostra todos os commits que estão em B, mas não em A.fonte
..
e...
é exatamente trocado por log e diff:log A..B
é alteração da base de mesclagem para B que é o quediff A...B
fazgit diff
.A...B
==A..B + B..A
?git log
isso é absolutamente simUsando intervalos de confirmação com o log do Git
Quando você usa intervalos de confirmação como
..
e...
comgit log
, a diferença entre eles é que, para os ramos A e B,mostrará todos os commits que B possui que A não possui , enquanto
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: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:Fazendo o intervalo de confirmação de três pontos
...
mais útilVocê pode tornar o intervalo de confirmação de pontos triplos
...
mais útil em um comando de log usando a--left-right
opção para mostrar quais confirmações pertencem a qual ramificação:Na saída acima, você verá que os commits que pertencem
master
são prefixados<
, enquanto os commit que pertencemorigin/master
sã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
fonte