2010-06-23 7 views
6

ich eine Verwirrung über ein spezielles git Verhalten:git Umbenennungs/löschen Verwirrung

Im Folgenden sind die Schritte und Situation sind (die Liste der Befehle werden auch später angegeben):

  1. Ich habe zwei Zweige: Master und XBranch
  2. Es gibt eine Datei src/a.txt in beiden. Es ist Inhalt "Alter Inhalt"
  3. In XBranch benenne ich src/a.txt zu src/b.txt um, indem ich: mv, git rm, git add.
  4. Benennen Sie im Master die Datei a.txt um. Während zu begehen habe ich git rm src/a.txt aber vergessen git add src/b.txt Im Master zu tun tun I: git rm src/a.txt und git commit

  5. Im Master, bearbeite ich den Inhalt der Datei b.txt auf "New Content

  6. Im Master muss ich git add src/b.txt und git commit
  7. Im Master I tun: git merge XBranch

Die Datei src/b.txt Konflikte, die perfekt un ist beständig. Aber der Inhalt ist "Old Content". Warum?

Warum nicht ist es so etwas wie:

<<<<<<< HEAD 
New Content 
======= 
Old content 
>>>>>>> XBranch 

Liste der Befehle:

[email protected] d:/merge_temp/test/case2 
$ mkdir source 

[email protected] d:/merge_temp/test/case2 
$ git init 
Initialized empty Git repository in d:/merge_temp/test/case2/.git/ 

[email protected] d:/merge_temp/test/case2 (master) 
$ mkdir src 

[email protected] d:/merge_temp/test/case2 (master) 
$ vi src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ cat src/a.txt 
Old Content 

[email protected] d:/merge_temp/test/case2 (master) 
$ git add src/ 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master (root-commit) 148500e] added src/a.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git branch XBranch 

[email protected] d:/merge_temp/test/case2 (master) 
$ git checkout XBranch 
Switched to branch 'XBranch' 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ mv src/a.txt src/b.txt 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git rm src/a.txt 
rm 'src/a.txt' 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git add src/b.txt 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git commit 
[XBranch b3ff8fa] changed a.txt to b.txt in XBranch 
1 files changed, 0 insertions(+), 0 deletions(-) 
rename src/{a.txt => b.txt} (100%) 

[email protected] d:/merge_temp/test/case2 (XBranch) 
$ git checkout master 
Switched to branch 'master' 

[email protected] d:/merge_temp/test/case2 (master) 
$ mv src/a.txt src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git rm src/a.txt 
rm 'src/a.txt' 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master bfeaecb] removed src/a.txt 
1 files changed, 0 insertions(+), 1 deletions(-) 
delete mode 100644 src/a.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ vi src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ cat src/b.txt 
New Content 

[email protected] d:/merge_temp/test/case2 (master) 
$ git add src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git commit 
[master 2361d5e] changed content of b.txt 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 src/b.txt 

[email protected] d:/merge_temp/test/case2 (master) 
$ git merge XBranch 
CONFLICT (rename/delete): Rename src/a.txt->src/b.txt in XBranch and deleted in HEAD 
Automatic merge failed; fix conflicts and then commit the result. 

[email protected] d:/merge_temp/test/case2 (master|MERGING) 
$ cat src/b.txt 
Old Content 

Antwort

6

Es gibt einen Konflikt, aber nicht über die Datei Inhalt. Es handelt sich um den Baum Inhalt.

  • In einem Baum, das case2 Verzeichnis (in Master), gibt es eine neue Datei ist b.txt
  • im selben Verzeichnis (in XBranch), gibt es eine umbenannt Datei a.txt => b.txt

Wenn Sie den Konflikt lösen, wählen Sie tatsächlich eine Datei oder die andere (nicht eine Zeile in der Datei). Daher der "Alte Inhalt" in der resultierenden Datei .


Die OP fügt in den Kommentaren:

Aber wie logisch unterscheidet es sich von der folgenden Situation:

  1. Ich füge eine Datei a.txt in master mit "alten Inhalt" und begehe es.
  2. Ich füge eine Datei a.txt in XBranch mit "New Content" und commit es.
  3. Ich fusioniere XBranch in master. Diesmal zeigt es beide Inhalte in dieser Datei!

Diesmal beiden Bäume (das case2 Verzeichnis in Filialen master und XBranch) Referenz eine neue Datei a.txt: sein Inhalt verschmolzen erhalten, mit Konflikten Auflösung. Zuvor war es zu einem Konflikt zwischen einem a.txt ( als b.txt umbenannt) und eine neueb.txt: Beide Dateien können nicht im gleichen Zweig gibt, hatte die Wahl (von Datei, nicht der Dateiinhalt) gemacht werden.

In Schritt 4 meiner Frage, wenn ich in einer einzigen „git rm“ und „git add“ tun begehen, es funktioniert, wie ich erwarte! Ich verstehe das jetzt nicht. Wie kann ich vorhersagen, wann die Datei beide Inhalte enthält? Wenn es nur den Inhalt von XBranch hat und wann wird es nur den Inhalt von master haben?

Das bedeutet, dass:

  • statt XBranch der Verschmelzung (a.txt als b.txt umbenannt) zu master begehen mit einer neuen b.txt aus Schritt 6 (Konflikt Baum),
  • Sie XBranch fusionieren würden (a.txt umbenannt als b.txt) mit Master von neu Schritt 4 (a.txtauch umbenannt als b.txt): gleicher Bauminhalt, aber anders Blob Inhalt: Konflikt der Zeilen.

aber sagen, dass denkt, dass die OP noch muss ein Fehler sein:

+0

Aber wie logisch unterscheidet es sich von der folgenden Situation : 1. Ich füge eine Datei a.txt im Master mit "Old Content" hinzu und beende sie. 2. Ich füge eine Datei a.txt in XBranch mit "Neuer Inhalt" hinzu und übertrage es. 3. Ich füge XBranch in Master. Diesmal zeigt es beide Inhalte in dieser Datei! – Sabya

+0

@Sabaya: diesmal verweisen beide Bäume (das 'case2' -Verzeichnis in den Zweigen' master' und 'XBranch') auf eine * neue * Datei' a.txt': ihr Inhalt wird zusammengeführt, mit Konfliktlösung. Zuvor gab es einen Konflikt zwischen einem ** 'a.txt' ** (umbenannt als' b.txt') und einem neuen ** 'b.txt' **: Beide Dateien können nicht im selben Zweig existieren, eine Auswahl (von Datei, nicht von Dateiinhalt) musste gemacht werden. – VonC

+0

In Schritt 4 meiner Frage, wenn ich "git rm" und "git add" in einem einzigen Commit mache, funktioniert es wie ich es erwarte! Ich verstehe das jetzt nicht. Wie kann ich vorhersagen, wann die Datei beide Inhalte enthält? Wann wird es nur den Inhalt von XBranch haben und wann wird es nur den Inhalt von Master haben? – Sabya