Kann eine Datei in Git sowohl inszeniert als auch nicht platziert werden?

8

Während ich an einer anderen Datei arbeitete, habe ich README.md bearbeitet und dann git add README.md ausgeführt. Wenn ich eine git commit mache, sehe ich, dass README.md sowohl in den "Changes committed" als auch in den "Changes not settings for commit" ist.

Macht das Sinn? Wo in .git könnte ich den autorisierenden Zustand dieser Datei sehen?

%Vor%     
Mark Harrison 19.07.2014, 07:21
quelle

4 Antworten

11

Dies bedeutet, dass ein Teil der Änderungen, die Sie vorgenommen haben, für das Festschreiben bereitgestellt werden und der Teil nicht.

Sie können prüfen, was inszeniert wird, wenn Sie

ausführen %Vor%

und überprüfen Sie, was nicht hochgeladen wird, indem Sie

ausführen %Vor%

Die meisten Versionskontrollsysteme speichern im Allgemeinen nur die Änderungen zwischen zwei Zuständen. Die Art und Weise, wie git funktioniert, während Sie mehrere Änderungen an einer Datei vornehmen, müssen Sie alle hinzufügen / markieren, um Teil einer Reihe von Änderungen zu sein. Wenn Sie git add verwenden, geschieht dies automatisch.

Es ist jedoch nicht die einzige Möglichkeit, all Ihre individuellen Änderungen (hunks) zu Ihrem "Index" hinzuzufügen. Sie können beispielsweise mehrere Änderungen an derselben Datei vornehmen und sie in verschiedenen Commits festschreiben oder nur spezifische Änderungen zu einem Commit hinzufügen. Z.B. Um einige Änderungen explizit zu Ihrem "Index" hinzuzufügen, können Sie dies tun, indem Sie git add -p verwenden, um nur einige "hunks" (Gruppen) der Änderungen anstelle der gesamten Liste der Änderungen selbst hinzuzufügen.

Was hier passiert ist, dass die Änderungen, die Sie an README.md vor Staging ( git add ) vorgenommen haben, in Staging angezeigt werden und alle Änderungen, die Sie nach Staging% vorgenommen haben co_de% wird so oft wie oben angezeigt angezeigt.

    
Manquer 19.07.2014, 07:23
quelle
7
  

Wo in .git konnte ich den autorisierenden Zustand dieser Datei sehen?

Verwenden Sie git diff :

  • git diff -- yourFile gibt Ihnen die noch nicht inszenierten Änderungen (noch nicht zum Index hinzugefügt)
  • git diff --cached -- yourFile gibt Ihnen die Änderungen, die dem Index bereits hinzugefügt wurden.

Weitere Informationen finden Sie unter " Änderungen, keine Dateien ":

  

Die meisten Versionskontrollsysteme arbeiten mit Dateien. Sie fügen die Datei der Quellcodeverwaltung hinzu, und das System verfolgt Änderungen ab diesem Zeitpunkt.

     

Git konzentriert sich auf die Änderungen an einer Datei, nicht auf die Datei selbst.   Ein Befehl git add file weist git nicht an, die Datei dem Repository hinzuzufügen, sondern den aktuellen Status der Datei anzugeben, damit sie später festgeschrieben werden kann.

Siehe auch " git add -p : Die mächtigste Git-Funktion, die du noch nicht benutzt hast "

Beachten Sie, dass git status -v -v bald (Git 2.3.4, Q2 2015) Ihnen beide Diffs (inszeniert und nicht-staged) zeigt, möglicherweise verschiedene Diffs für die gleiche Datei auflisten.

Siehe " Show staged & amp; funktionierender Baum in git diff? ".

    
VonC 19.07.2014 07:25
quelle
1

Tatsächlich ist der Zustand, den Sie sehen, sehr einfach zu reproduzieren:

%Vor%

In # 1 erstellen wir die leere Testdatei. # 2 ändert den Inhalt der Datei. Diese Änderungen werden nicht bereitgestellt (da Sie Änderungen explizit mit git add durchführen müssen). Die Ausgabe von git status in # 3 sagt Ihnen genau das.

Um zu sehen, welche Änderungen inszeniert wurden, führen Sie git diff --cached aus. Um zu sehen, welche Änderungen an Ihren Arbeitskopie-Dateien nicht durchgeführt wurden, führen Sie git diff .

aus

Sagen Sie in Ihrer Frage, dass Sie git commit ausgeführt haben. Von Ihrer git status -Ausgabe scheint es, als ob das Commit nicht erstellt wurde, wahrscheinlich weil Sie keine Commit-Nachricht eingegeben haben. Überprüfen Sie die Ausgabe von git commit , git hat Ihnen wahrscheinlich gesagt, was beim Erstellen des Commits falsch gelaufen ist!

    
Alexander Groß 19.07.2014 07:30
quelle
1

Antwort auf "Macht das Sinn?"

Es macht nur Sinn, wenn Sie verstehen, dass git keine Unterschiede speichert, speichert Snapshots.

In dem Beispiel, das Sie beschreiben, gibt es zwei Versionen von README.md in Ihren Änderungen. Die gestaffelte Version ist die Version, mit der Sie zurzeit zufrieden sind, und wird der letzte Snapshot der Datei sein, wenn Sie sich dafür entscheiden, sie zu übernehmen. Die nicht-versionierte Version ist eine mögliche Momentaufnahme, die die aktuell inszenierte Version ersetzt, wenn Sie sie inszenieren möchten.

Lesen Sie den Abschnitt "Snapshots, Not Differences" im folgenden Link, um mehr darüber zu erfahren, wie git funktioniert:

Ссылка

Siehe auch den folgenden Link für eine weitere Erklärung des Szenarios, das Sie in Ihre Frage aufgenommen haben (insbesondere den Abschnitt "Staging Modified Files"):

Ссылка

    
Ben Franklin 19.07.2014 07:56
quelle

Tags und Links