Um git commit pode ter mais de 2 pais?

48

Em desta documentação é mencionado

Um objeto de confirmação pode ter qualquer número de pais.

Mas, pelo que entendi, o único caso em que um commit terá mais de um pai é quando uma mesclagem ocorreu e, nesse caso, haverá apenas dois pais. Então, minha pergunta é: um commit pode ter mais de 2 pais? Se assim for, quando?

Não posso dizer
fonte
11
github.com/torvalds/linux/commit/… - Eu não acho que o Github saiba como exibir um diff de 27 direções, mas fique à vontade para clonar o repositório e visualizá-lo.
user253751

Respostas:

43

Você pode usar o git merge para mesclar mais de um commit no seu ramo atual. De man git-merge(ou git help merge):

git-merge - Une dois ou mais históricos de desenvolvimento

O resultado será um comprometimento com mais de dois pais quando você fizer isso.

David Hammen
fonte
33
Uma mesclagem de mais de um ramo (ou seja, um commit com mais de dois pais) é coloquialmente conhecida como "mesclagem de polvo". Essa também é a fonte de inspiração para o logotipo e a mascote do GitHub, o gato de oito patas: foi originalmente chamado de Octopuss, mas foi renomeado como Octocat, mais amigável para as empresas.
Jörg W Mittag
4
Quais são as vantagens de mesclar três ou mais ramificações em uma única confirmação, em vez de uma série de confirmações?
Tor Klingberg 30/03
2
Histórico do @TorKlingberg Cleaner, mas não deixe de testar o produto final antes de enviar para o repsitory remoto.
Ferrybig
5
@KasunSiyambalapitiya - Existem vários exemplos em um repositório em particular no github . Um dos muitos polvos se funde nesse repo que envolve 27 pais .
precisa saber é o seguinte
1
@ JörgWMittag Literalmente nada disso é verdade. Fonte: trabalhou no GitHub por cinco anos.
gjtorikian
5

Sim, que tal 100k pais?

Aqui está um exemplo ao vivo do GitHub com uma mesclagem de 100k confirmações: https://github.com/cirosantilli/test-octopus-100k Gerado com este script .

Jogo de perguntas sobre cultura geral

Linus não gosta de confirmações com mais de 60 pais: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

É puxado, e está bom, mas há claramente um equilíbrio entre "a fusão de polvos é boa" e "Cristo, isso não é um polvo, é uma fusão de Cthulhu".

Dê uma olhada no formato do objeto de confirmação do Git

https://stackoverflow.com/questions/22968856/what-is-the-file-format-of-a-git-commit-object/37438460#37438460

A partir dessa análise, podemos ver que a lista de pais é uma lista arbitrária e separada de nova linha do tipo:

parent {parent_1_sha}
parent {parent_2_sha}
...
parent {parent_N_sha}

e assim um número arbitrário de pais é permitido.

Exemplo mínimo

Roteiro:

#!/usr/bin/env bash
set -eu

mkdir tmp
cd tmp
git init

touch root
git add .
git commit -m root
sha_root="$(git log -1 --format="%H")"

touch 1
git add .
git commit -m 1
sha1="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 2
git add .
git commit -m 2
sha2="$(git log -1 --format="%H")"

git reset --hard "$sha_root"
touch 3
git add .
git commit -m 3
sha3="$(git log -1 --format="%H")"

git merge -m merge "$sha1" "$sha2"

Resultado:

*-.   2d2a6c2 (HEAD -> master) merge
|\ \  
| | * 2300c18 2
| * | 7e096cb 1
| |/  
* | 50aa125 3
|/  
* a1e94fd root
Ciro Santilli adicionou uma nova foto
fonte
Não tenho certeza se o GitHub simplesmente não consegue lidar com uma mesclagem dessa magnitude ou se você o deixou como um repositório privado. Ou se o GitHub está apenas tendo algum problema não relacionado. Mas, independentemente disso, o link de mesclagem de 100k é um erro de 500 para mim.
8bittree
@ 8bittree ele não consegue lidar, repo privado seria 400 :-) github.com/isaacs/github/issues/1344
Ciro Santilli新疆改造中心法轮功六四事件
Qual é essa conexão entre a sandália barbada que veste os advogados da FOSS e a Lovecraft que eu encontro repetidamente?
Neutrino
3

Você pode especificar mais de uma ramificação ao mesclar.

Por exemplo:

git merge branch_A branch_B branch_C [...]

Então comprometer tem mais pais.

simhumileco
fonte