Bir git taahhüdünün 2'den fazla ebeveyni olabilir mi?


48

Gelen bu belgelerin söz konusu buluşu

Bir taahhüt nesnesinin herhangi bir sayıda ebeveyni olabilir.

Fakat benim anladığım kadarıyla, bir taahhüdün birden fazla ebeveyne sahip olacağı tek durum bir birleşme olduğu zaman ve bu durumda sadece iki ebeveyn olacaktır. Öyleyse sorum şu, bir taahhüdün 2'den fazla ebeveyni olabilir mi? Eğer öyleyse, ne zaman?


11
github.com/torvalds/linux/commit/… - Github'un 27 yönlü bir fark göstermeyi bildiğini sanmıyorum, ancak depoyu klonlamak ve kendiniz görüntülemek için çekinmeyin.
user253751

Yanıtlar:


43

Git şubenizi, geçerli şubenize birden fazla taahhüt eklemek için kullanabilirsiniz. Gönderen man git-merge(veya git help merge):

git-merge - İki veya daha fazla geliştirme geçmişine birlikte katılın

Sonuç, bunu yaptığınızda ikiden fazla ebeveyne bağlılık olacaktır.


33
Birden fazla daldan oluşan bir birleşme (yani ikiden fazla ebeveyni olan bir taahhüt), halk arasında "ahtapot birleşmesi" olarak bilinir. Bu aynı zamanda GitHub'un logosu ve sekiz bacaklı kedi maskotu için ilham kaynağıdır: aslında Octopuss olarak adlandırılmıştı, ancak daha kurumsal dostu Octocat olarak değiştirildi.
Jörg W Mittag

4
Bir dizi komisyon yerine, üç veya daha fazla şubeyi tek bir taahhütte birleştirmenin avantajları nelerdir?
Tor Klingberg,

2
@TorKlingberg Temizleyici geçmişi, ancak uzak depoya göndermeden önce son ürünü test ettiğinizden emin olun.
Ferrybig

5
@KasunSiyambalapitiya - Belirli bir github deposunda birden fazla örnek var . Pek çok ahtapottan biri , 27 ebeveyni içeren o depoda birleşiyor .
David Hammen

1
@ JörgWMittag Kelimenin tam anlamıyla bunların hiçbiri doğru değil. Kaynak: GitHub'da beş yıl çalıştı.
gjtorikian

5

Evet, 100k ebeveyni nasıl?

: İşte 100k kaydedilmesini bir birleştirme ile canlı GitHub örnektir https://github.com/cirosantilli/test-octopus-100k Oluşturulan bu komut dosyası ile .

önemsiz şeyler

Linus, 60'tan fazla ebeveyni olan işlerden hoşlanmaz: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

Çekilmiş ve sorun yok, ancak açıkça "ahtapot birleşmeleri iyidir" ve "Mesih, bu bir ahtapot değil, bu bir Cthulhu birleşmesi" arasında bir denge var.

Git commit nesnesi formatına bir göz atın

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

Bu analizden, ebeveynler listesinin keyfi bir yeni satır ayrılmış tür listesi olduğunu görebiliriz:

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

ve böylece keyfi sayıda ebeveyn izin verilir.

Minimal örnek

Senaryo:

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

Çıktı:

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

GitHub’ın bu büyüklükteki bir birleştirme ile başa çıkamayacağından veya özel bir depo olarak bıraktığınızdan emin değilim. Ya da GitHub sadece ilgisiz bir sorun yaşıyorsa. Ancak, ne olursa olsun, 100k birleştirme bağlantısı benim için 500 hatadır.
8bittree


FOSS savunucuları giyen sakallı sandalet ile defalarca tuttuğum Lovecraft arasındaki bu bağlantı nedir?
Neutrino

3

Birleştirirken birden fazla dal belirtebilirsiniz.

Örneğin:

git merge branch_A branch_B branch_C [...]

Öyleyse, daha fazla ebeveyn sahibi ol.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.