Um commit do git pode ter mais de 2 pais?

40

Em esta documentação é mencionada

A commit object may have any number of parents.

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

    
por Can't Tell 30.03.2016 / 04:31
fonte

3 respostas

38

Você pode usar o git merge para mesclar mais de um commit em sua ramificação atual. De man git-merge (ou git help merge ):

git-merge - Join two or more development histories together

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

    
por 30.03.2016 / 04:42
fonte
3

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

Por exemplo:

git merge branch_A branch_B branch_C [...]

Em seguida, o commit tem mais pais.

    
por 28.08.2017 / 11:00
fonte
2

Sim, e quanto a 100 mil pais?

Aqui está um exemplo do GitHub ao vivo com uma mescla de 100k confirmações: link Gerado com este script .

Trivialidades

Linus não gosta de commits com mais de 60 pais: link

It's pulled, and it's fine, but there's clearly a balance between "octopus merges are fine" and "Christ, that's not an octopus, that's a Cthulhu merge".

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

link

A partir dessa análise, podemos ver que a lista de pais é uma lista separada arbitrariamente de 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

Script:

#!/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"

Saída:

*-.   2d2a6c2 (HEAD -> master) merge
|\ \  
| | * 2300c18 2
| * | 7e096cb 1
| |/  
* | 50aa125 3
|/  
* a1e94fd root
    
por 04.09.2018 / 14:45
fonte

Tags