Warum meldet Git fälschlicherweise, dass meine Dateien aktuell sind?

Warum meldet Git fälschlicherweise, dass meine Dateien aktuell sind?

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.htmlim Ordner B. Dann füge ich sie index.htmlim 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.htmlDateien. Was ist los?

Antwort1

git pullDie Aufgabe von ist es, fetchneue Commits zu erstellen und mergesie 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 pullbefasst 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 statusum eine Zusammenfassung zu erhalten.

Um den Status Ihrer Zweige zu verstehen, git branch -vist es nützlich (es zeigt die Commit-ID und die Beziehung zum Upstream-Zweig jedes Zweigs an) oder gitk --allfü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 pullDrucke:

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.htmlwurde 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, gitgilt als Name, der auf einen Blob verweist. Was Sie als zwei Dateien mit demselben Inhalt betrachten, gitgilt 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 gitin 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.

verwandte Informationen