Un commesso git può avere più di 2 genitori?


48

In questa documentazione è menzionato

Un oggetto commit può avere un numero qualsiasi di genitori.

Ma dalla mia comprensione, l'unico caso in cui un commit avrà più di 1 genitore è quando si è verificata una fusione, e in quel caso ci saranno solo due genitori. Quindi la mia domanda è: un commit può avere più di 2 genitori? In tal caso, quando?


11
github.com/torvalds/linux/commit/… - Non credo che Github sappia come visualizzare un diff a 27 vie, ma mi sento libero di clonare il repository e vederlo tu stesso.
user253751

Risposte:


43

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

git-merge - Unisci due o più storie di sviluppo insieme

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


33
Una fusione di più di un ramo (ovvero un impegno con più di due genitori) è colloquialmente nota come "fusione di polpo". Questa è anche la fonte di ispirazione per il logo e la mascotte di GitHub, il gatto a otto zampe: originariamente si chiamava Octopuss, ma fu ribattezzato Octocat più adatto alle aziende.
Jörg W Mittag,

4
Quali sono i vantaggi della fusione di tre o più filiali in un unico commit, anziché in una serie di commit?
Tor Klingberg,

2
@TorKlingberg Storia più pulita, ma assicurati di testare il prodotto finale prima di passare al repository remoto.
Ferrybig

5
@KasunSiyambalapitiya - Ci sono più esempi in un repository github particolare . Uno dei tanti polpi si fonde in quel repository che coinvolge 27 genitori .
David Hammen,

1
@ JörgWMittag Letteralmente nulla di tutto ciò è vero. Fonte: ha lavorato presso GitHub per cinque anni.
gjtorikian,

5

Sì, che ne dici di 100k genitori?

Ecco un esempio GitHub live con una fusione di commit di 100k: https://github.com/cirosantilli/test-octopus-100k Generato con questo script .

banalità

Linus non ama i commit con più di 60 genitori: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

È tirato, e va bene, ma c'è chiaramente un equilibrio tra "i polpi si fondono bene" e "Cristo, non è un polpo, è una fusione di Cthulhu".

Dai un'occhiata al formato per l'oggetto commit Git

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

Da tale analisi, possiamo vedere che l'elenco di genitori è un elenco di tipo separato da una nuova riga arbitraria:

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"

Produzione:

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

Non sono sicuro che GitHub non sia in grado di gestire un'unione di tale entità o se l'hai lasciato come repository privato. O se GitHub sta avendo qualche problema non correlato. Ma a prescindere, il collegamento di unione 100k è un errore 500 per me.
8

@ 8bittree che non può gestire, il repository privato sarebbe 400 :-) github.com/isaacs/github/issues/1344
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Qual è questa connessione tra sandalo barbuto che indossa i sostenitori della FOSS e Lovecraft che incontro ripetutamente?
Neutrino,

3

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

Per esempio:

git merge branch_A branch_B branch_C [...]

Quindi commettere ha più genitori.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.