2017-07-24 2 views
1

Kann jemand die Bedeutung dieser Begriffe klären? Werden Dateien nachverfolgt, die irgendwann auf der Bühne hinzugefügt wurden? Ist der "Index" gleich dem "Stadium"? Werden alle gestaffelten Dateien nachverfolgt, aber das Umgekehrte ist nicht unbedingt richtig (Dateien, die einmal bereitgestellt und festgelegt wurden, aber nicht Teil der aktuellen Phase sind, die festgeschrieben werden muss)? Woher weiß ich, welche Dateien verfolgt werden? Woher weiß ich, welche Dateien inszeniert sind?Git verfolgt, nicht verfolgt, inszeniert, indiziert Bedeutung?

+0

Es gibt bereits eine Reihe von vorhandenen Posts, die Ihre Frage beantworten, wie [this] (https://stackoverflow.com/questions/7564841/concept-of-git-tracking-and-git-staging) und [this ] (https://stackoverflow.com/questions/37142132/whats-the-difference-between-a-tracked-and-a-staged-file). Außerdem gibt es auch das [git book] (https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository), um einige grundlegende Konzepte zu liefern. –

Antwort

2

Es gibt drei Dinge hier zu betrachten: die aktuelle commit (verschieden bekannt als HEAD oder @), der Index und die Arbeit Baum.

Der Index wird auch die Staging-Bereich und die Cache genannt. Diese repräsentieren seine verschiedenen Funktionen, da der Index mehr als nur den Inhalt des vorgeschlagenen nächsten Commits enthält. Die Verwendung als Cache ist jedoch größtenteils unsichtbar: Sie verwenden nur Git, und die Cache-Tricks, die Git schnell machen, werden alle unter der Haube durchgeführt, ohne dass ein manueller Eingriff notwendig ist. Sie müssen also nur "zwischengespeichert", um daran zu erinnern, dass einige Befehle --cached, z. B. git diff --cached und git rm --cached verwenden. Einige davon haben zusätzliche Namen (git diff --staged), andere nicht.

Git ist nicht sehr konsequent darüber, wo es jeden dieser Begriffe verwendet, also müssen Sie sie einfach auswendig lernen. Ein Problem scheint zu sein, dass "der Index" für viele Benutzer mysteriös ist. Dies ist wahrscheinlich, weil Sie nicht es direkt sehen können, außer mit git ls-files (das ist kein benutzerfreundliches Kommando: es ist für die Programmierung gedacht, nicht für den täglichen Gebrauch).

Beachten Sie, dass die Arbeit Baum (auch den Arbeits Baum und manchmal das Arbeitsverzeichnis oder Arbeitsverzeichnis genannt) ist ganz getrennt von dem Index. Sie können Dateien im Arbeitsbaum ganz einfach sehen und ändern.

Ich dachte einmal „verfolgt“ war komplizierter, aber es stellt sich heraus, dass verfolgt wahrsten Sinne des Wortes bedeutet im Index ist. Eine Datei wird genau dann verfolgt, wenn anzeigt, dass sie beim nächsten Commit sein wird.

Sie können keine Dateien im Index sehen so leicht, aber sie aus der Arbeit Baum kopieren, in den Index, leicht, mit git add:

git add path/to/file.txt 

kopiert die Datei aus dem Arbeitsbaum in der Index. Wenn es nicht bereits im Index war (wurde nicht verfolgt), ist es jetzt im Index (wird verfolgt).


Daraus folgt:

aufgespürt werden die Dateien alle Dateien, die zu einem bestimmten Zeitpunkt haben, wurden auf die Bühne hinzugefügt?

Nein! Nachverfolgte Dateien sind Dateien im Index gerade. Es ist egal, was in der Vergangenheit passiert ist, in irgendeiner Verpflichtung oder zu irgendeinem Zeitpunkt in der Vergangenheit. Wenn ein Pfad path/to/file.txt im Index jetzt vorhanden ist, wird diese Datei verfolgt.Wenn nicht, wird es nicht verfolgt (und wird möglicherweise auch ignoriert). Wenn sich path/to/file.txt im Index befindet und Sie es herausnehmen, wird die Datei nicht mehr verfolgt. Es kann oder darf nicht in bestehenden Commits sein, und es kann oder auch nicht immer in der Arbeitsbaum sein.

Ist der "Index" der gleiche wie der "Stufe"?

Ja, mehr oder weniger. Verschiedene Dokumente und Leute sind nicht sehr übereinstimmend.

Werden alle gestaffelten Dateien nachverfolgt, aber das Umgekehrte ist nicht unbedingt richtig (Dateien, die einmal bereitgestellt und festgelegt wurden, aber nicht Teil der aktuellen Phase sind)?

Diese Frage durchaus nicht sinnvoll, da „der Staging-Bereich“ ist der Index. Ich denke inszeniert hat keine perfekt definierte Bedeutung, aber ich würde es so definieren. Eine Datei wird inszeniert wenn:

  • es nicht in @/HEAD ist, aber im Index ist, oder
  • ist sowohl in @/HEAD und den Index, und unterscheidet sich in den beiden .

Gleichwertig, könnten Sie „sagen, wenn einige Pfad inszeniert genannt wird, das bedeutet, dass, wenn ich ein neues jetzt machen verpflichten, die Version des neuen Commit dieser Datei wird aus der aktuellen Commit-Version unterschiedlich sein. " Beachten Sie, dass, wenn Sie keine Datei berührt haben, so dass es in der aktuellen Commit und im Index und in der Arbeit-Struktur ist, aber alle drei Versionen übereinstimmen, wird die Datei noch erhalten engagiert sein. Es ist weder "inszeniert" noch "modifiziert".

Woher weiß ich, welche Dateien verfolgt werden?

Während git ls-files können Ihnen sagen, der üblicher Weg, um herauszufinden, ist indirekten: Sie git status laufen.

Woher weiß ich, welche Dateien inszeniert sind?

der obigen Definition Unter der Annahme, müssen Sie Git fragen Sie den aktuellen commit (HEAD/@) und den Index diff. Was zwischen ihnen unterschiedlich ist, wird "inszeniert". Running git status wird diesen Unterschied für Sie tun, und melden Sie die Namen solcher Dateien (ohne detaillierte Diffs anzuzeigen).

Um die detaillierten Diffs zu erhalten, können Sie git diff --cached ausführen, die HEAD gegen Index vergleicht. Dies hat auch den Namen git diff --staged (was ein besserer Name ist - aber vielleicht nur um ärgerlich zu sein, --staged ist nicht als Option zu git rm verfügbar!).

Da es drei Kopien jeder Datei sind, müssen Sie zwei diffs zu sehen, was los ist:

  • vergleichen HEAD vs Index: git diff --cached
  • vergleichen Index vs Arbeit Baum: git diff

Lauf git status läuft beide davon git diff -s für Sie und fasst sie zusammen. Sie können eine noch kürzere Zusammenfassung mit git status --short, wo Sie sehen Dinge wie:

M a.txt 
M b.txt 
MM c.txt 

Die erste Spalte ist das Ergebnis HEAD vs Index Vergleich: eine leere bedeutet das zwei Spiel, ein M bedeutet HEAD und index abweichen . Die zweite Spalte ist das Ergebnis des Vergleichs von Index und Arbeitsbaum: Ein Leerzeichen bedeutet, dass die beiden übereinstimmen, ein M bedeutet, dass sie sich unterscheiden. Die beiden M s in einer Reihe bedeuten alle drei Versionen von c.txt sind unterschiedlich. Sie können die im Index nicht direkt sehen, aber Sie können git diff es!

+0

Danke für diese sehr detaillierte Antwort, sehr hilfreich –

Verwandte Themen