2010-04-06 4 views
6

Ich habe eine Datei mit einer Zeile drin. Ich erstelle eine Verzweigung und füge eine zweite Zeile derselben Datei hinzu. Speichern und in den Zweig übernehmen. Ich wechsle zurück zum Master. Und fügen Sie der Datei eine andere, zweite Zeile hinzu. Speichern und Commit für den Master. So gibt es jetzt insgesamt 3 einzigartige Linien.Warum kann Git Dateiänderungen nicht mit einem geänderten Parent/Master zusammenführen?

Wenn ich jetzt versuche, den Zweig zurück zum Master zusammenzuführen, erleidet einen Zusammenführungskonflikt.

Warum kann Git einfach jede Zeile nacheinander zusammenführen?

bei merge Mein Versuch, verhält sich etwa wie folgt:

PS D:\dev\testing\test1> git merge newbranch 
Auto-merging hello.txt 
CONFLICT (content): Merge conflict in hello.txt 
Automatic merge failed; fix conflicts and then commit the result. 
PS D:\dev\testing\test1> git diff 
diff --cc hello.txt 
index 726eeaf,e48d31a..0000000 
--- a/hello.txt 
+++ b/hello.txt 
@@@ -1,2 -1,2 +1,6 @@@ 
    This is the first line. 
- New line added by master. 
-Added a line in newbranch. 
++<<<<<<< HEAD 
++New line added by master. 
++======= 
++Added a line in newbranch. 
++>>>>>>> newbranch 

Gibt es eine Möglichkeit, es Schlitzleitungen automatisch zu machen, eins nach dem anderen?

+2

Es scheint nicht so, als gäbe es einen einfachen Weg, um die Reihenfolge zu bestimmen, in der sie geschlitzt werden sollen - schließlich kann die Reihenfolge sicherlich einen Einfluss auf den ausführbaren Code haben. – Amber

Antwort

12

ist die Datei Zweig A sieht aus wie sagen Lassen:

First line 
Branch A's second line 

Und Zweig B wie folgt aussieht:

First line 
Branch B's second line 

Wenn Sie verschmelzen, gibt es zwei verschiedene Möglichkeiten, um es zu lösen. Hier ist eine Möglichkeit:

First line 
Branch A's second line 
Branch B's second line 

Hier ist eine andere Art und Weise:

First line 
Branch B's second line 
Branch A's second line 

Git hat keine Ahnung, welche eine dieser beiden Optionen, die Sie bevorzugen, oder wenn entweder sind noch akzeptabel verschmilzt.

1

Ich kann Ihnen sagen, warum es die beiden nicht zusammenführen kann - nach Git, Zeile 2 von FileA ist "so und so", während Zeile 2 von FileB ist "etwas anderes". Laut git versucht es daher, Datei aus FileA und FileB mit einer Zeile mit zwei möglichen Werten zu erstellen. Es kann nicht entscheiden, welches du willst, also wirft es beide ab und bringt dich dazu, es zu reparieren.

2

lasst uns sagen, dass Sie diese Zeile haben:

printf(something); 

in branchA, Sie machen es:

while(x < 5) 
printf(something); 

in branchB, Sie machen es:

if(y>10) 
printf(something); 

Wie können Sie fusionieren oder würden Sie dem Zusammenführungsergebnis vertrauen, das ein Werkzeug dafür geschaffen hat?

4

Es gibt eine Git-Merge-Strategie namens union, die von der .gitattributes Konfigurationsdatei konfiguriert werden kann, die dies für Sie tun wird, aber Sie haben keine Kontrolle über die Reihenfolge der Konfliktlinien in der zusammengeführten Datei und keine Konfliktmarker, um anzuzeigen, wo dies passiert ist.

Sie können auch eine benutzerdefinierte Zusammenführungsstrategie definieren, die spezielle Kenntnisse über die Struktur der Dateien verwenden kann, um die richtige Reihenfolge zu bestimmen.

Verwandte Themen