Bisakah git commit memiliki lebih dari 2 orang tua?


48

Dalam dokumentasi ini disebutkan

Objek komit dapat memiliki sejumlah orang tua.

Tetapi dari pemahaman saya, satu-satunya kasus di mana komit akan memiliki lebih dari 1 orang tua adalah ketika penggabungan telah terjadi, dan dalam kasus itu hanya akan ada dua orang tua. Jadi pertanyaan saya adalah, bisakah komit memiliki lebih dari 2 orang tua? Jika ya, kapan?


11
github.com/torvalds/linux/commit/… - Saya tidak berpikir Github tahu cara menampilkan diff 27-arah, tetapi jangan ragu untuk mengkloning repositori dan melihatnya sendiri.
user253751

Jawaban:


43

Anda dapat menggunakan git merge untuk menggabungkan lebih dari satu komit ke cabang Anda saat ini. Dari man git-merge(atau git help merge):

git-merge - Gabungkan dua atau lebih histori pengembangan bersama

Hasilnya akan menjadi komitmen dengan lebih dari dua orang tua ketika Anda melakukan itu.


33
Penggabungan lebih dari satu cabang (yaitu komit dengan lebih dari dua orang tua) secara bahasa dikenal sebagai "gabungan gurita". Itu juga sumber inspirasi untuk logo dan maskot GitHub, kucing berkaki delapan: awalnya disebut Octopuss, tetapi dinamai Octocat yang lebih ramah perusahaan.
Jörg W Mittag

4
Apa keuntungan dari menggabungkan tiga atau lebih cabang dalam satu komit, daripada serangkaian komit?
Tor Klingberg

2
@TorKlingberg riwayat bersih, tetapi pastikan untuk menguji produk akhir sebelum mendorong ke repetisi jarak jauh.
Ferrybig

5
@KasunSiyambalapitiya - Ada banyak contoh dalam satu repo github tertentu . Salah satu dari banyak gurita bergabung dalam repo yang melibatkan 27 orang tua .
David Hammen

1
@ JörgWMittag Secara harfiah tidak ada yang benar. Sumber: bekerja di GitHub selama lima tahun.
gjtorikian

5

Ya, bagaimana dengan 100k orang tua?

Berikut ini adalah contoh GitHub langsung dengan gabungan 100k komit: https://github.com/cirosantilli/test-octopus-100k Dihasilkan dengan skrip ini .

Hal sepele

Linus tidak suka komitmen dengan lebih dari 60 orang tua: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

Ini ditarik, dan itu baik-baik saja, tetapi jelas ada keseimbangan antara "gurita menggabungkan baik-baik saja" dan "Ya Tuhan, itu bukan gurita, itu penggabungan Cthulhu".

Lihat format untuk objek komit Git

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

Dari analisis itu, kita dapat melihat bahwa daftar daftar orang tua adalah daftar jenis baris baru yang sewenang-wenang:

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

sehingga jumlah orang tua yang sewenang-wenang diizinkan.

Contoh minimal

Naskah:

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

Keluaran:

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

Saya tidak yakin apakah GitHub tidak dapat menangani penggabungan sebesar itu atau jika Anda membiarkannya sebagai repositori pribadi. Atau jika GitHub hanya memiliki masalah yang tidak terkait. Tapi terlepas dari itu, tautan gabungan 100k adalah kesalahan 500 bagi saya.
8bittree

@ 8bittree tidak bisa ditangani, repo pribadi akan menjadi 400 :-) github.com/isaacs/github/issues/1344
Ciro Santilli 新疆 改造 中心 法轮功 六四 六四

Apa hubungan antara sandal berjanggut ini yang memakai pendukung FOSS dan Lovecraft yang berulang kali saya temui?
Neutrino

3

Anda dapat menentukan lebih dari satu cabang saat penggabungan.

Sebagai contoh:

git merge branch_A branch_B branch_C [...]

Kemudian komit memiliki lebih banyak orang tua.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.