4 Stimmen

Warum ist manchmal "git commit -a" anstelle von "git commit" notwendig?

Beim Spielen mit Git und GitHub habe ich festgestellt, dass manchmal ein

git commit -a

ist erforderlich, um eine geänderte Datei zu übertragen. (diese Datei wurde dem Projekt bereits hinzugefügt).

Aber manchmal, nur ein

git commit

wird funktionieren. Wenn Sie Mercurial verwenden, kann der Befehl hg com funktioniert immer, wenn es sich um eine Datei handelt, die bereits zuvor zum Projektarchiv hinzugefügt wurde. Ich frage mich also, warum Git die -a manchmal? In einigen Erklärungen taucht das Wort "Staging" auf, aber ich verstehe das Konzept des Staging nicht ganz und wie es mit dem Festschreiben von Änderungen an einer Datei zusammenhängt.

2voto

William Pursell Punkte 188248

Angenommen, Sie haben zwei verschiedene logische Änderungen an einer Datei vorgenommen, wollen aber nur eine davon übertragen. Wenn "git commit" immer alle ihm bekannten Dateien übertragen würde, wäre dieser Vorgang unmöglich. Daher müssen Sie jede Änderung vor dem Commit in einen Zustand versetzen. Wenn Sie "git add filename" ausführen, werden alle Änderungen an dieser Datei übertragen. Übrigens ist "git stage" ein Synonym für "git add", und es könnte die Aktionen deutlicher machen, wenn Sie stattdessen "git stage" verwenden.

Betrachten Sie den Staging-Bereich (den Index) als einen Zwischenbereich zwischen Ihrem Arbeitsverzeichnis und dem Repository. Die Befehle "git add" und "git stage" verschieben Dinge in den Index, und "git commit" verschiebt sie aus dem Index in das Repository. "git commit -a" führt beide Schritte auf einmal aus. Es ist oft sehr nützlich, den Staging-Bereich zu verwenden, um Ihre Übertragungen zu verfeinern, damit Sie genau das übertragen, was Sie wollen.

2voto

eckes Punkte 59894

Ein genauer Blick auf die Man-Seite von git commit beschreibt es:

  • Wenn Sie eine neue Datei zu Git hinzufügen, tun Sie das mit git add . Dies markiert die Datei, die beim nächsten Mal hinzugefügt werden soll. commit (sowie git rm für das Entfernen von Dateien).
  • wenn Sie eine Datei ändern, können Sie auch Folgendes tun git add um sie für die nächste Übertragung zu markieren, aber normalerweise tut man das nicht. In diesem Fall, git commit -a erledigt die Arbeit für Sie:

    Weisen Sie den Befehl an, geänderte und gelöschte Dateien automatisch einzustellen; neue Dateien, die Sie git nicht mitgeteilt haben, sind davon nicht betroffen

Exemple : wenn Sie einen Commit mit nur einigen geänderten Dateien durchführen wollen (z.B. wenn Sie einen Fehler behoben haben, der zwei Dateien betrifft ( one.c , two.c ) und einige Tippfehler in anderen Dateien entfernt haben und die Fehlerbehebungsprüfung getrennt von der Tippfehlerprüfung durchführen möchten), würden Sie eine git add für jede der Fehlerbehebungsdateien und dann Commit:

git add one.c
git add two.c
git commit -m "bugfix checkin" 

Sobald dies geschehen ist, übertragen Sie Ihre Tippfehlerberichtigungen mit

git commit -a -m "fixed typos"

Zum Thema Inszenierung:
git commit überträgt nur Dateien, die auf irgendeine Weise als zu übertragend markiert wurden. Dies kann geschehen durch git add o git rm zum Beispiel. Diese Markierung für die Freigabe wird als Inszenierung .

1voto

VonC Punkte 1117238

Siehe auch den Artikel " Sie könnten Git erfunden haben (und haben es vielleicht schon!) ": Es hilft, wenn Sie Betrachten Sie den Index als eine "Patch-Datenbank". .

Wenn man eine Datei "hinzufügt" (zum "Index", auch bekannt als "Staging Area"), fügt man tatsächlich den Patch hinzu, der durch die in dieser Datei vorgenommenen Entwicklungen repräsentiert wird.
Wenn Sie neue Entwicklungen in derselben Datei vorgenommen haben nach die Aufnahme in den Index, Sie machen tatsächlich einen neuen Patch (mit all den neuen Entwicklungen seit dem letzten " git add "), und diese neuen Entwicklungen müssen hinzugefügt werden (zum Index, der "Patch-Datenbank"), bevor Sie die Übertragung vornehmen können.
Oder Sie können einfach git commit -a in diesem Fall.

1voto

Mark Longair Punkte 412179

Zum Verständnis des Unterschieds zwischen git commit y git commit -a müssen Sie wissen, dass die Index in Git, auch bekannt als die Bereitstellungsraum .

Der Index speichert im Wesentlichen den Zustand jeder Datei, die in die nächste Übertragung einfließen wird. (Mit "Zustand" meine ich hier den genauen Inhalt der Datei, den Git durch seinen Hash identifiziert.) Wenn Sie Folgendes eingeben git commit ohne weitere Parameter, wird git einen neuen Commit machen, in dem die Zustände aller Dateien genau wie im Index sind. Dies kann sich stark von Ihrem Arbeitsbaum unterscheiden, und das ist eine nützliche Funktion von Git, wie ich weiter unten erklären werde.

Was git add ist es, eine Datei "in Szene zu setzen" bzw. ihre aktueller Stand auf den Index. Es spielt keine Rolle, ob die Datei ursprünglich verfolgt wurde oder nicht, Sie sagen: "Bei der nächsten Übertragung soll diese Datei mit genau diesem Inhalt vorhanden sein". Es ist wichtig zu wissen, dass dies den Inhalt aufzeichnet, den Sie hinzufügen wollen, und nicht den Dateinamen - das bedeutet, dass wenn Sie dann weiterhin Änderungen an einer Datei vornehmen, nachdem Sie sie mit git add sehen Sie die Ausgabe von git status das manchmal Leute verwirrt, die von anderen Versionskontrollsystemen kommen:

$ git status
[...]
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   modified:   foo.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   foo.txt

... aber das macht absolut Sinn, wenn man den Index kennt. Sie können die Änderungen sehen, die Sie bereits bereitgestellt haben (d.h. den Unterschied zwischen dem Zustand der Dateien im Index und HEAD, was normalerweise der letzte Commit auf dem Zweig ist, an dem Sie arbeiten) mit:

$ git diff --cached

... und Sie können alle Änderungen, die noch nicht bereitgestellt wurden (d.h. die Differenz zwischen Ihrer Arbeitskopie und dem Index) mit sehen:

$ git diff

Warum ist dies also so nützlich? Im Wesentlichen geht es darum, dass die Geschichte Ihres Projekts am nützlichsten ist, wenn jeder Commit nur eine logisch gruppierte Menge von Änderungen enthält, die eine klar definierte Verbesserung des Projekts darstellen. Je kleiner Sie diese Commits machen können, desto besser, da später das wunderbare Werkzeug git bisect können Sie schnell herausfinden, welche Änderung einen Fehler verursacht hat. Wenn Sie nicht außerordentlich diszipliniert sind, werden Sie bei der Behebung eines Fehlers oft andere Dateien bearbeiten, die Sie nicht wirklich ändern müssen, um das Problem zu beheben, oder Sie werden zwei logisch unterschiedliche Probleme beheben, bevor Sie sich entscheiden, Ihre Änderungen zu übertragen. In diesen Fällen kann der Index Ihnen helfen, die Änderungen zu trennen - einfach git add jede Datei, die Änderungen enthält, die Sie in der ersten Übertragung haben wollen, führen Sie git commit und erstellen dann auf die gleiche Weise die zweite Übertragung. [1]

Wenn Sie sich daran gewöhnt haben und Ihnen der Arbeitsablauf gefällt, werden Sie manchmal nur noch die Bühne benutzen wollen. einige der Änderungen in einer Datei und andere nicht, in diesem Fall sollten Sie sich über git add -p (und dann seine interaktive s y e Optionen!)

Um jedoch auf die ursprüngliche Frage zurückzukommen - was bedeutet git commit -a das anders ist? Im Wesentlichen heißt es: "Bevor du diesen Commit erstellst, überprüfe auch jede Datei, die geändert (oder gelöscht) wurde, auf ihren aktuellen Stand." Wenn Sie also nicht der Meinung sind, dass es sinnvoll ist, die Dateien vor der Übertragung sorgfältig in den Index zu stellen, können Sie einfach immer "git commit -a" verwenden. Ich denke jedoch, dass einer der Vorteile von Git darin besteht, dass es Sie dazu ermutigt, eigene Dateien zu erstellen. schön Übertragungen, und die aktive Nutzung des Indexes ist dabei eine große Hilfe :)


Anmerkungen:

Um die obige Erklärung einfach zu halten, sind einige Aussagen etwas grob (z.B. habe ich nicht erwähnt, dass der Index auch den (nicht-)ausführbaren Zustand der Datei speichert, dass es während einer Zusammenführung mehrere Versionen geben kann, usw. usw.)

[1] Sie sollten damit vorsichtig sein, wenn Sie sicherstellen wollen, dass jeder Commit in Ihrer Historie ordnungsgemäß getestet wurde - wenn das in Ihrem Projekt wichtig ist, sollten Sie den Baum bei jedem neuen Commit testen, bevor Sie ihn pushen...

0voto

vissi Punkte 2356

Prüfen Sie die faq . Kurz gesagt, es macht Git flexibler.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X