git umbenennen/löschen Verwirrung
Ich habe eine Verwirrung über ein spezielles git-Verhalten:
Folgenden sind die Schritte und der situation (die Liste der Befehle sind auch später gegeben):
- Ich habe zwei Zweige: master-und XBranch
- Es ist eine Datei src/a.txt in beiden von Ihnen. Die Inhalte der "Alte Inhalt"
- In XBranch ich umbenennen src/a.txt zu src/b.txt mit:
mv
,git rm
,git add
. -
In master umbenennen der Datei a.txt. Beim commit habe ich
git rm src/a.txt
aber vergessengit add src/b.txt
Im master mache ich:git rm src/a.txt
undgit commit
-
Im master, ich Bearbeiten Sie den Inhalt der Datei b.txt zu "
New Content
- Im master mache ich
git add src/b.txt
undgit commit
- Im master mache ich:
git merge XBranch
Die Datei src/b.txt Konflikte, das ist völlig verständlich.
Aber der Inhalt ist "Old Content
". Warum?
Warum nicht ist es etwas wie:
<<<<<<< HEAD
New Content
=======
Old content
>>>>>>> XBranch
Liste der Befehle:
sabya@SABYA-PC d:/merge_temp/test/case2
$ mkdir source
sabya@SABYA-PC d:/merge_temp/test/case2
$ git init
Initialized empty Git repository in d:/merge_temp/test/case2/.git/
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ mkdir src
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ vi src/a.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ cat src/a.txt
Old Content
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git add src/
sabya@SABYA-PC 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
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git branch XBranch
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git checkout XBranch
Switched to branch 'XBranch'
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ mv src/a.txt src/b.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ git rm src/a.txt
rm 'src/a.txt'
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ git add src/b.txt
sabya@SABYA-PC 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%)
sabya@SABYA-PC d:/merge_temp/test/case2 (XBranch)
$ git checkout master
Switched to branch 'master'
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ mv src/a.txt src/b.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git rm src/a.txt
rm 'src/a.txt'
sabya@SABYA-PC 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
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ vi src/b.txt
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ cat src/b.txt
New Content
sabya@SABYA-PC d:/merge_temp/test/case2 (master)
$ git add src/b.txt
sabya@SABYA-PC 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
sabya@SABYA-PC 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.
sabya@SABYA-PC d:/merge_temp/test/case2 (master|MERGING)
$ cat src/b.txt
Old Content
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein Konflikt, aber nicht über die Datei Inhalt. Es ist über die
Baum Inhalt.
case2
Verzeichnis (im master), es ist ein neue Dateib.txt
a.txt => b.txt
Wenn Sie zu einer Lösung des Konflikts, Sie sind in der Tat die Wahl, eine Datei oder die
andere (nicht eine Zeile innerhalb der Datei). Daher die "Alten Inhalte" in der resultierenden
Datei.
Die OP fügt in die Kommentare:
Dieser Zeit, die beiden Bäume (der case2 Verzeichnis der in den Zweigen
master
undXBranch
)Referenz neue Datei
a.txt
: seine Inhalte zusammengeführt, mit KonfliktenAuflösung. Zuvor gab es einen Konflikt zwischen einem
a.txt
(umbenannt als
b.txt
) und eine neue b.txt: beide Dateien nicht vorhanden sind in dergleichen ast, eine Wahl (die Datei, nicht die Datei-Inhalte) vorgenommen werden mussten.
Das bedeutet, dass:
XBranch
(a.txt
umbenanntb.txt
) zumaster
Begehenmit einem neuen
b.txt
aus Schritt 6 (Konflikt des Baumes),XBranch
(a.txt
umbenanntb.txt
) mit master aus neueSchritt 4 (
a.txt
auch umbenannt alsb.txt
): gleichen Baum Inhalt, aber verschiedenenblob-Inhalt: Konflikt-Linien.
Dass gesagt wird, die die OP noch meint, es muss ein Fehler sein:
Hinweis: Git 2.18 (Q2 2018) änderungen, die die Konflikterkennung Bericht mit einer merge-recursive.
Sehen commit 6e7e027 (19-Apr-2018) durch Elijah Newren (
newren
).case2
Verzeichnis der in den Zweigenmaster
undXBranch
) verweisen auf eine neuen - Dateia.txt
: seine Inhalte zusammengeführt, mit der Konfliktlösung. Zuvor gab es einen Konflikt zwischen einema.txt
(umbenannt alsb.txt
) und eine neueb.txt
: beide Dateien nicht vorhanden sind in der gleichen Branche, eine Auswahl (von Datei, nicht die Datei-Inhalte) vorgenommen werden mussten.XBranch
(a.txt
umbenanntb.txt
) master commit mit einem neuenb.txt
aus Schritt 6 (Konflikt-der Baum), Sie würden ZusammenführenXBranch
(a.txt
umbenanntb.txt
) mit Meister aus neu Schritt 4 (a.txt
auch umbenanntb.txt
): gleichen Baum Inhalt, aber unterschiedlichen blob-Inhalt: Konflikt-Linien.git reset -- <path>
dann gibt es keine änderungen zu Begehen, und ich bin gezwungen zugit rebase --skip
. Aber das gerade beendete abrupt die Stellungswechsel!! (Ich hatte noch mehr verpflichtet zu gelten! Sie wurden gelöscht!)