Ich habe kürzlich erfahren, dass beim Zusammenführen von zwei Zweigen in git ein Konflikt vorliegt, wenn Änderungen an zwei benachbarten Zeilen vorgenommen werden. Wenn die Datei beispielsweise folgenden test.txt
Inhalt hat:
Line 1: A
Line 2: B
Line 3: C
Line 4: D
und im Zweig master
ändern wir dies auf
Line 1: A
Line 2: B1
Line 3: C
Line 4: D
im Zweig testing
ändern wir dies auf
Line 1: A
Line 2: B
Line 3: C1
Line 4: D
und dann versuchen , fusionieren testing
in master
git einen Merge - Konflikt erklärt. Meine naive Erwartung war, dass die Fusion konfliktfrei ablaufen würde und dies ergeben würde:
Line 1: A
Line 2: B1
Line 3: C1
Line 4: D
Ich bin mir sicher, dass es einen guten Grund gibt, warum Git nicht auf diese Weise verschmilzt. Kann jemand diesen Grund erklären?
Antworten:
Angenommen, dieser Codeausschnitt
wurde in einem Zweig in diesen geändert
und in einem anderen Zweig in diese
dann würde ich nicht wollen, dass git es damit verschmilzt
ohne mich zu alarmieren.
Um solche Probleme zu vermeiden, weigert sich git normalerweise, Änderungen, die benachbarte Linien berühren, automatisch zusammenzuführen. Hier können Sie überprüfen, ob die Programmlogik fehlerhaft ist oder nicht.
Dieses Beispiel ist trivial, aber beim Zusammenführen großer Zweige ist das Risiko ähnlicher "logischer" Konflikte viel größer. Manchmal würde ich es sogar lieben, wenn der Kontext noch größer wäre, als er derzeit ist.
quelle
Ist das nur Schwachsinn?
Nach einem Gespräch mit einem Kollegen habe ich es gerade versucht, und SVN behandelt es problemlos: Sie erhalten die 2 Zeilen geändert.
Die Zusammenführungsfähigkeiten mehrerer VCS werden hier für Basar, Darcs, Git und Mercurial getestet : https://github.com/mndrix/merge-this
Es scheint, dass nur Darcs den Fall "benachbarter Linien" erfolgreich zusammenführen.
Das Anwenden benachbarter Änderungen auf Dateien ist kein schwieriges Problem. Ich denke wirklich, dass dieses Verhalten absichtlich gewählt wurde.
Warum sollte jemand entscheiden, dass das Ändern benachbarter Zeilen zu einem Konflikt führt?
Ich würde denken, das soll dich zwingen, es dir anzusehen .
Modif Nummer 1 am Master:
Modif Nummer 2, aus einem Zweig zusammengeführt:
Nach dem Zusammenführen möchten Sie das nicht:
Dieses Verhalten als Feature betrachten
Sie können das Zusammenführungsverhalten von Git zu einem Vorteil machen. Wenn Sie zwei Zeilen konsistent halten müssen, dies aber nicht erkennen können (zum Zeitpunkt der Kompilierung, zu Beginn Ihrer Tests oder ansonsten), können Sie versuchen, sie zusammenzufügen.
Schreiben Sie dies neu ...:
... dazu:
Wenn Sie also Modif 1 zusammenführen ...:
... mit Modif 2 ...:
..., git erzeugt einen Konflikt und du wirst dich zwingen, ihn anzuschauen.
quelle
Ich rate meistens, aber ich denke, es hat damit zu tun, dass Zeile 2 als Kontext für die Änderung von Zeile 3 verwendet wird.
Git kann nicht einfach sagen, dass "Die Zeile mit C eine Zeile mit C1 wurde", weil es eine andere Zeile mit "C" geben könnte, also "Die Zeile mit C, das ist direkt nach dem Dateianfang die Zeile mit A und die Linie mit B ist jetzt C1 "
Wenn "die Zeile mit B" nicht mehr vorhanden ist, geht ein Teil des Kontexts verloren und git kann nur ungefähr sagen, wohin die neue Zeile gehen muss.
quelle
Die anderen Antworten hier sind alle zutreffend, aber für mich schien dies immer eine unnötige Einschränkung zu sein.
Wie andere gesagt haben, möchten Sie in diesen Fällen definitiv nicht, dass Git die Zeilen ohne Vorwarnung zusammenfügt.
Aber ich wollte immer noch die Option, dies automatisch zu tun, nachdem ich gewarnt wurde. Deshalb habe ich einen benutzerdefinierten Git-Merge-Treiber geschrieben, mit dem Konflikte auf benachbarten (oder einzelnen) Zeilen interaktiv zusammengeführt werden können:
Das spart mir sehr viel Zeit, da ich ein Projekt verwalte, bei dem häufig an denselben Dateien gearbeitet und viel Code überarbeitet wird.
Das Skript ist auf GitHub unter einer GPLv3 + -Lizenz verfügbar. Vielleicht finden Sie es nützlich:
https://github.com/paulaltin/git-subline-merge
quelle