Чи може вчиняти git більше 2 батьків?


48

У цій документації це згадується

Об'єктом фіксації може бути будь-яка кількість батьків.

Але, наскільки я розумію, єдиний випадок, коли комісія матиме більше одного з батьків, - це коли відбулося злиття, і в цьому випадку будуть лише два батьки. Отже, моє запитання полягає в тому, чи може вчинок мати більше 2 батьків? Якщо так, коли?


11
github.com/torvalds/linux/commit/… - Я не думаю, що Github знає, як відобразити 27-ти різницю, але сміливо клонуйте сховище та переглядайте його самостійно.
користувач253751

Відповіді:


43

Ви можете використовувати git merge для об'єднання декількох комірок у поточну галузь. З man git-merge(або git help merge):

git-merge - об’єднайте дві чи більше історії розвитку разом

Результатом стане зобов’язання з більш ніж двома батьками, коли ви це зробите.


33
Злиття більш ніж однієї гілки (тобто зобов'язання з більш ніж двома батьками) розмовно називається "злиття восьминога". Це також джерело натхнення для логотипу та талісмана GitHub, восьминогого кота: його спочатку називали Восьминоги, але перейменовано на більш сприятливий корпоративний Octocat.
Йорг W Міттаг

4
Які переваги є об'єднанням трьох або більше гілок в один комітет, а не ряд комісій?
Tor Klingberg

2
@TorKlingberg Історія очищення, але переконайтесь, що протестуйте кінцевий продукт, перш ніж натискати на віддалений репситорій.
Феррібіг

5
@KasunSiyambalapitiya - Є кілька прикладів в одному конкретному github repo . Один з багатьох восьминога зливається в репо, в якому беруть участь 27 батьків .
Девід Хаммен

1
@ JörgWMittag Буквально нічого з цього не відповідає дійсності. Джерело: пропрацював у GitHub п’ять років.
gjtorikian

5

Так, як щодо батьків у 100 тисяч?

Ось живий приклад GitHub із об'єднанням у 100 тис. Коміттів: https://github.com/cirosantilli/test-octopus-100k Створений за допомогою цього сценарію .

Дрібниці

Лінус не любить погоджуватися з більш ніж 60 батьками: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commiss-in-linux-kernel-git-history

Це витягнуто, і це добре, але чітко є баланс між "злиття восьминога хороші" та "Христос, це не восьминога, це злиття Ктулху".

Погляньте на формат об'єкта Git

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

З цього аналізу ми бачимо, що список батьків є довільним розділеним новим рядком типом:

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

і так дозволяється довільна кількість батьків.

Мінімальний приклад

Сценарій:

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

Вихід:

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

Я не впевнений, чи GitHub просто не в змозі здійснити злиття такої величини або якщо ви залишили це як приватне сховище. Або якщо GitHub просто має якісь непов'язані проблеми. Але незалежно, посилання злиття 100k - це помилка 500.
8bittree

@ 8bittree це не впорається, приватне репо буде 400 :-) github.com/isaacs/github/isissue/1344
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Який це зв’язок між бородатими босоніжками, які носять захисники FOSS, і Lovecraft, які я неодноразово перераховую?
Нейтрино

3

Під час злиття можна вказати більше однієї гілки.

Наприклад:

git merge branch_A branch_B branch_C [...]

Тоді у вчиненні є більше батьків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.