2009-09-22 4 views
18

„Mann gitglossary“ enthält diese Definition eines bösen merge:Evil verschmilzt in Git?

Eine böse Zusammenführung ist eine Zusammenführung, die Veränderungen führt, die nicht in jedem Elternteil erscheinen.

Ich bin mir nicht sicher, ich verstehe den Punkt, den die Autoren versuchen, zu bekommen. Warum ist es böse?

+2

Ich kam von [dieser Seite] hierher (http: // stackoverflow.com/questions/2910044/does-git-have-evil-twin-issues/2910388 # 2910388) und ich fand es sehr hilfreich zu erkennen, dass es nicht "git's evil merge" ist: böse Verschmelzung ist nicht natürlich Phänomen, das manchmal passiert; Es ist etwas, was die Leute manchmal in git tun (genau wie Menschen manchmal andere Unfälle verursachen, wie zum Beispiel forcierte Änderungen an einem öffentlichen Repo). Das Mitnehmen hier ist: Mach das nicht! (_oder mindestens merge semantics_) – sehe

+0

sehe ist richtig, das sind die Worte von Linus Torvalds selbst: ein "böse Merge" ist etwas, das Änderungen macht, die weder von Seite kommen und nicht tatsächlich einen Konflikt lösen –

Antwort

16

Weil es Sachen in den Code steckt, die niemand jemals verlangt hat, dort zu sein. Als ob Sie diesen Code hatte:

$foo = bar; 
$baz = qxx; 

und diese Änderung:

$foo = bar; 
$foo++; 
$baz = qxx; 

wurde mit dieser Änderung verschmolzen:

$foo = bar; 
$foo--; 
$baz = qxx; 

in einer Weise, die irgendwie produziert:

$foo = bar; 
$foo++; 
$foo--; 
--$baz; 
$baz = qxx; 

Offensichtlich ist das böse.

Ich würde vermuten, dass es genug Anliegen ist, in man gitglossary zu sein, denn je mehr Ihre Algorithmen beteiligt sind, desto wahrscheinlicher ist es, dass sie so etwas produzieren.

+2

To Produzieren Sie dies, rufen Sie einfach git-merge mit der Option --no-commit auf, fügen Sie weitere Änderungen hinzu, checken Sie sie ein und committen Sie. Die vorgenerierte Merge-Commit-Nachricht wird automatisch verwendet. – Cascabel

+1

@Jefromi Nach dieser Definition ist eine Zusammenführung mit einem Konflikt, der manuell gelöst werden muss, eine böse Zusammenführung? Es gibt einen starken semantischen Unterschied zu dem, was @chaos sagt; Sie könnten möglicherweise seine Ergebnisse erhalten, ohne irgendeinen Konflikt im Zusammenführungsprozess zu bekommen. Was wirklich böse ist. – krosenvold

+9

Wo hat - $ baz; komme aus. Ich dachte nicht, dass GIT Code zufällig erzeugt hat. Für mich ist es böse genug, dass das Inkrement und das Dekrement verschmolzen wurden, ohne dass jemand geklärt hat, welcher der richtige Code ist. Das Ergebnis ist, dass die zwei Änderungen den Code unterbrechen. Die Linie, die aus dem Nichts kam, musste von jemandem eingefügt werden, der den Merge manuell "korrigierte". An diesem Punkt ist es nicht GIT's Schuld?!?!? –

8

Ich denke, es könnte "böse Verschmelzung" genannt werden, weil es schwierig ist Eckfall für "git Schuld" zu lösen, wenn die Datei annotieren (zeilenweise Geschichte Annotationen generieren).


Böses merge migh erforderlich sein, wenn Sie Funktion ‚A‘ auf Hauptzweig entwickelt und Funktion ‚B‘ auf Seitenast und jene Merkmale Konflikt in semantischer (Nicht-Text) Art und Weise. Ein Beispiel wäre die Verwendung desselben Namens für eine globale Variable mit unterschiedlichen Bedeutungen - dies erfordert das Umbenennen der Variablen für eines der Merkmale.

Für böse merge „git show --cc“ hat nicht leer kompakt kombiniert diff (aber ich bin nicht sicher, ob es Äquivalenzbeziehung ist, die Implikation in eine Richtung sein könnte, dh nur „böser merge“ dann nicht leer „“).

+1

Intuitiv fühlt sich @chaos 'Antwort richtiger an, aber ich weiß, dass du mit diesen Dingen gut bist;) Es fühlt sich an, als würdest du einen guten alten Merge-Konflikt beschreiben, bei dem 2 Leute überlappende Teile des gleichen Problems gelöst haben - oder vielleicht sogar das gleiche Problem. Wenn die Zusammenführung beendet ist, warum sollten Sie sie erneut erstellen? Ist es nicht allzu poetisch, diesen "ziemlich regelmäßigen" Vorfall als "böse" zu bezeichnen? – krosenvold

+2

Das Auflösen eines Konflikts * beinhaltet * normalerweise * das Auswählen einer der Versionen über die andere, wobei manchmal eine Versionszeile über Zeilen aus einer anderen Version ausgewählt wird. Evil Merge hat Zeilen, die sich in keinem seiner Eltern befinden. Daher kann es nicht automatisch neu erstellt werden, auch nicht durch eine hochentwickelte (generische) Merge-Strategie. –

+0

* (Entfernte Zeile über "böse" Merge und automatisierten Prozess) * –

9

In den Worten von Linus Torvalds selbst (aus dem git mailing list genommen):

eine „böse merge“ ist etwas, das Änderungen vornimmt, die von keiner Seite kam und aufgelöst nicht wirklich einen Konflikt

0

Es lohnt sich zu erwähnen, dass ein „bösen Wandel“ von einem „bösen merge“ kann leise während Rebasing einen „bösen merge“ verloren werden, um einen „bösen Wandel“ enthält, die mit anderen Commits nicht entgegenstehen. Die Verwendung von --preserve-merges hilft nicht in such a case.

Verwandte Themen