Kann ein Idiot mehr als zwei Eltern haben?


48

In dieser Dokumentation wird darauf hingewiesen

Ein Festschreibungsobjekt kann eine beliebige Anzahl von Eltern haben.

Nach meinem Verständnis ist der einzige Fall, in dem ein Commit mehr als ein Elternteil hat, der, wenn eine Zusammenführung stattgefunden hat, und in diesem Fall gibt es nur zwei Elternteile. Meine Frage ist also, kann ein Commit mehr als zwei Eltern haben? Wenn ja wann


11
github.com/torvalds/linux/commit/… - Ich glaube nicht, dass Github weiß, wie man ein 27-Wege-Diff anzeigt, aber Sie können das Repository klonen und es selbst anzeigen.
user253751

Antworten:


43

Sie können git merge verwenden, um mehr als ein Commit in Ihrem aktuellen Zweig zusammenzuführen. Von man git-merge(oder git help merge):

Git-Merge - Verbinden Sie zwei oder mehr Entwicklungsverläufe miteinander

Das Ergebnis ist ein Commit mit mehr als zwei Eltern, wenn Sie das tun.


33
Eine Zusammenführung von mehr als einem Zweig (dh eine Festschreibung mit mehr als zwei Elternteilen) wird umgangssprachlich als "Octopus-Zusammenführung" bezeichnet. Dies ist auch die Inspirationsquelle für das GitHub-Logo und -Maskottchen, die achtbeinige Katze: Sie hieß ursprünglich Octopuss, wurde aber in unternehmensfreundlichere Octocat umbenannt.
Jörg W Mittag

4
Was sind die Vorteile des Zusammenführens von drei oder mehr Zweigen in einem einzigen Commit anstelle einer Reihe von Commits?
Tor Klingberg

2
@TorKlingberg Cleaner-Verlauf, aber stellen Sie sicher, dass Sie das Endprodukt testen, bevor Sie es an das Remote-Repository senden.
Ferrybig

5
@KasunSiyambalapitiya - Es gibt mehrere Beispiele in einem bestimmten Github-Repo . Einer der vielen Tintenfische verschmilzt in diesem Repo, an dem 27 Eltern beteiligt sind .
David Hammen

1
@ JörgWMittag Wörtlich nichts davon ist wahr. Quelle: arbeitete fünf Jahre bei GitHub.
gjtorikian

5

Ja, wie wäre es mit 100.000 Eltern?

Hier ist ein Live-GitHub-Beispiel mit einer Zusammenführung von 100.000 Commits: https://github.com/cirosantilli/test-octopus-100k Mit diesem Skript generiert .

Trivia

Linus mag keine Commits mit mehr als 60 Eltern: https://www.destroyallsoftware.com/blog/2017/the-biggest-and-weirdest-commits-in-linux-kernel-git-history

Es wird gezogen, und es ist in Ordnung, aber es gibt eindeutig ein Gleichgewicht zwischen "Tintenfischzusammenführungen sind in Ordnung" und "Christus, das ist kein Tintenfisch, das ist eine Cthulhu-Zusammenführung".

Sehen Sie sich das Format für das Git-Commit-Objekt an

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

Aus dieser Analyse können wir ersehen, dass die Liste der Eltern eine willkürlich durch Zeilenumbrüche getrennte Liste vom Typ ist:

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

und so ist eine beliebige Anzahl von Eltern erlaubt.

Minimales Beispiel

Skript:

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

Ausgabe:

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

Ich bin mir nicht sicher, ob GitHub eine Zusammenführung dieser Größenordnung nicht verarbeiten kann oder ob Sie sie als privates Repository hinterlassen haben. Oder wenn GitHub nur ein Problem hat, das nichts damit zu tun hat. Aber egal, der 100k Merge Link ist für mich ein 500er Fehler.
8bittree,

@ 8bittree nicht damit umgehen kann, wäre privaten Repo 400 :-) github.com/isaacs/github/issues/1344
Ciro Santilli新疆改造中心法轮功六四事件

In welcher Beziehung stehe ich zwischen einer bärtigen Sandale mit FOSS-Anwälten und Lovecraft, der ich immer wieder begegne?
Neutrino,

3

Sie können beim Zusammenführen mehr als einen Zweig angeben.

Zum Beispiel:

git merge branch_A branch_B branch_C [...]

Dann hat Commit mehr Eltern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.