
Ich habe zwei Ordner – A und B – in meinem Dateiverzeichnis, die auf dasselbe Git-Repository verweisen.
Ich habe eine Datei mit dem Namen im Ordner A erstellt index.html
. Dann erstelle ich eine andere Datei mit dem Namen index.html
im Ordner B. Dann füge ich sie index.html
im Ordner B hinzu, übertrage sie und pushe den Inhalt von B.
Wenn ich aus Ordner A ziehe, behauptet Git, dass meine Dateien „bereits auf dem neuesten Stand“ sind. Allerdings enthalten beide Ordner offensichtlich unterschiedliche index.html
Dateien. Was ist los?
Antwort1
git pull
Die Aufgabe von ist es, fetch
neue Commits zu erstellen und merge
sie in den aktuellen Branch zu übertragen. Wenn der aktuelle Branch im Vergleich zu dem, von dem Sie pullen, nicht veraltet ist, wird pull sagenAlready up-to-date.
auch wenn Sie lokale Änderungen in Ihrem Arbeitsverzeichnis haben. git pull
befasst sich mit Zweigen, nicht mit dem Arbeitsbaum – der Arbeitsbaum wird nur kommentiert, wenn Änderungen vorliegen, die die Zusammenführung beeinträchtigen.
Ihre Beschreibung reicht nicht aus, um zu erklären, warum es keine Einwände gegen das Vorhandene gibt index.html
, aber Sie sollten nicht Already up-to-date.
davon ausgehen, dass Git denkt, Sie hätten keine Änderungen. Verwenden Sie stattdessen , git status
um eine Zusammenfassung zu erhalten.
Um den Status Ihrer Zweige zu verstehen, git branch -v
ist es nützlich (es zeigt die Commit-ID und die Beziehung zum Upstream-Zweig jedes Zweigs an) oder gitk --all
für eine grafische Ansicht aller Commits.
Antwort2
Wenn ich das richtig verstehe, sollte das folgende Skript Ihr Problem reproduzieren:
mkdir-Test CD-Test git init --bare test.git git clone test.git ein git clone test.git b echo a > a/index.html echo b > b/index.html CD B git add index.html git commit -m hinzufügen Git Push-Ursprung Master cd ../a git ziehen
Die letzten git pull
Drucke:
remote: Objekte zählen: 3, fertig. Remote: Insgesamt 3 (Delta 0), wiederverwendet 0 (Delta 0) Objekte auspacken: 100 % (3/3), erledigt. Von /home/cyrus/tmp/test/test * [neuer Zweig] Master -> Herkunft/Master
Und der Inhalt von index.html
wurde stillschweigend überschrieben:
cyrus:~/tmp/test/a$ cat index.html B
Antwort3
Denken Sie an eines git
:Es verfolgt Inhalte, keine Dateien.
Intern ist der gesamte Inhalt des Repositorys einKlecksirgendwo. Was Sie als Datei betrachten, git
gilt als Name, der auf einen Blob verweist. Was Sie als zwei Dateien mit demselben Inhalt betrachten, git
gilt als zwei Namen, die mit demselben Blob verknüpft sind. Da sich also keiner der Blobs geändert hat, hat sich auch das Repository nicht geändert.
Sie erwarten, dass Git wie Ihr Dateisystem funktioniert (oder vielleicht wie die meisten anderen Versionskontrollsysteme) – und git
in dieser Hinsicht tatsächlich platzsparender ist.Das Bucherklärt dieses Konzept ziemlich gut - insbesondere dieGit-Objektmodell.
Antwort4
Sieht aus, als wären Sie an SVN gewöhnt, wo verschiedene Ordner (oder sogar Dateien, keine Ahnung) Checkouts verschiedener Revisionen sein können.
Dies ist mit Git nicht möglich. Unabhängig davon, in welchem Ordner Sie sich befinden, können Sie bei einem Commit oder Checkout (was auch der letzte Schritt eines erfolgreichen Pulls ist) auf alle Arbeitsdateien einwirken, unabhängig davon, in welchem Ordner Sie sich gerade befinden.