Un commit Git può avere più di 2 genitori?

40

In questa documentazione è menzionata

A commit object may have any number of parents.

Ma dalla mia comprensione, l'unico caso in cui un commit avrà più di 1 genitore è quando è avvenuta un'unione, e in quel caso ci saranno solo due genitori. Quindi la mia domanda è, può un impegno avere più di 2 genitori? Se sì, quando?

    
posta Can't Tell 30.03.2016 - 04:31
fonte

3 risposte

38

Puoi usare git merge per unire più di un commit nel tuo ramo attuale. Da man git-merge (o git help merge ):

git-merge - Join two or more development histories together

Il risultato sarà un commit con più di due genitori quando lo fai.

    
risposta data 30.03.2016 - 04:42
fonte
3

È possibile specificare più di un ramo durante l'unione.

Ad esempio:

git merge branch_A branch_B branch_C [...]

Quindi il commit ha più genitori.

    
risposta data 28.08.2017 - 11:00
fonte
2

Sì, che ne dici di 100k genitori?

Ecco un esempio di GitHub dal vivo con un'unione di 100k commit: link Generato con questo script .

Trivia

A Linus non piacciono i commit con più di 60 genitori: 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".

Dai un'occhiata al formato dell'oggetto Git commit

link

Da quell'analisi, possiamo vedere che l'elenco dei genitori è un elenco arbitrario di nuova riga separato di tipo:

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

e quindi è consentito un numero arbitrario di genitori.

Esempio minimo

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"

Output:

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

Leggi altre domande sui tag