Warum sollte ich Bühne wollen, bevor ich mich in Git engagiere?

102

Ich bin neu in der Versionskontrolle und verstehe, dass beim "Festschreiben" im Wesentlichen ein Backup erstellt wird, während die neue "aktuelle" Version Ihrer Arbeit aktualisiert wird.

Was ich nicht verstehe, ist, wofür Inszenierung aus praktischer Sicht ist. Ist die Inszenierung etwas, das nur im Namen existiert, oder erfüllt es einen Zweck? Wenn Sie sich verpflichten, wird es sowieso alles festlegen, oder?

Bearbeiten: Ich denke, ich kann die Terminologie verwirren. Ist eine "inszenierte" Datei dasselbe wie eine "verfolgte" Datei?

Bürger
quelle
6
Nein. Eine nachverfolgte Datei ist eine Datei, die dem Repository bekannt ist (normalerweise aus einem vorherigen Commit). Eine bereitgestellte Datei wurde dem Index hinzugefügt, der später zum Festschreiben verwendet wird.
Mark Peters

Antworten:

82

Wenn Sie ein Commit durchführen, werden nur die Änderungen im Index (die "bereitgestellten" Dateien) festgeschrieben. Es gibt viele Verwendungsmöglichkeiten dafür, aber das offensichtlichste ist, Ihre Arbeitsänderungen in kleinere, in sich geschlossene Teile aufzuteilen. Möglicherweise haben Sie einen Fehler behoben, während Sie eine Funktion implementiert haben. Sie können git addnur diese Datei (odergit add -p nur einen Teil einer Datei hinzufügen!) Und dann diesen Bugfix festschreiben, bevor Sie alles andere festschreiben. Wenn Sie verwenden, git commit -aerzwingen Sie nur eines addvon allem direkt vor dem Festschreiben. Nicht verwenden, -awenn Sie Staging-Dateien nutzen möchten.

Sie können die bereitgestellten Dateien auch als Zwischenarbeitskopie mit den --cachedzu vielen Befehlen behandeln. git diff --cachedZeigen Sie beispielsweise, wie sich die Phase von der Phase unterscheidet, HEADdamit Sie sehen können, was Sie festlegen möchten, ohne Ihre anderen Arbeitsänderungen zu berücksichtigen.

Ben Jackson
quelle
25
Die andere wirklich häufige Verwendung ist, wenn einige Ihrer Änderungen niemals festgeschrieben werden sollten. Zum Beispiel können Sie die guten Sachen inszenieren, festschreiben und dann die schlechten Sachen wegblasen git reset --hard.
Cascabel
3
@ BenJackson in Ihrem Beispiel, was ist der Unterschied zwischen dem Stage + Commit und einem selektiven Commit? Ich sehe keinen Unterschied.
Eugenio
8
Ich persönlich konnte keine zufriedenstellende Antwort auf die Frage "Was bringt eine Inszenierung?" Frage. Ehrlich gesagt ist es einfach unnötig. Ich verwende bereits eine lokale Niederlassung, daher besteht kein Risiko, dass der Build beschädigt wird. Ich werde erst dann eine Pull-Anfrage veröffentlichen, wenn ich mit meinen Änderungen vollständig zufrieden bin. Ich kann meine Commits bereits logisch aufteilen. Es ist einfach kein Zwischenschritt erforderlich. Als solches benutze ich es nie.
Mrplainswalker
3
Ich glaube nicht, dass Sie die Frage wirklich beantwortet haben. "Aber das offensichtlichste ist, Ihre Arbeitsänderungen in kleinere, in sich geschlossene Teile aufzuteilen." Warum sollte jemand seine Änderungen in kleinere aufteilen wollen? Wenn Sie eine einzelne Fehlerbehebung hinzufügen und festschreiben möchten, bevor Sie den Code korrigieren, den Sie ursprünglich ändern wollten, warum würden Sie diese Fehlerbehebung dann nicht einfach festschreiben, anstatt sie hinzuzufügen und dann festzuschreiben?
Kiwicomb123
1
@ kiwicomb123 Normalerweise, weil Sie diesen Fehler bei der Arbeit an etwas anderem gefunden haben und diesen Fix in einem eigenen Commit mit einer eigenen Protokollnachricht und der Flexibilität haben möchten, diesen Fix woanders zusammenzuführen / zu wählen / neu zu starten.
Ben Jackson
26
  • Der Staging-Bereich gibt die Kontrolle, um das Commit zu verkleinern. Nehmen Sie einfach eine logische Änderung am Code vor, fügen Sie die geänderten Dateien zum Staging-Bereich hinzu. Wenn die Änderungen fehlerhaft sind, überprüfen Sie die Änderungen beim vorherigen Festschreiben oder übernehmen Sie sie auf andere Weise. Dies bietet die Flexibilität, die Aufgabe in kleinere Aufgaben aufzuteilen und kleinere festzuschreiben Änderungen. Mit dem Staging-Bereich ist es einfacher, sich auf kleine Aufgaben zu konzentrieren.
  • Es gibt Ihnen auch das Angebot, eine Pause einzulegen und zu vergessen, wie viel Arbeit Sie vor der Pause geleistet haben. Angenommen, Sie müssen drei Dateien ändern, um eine logische Änderung vorzunehmen, und Sie haben die erste Datei geändert und benötigen eine lange Pause, bis Sie mit den anderen Änderungen beginnen. In diesem Moment können Sie keine Festschreibung vornehmen und möchten nachverfolgen, mit welchen Dateien Sie fertig sind, damit Sie sich nach Ihrer Rückkehr nicht mehr daran erinnern müssen, wie viel Arbeit geleistet wurde. Fügen Sie die Datei also zum Staging-Bereich hinzu, und Ihre Arbeit wird gespeichert. Wenn Sie zurückkommen, tun Sie es einfachgit diff --staged überprüfen , welche Dateien Sie wo geändert haben, und nehmen Sie weitere Änderungen vor.
Tapashee Tabassum Urmi
quelle
13

Ein praktischer Zweck des Staging ist die logische Trennung von Datei-Commits.

Da Sie durch Staging weiterhin Änderungen am Dateiverzeichnis / Arbeitsverzeichnis vornehmen und Teile festschreiben können, wenn Sie der Meinung sind, dass die Dinge fertig sind, können Sie separate Stufen für logisch nicht zusammenhängende Änderungen verwenden.

Angenommen , Sie 4 Dateien haben fileA.html, fileB.html, fileC.htmlund fileD.html. Sie nehmen Änderungen an allen 4 Dateien vor und sind bereit zum Festschreiben, aber Änderungen in fileA.htmlund fileB.htmlsind logisch miteinander verbunden (z. B. dieselbe neue Funktionsimplementierung in beiden Dateien), während Änderungen in fileC.htmlund fileD.htmlgetrennt sind und logisch nicht mit früheren Dateien zusammenhängen. Sie können erste Stufe Dateien fileA.htmlund fileB.htmlund begehen diejenigen.

git add fileA.html
git add fileB.html
git commit -m "Implemented new feature XYZ"

Im nächsten Schritt stellen Sie Änderungen an den verbleibenden zwei Dateien fest und übernehmen diese.

git add fileC.html
git add fileD.html
git commit -m "Implemented another feature EFG"
DarthWader
quelle
6
In diesem Beispiel bin ich mir nicht sicher, ob eine Bereitstellung tatsächlich erforderlich ist. Wenn ich nach dem Bearbeiten aller 4 Dateien nur fileA.html und fileB.html festschreiben möchte, kann ich trotzdem festschreiben, ohne es bereitzustellen. Der Befehl: git commit -m "Implemented new feature XYZ" fileA.html fileB.html würde gut funktionieren, ohne die Befehle git add zu benötigen. Ich komme aus der Subversion-Welt, in der Inszenierung kein Konzept ist, daher bin ich nicht von der Nützlichkeit der Git-Inszenierung überzeugt
Pavan,
5

Es ist einfacher, die Verwendung der git-Befehle zu verstehen, addund commitwenn Sie sich vorstellen, dass eine Protokolldatei in Ihrem Repository auf Github verwaltet wird. Die Protokolldatei eines typischen Projekts sieht für mich möglicherweise folgendermaßen aus:

---------------- Day 1 --------------------
Message: Complete Task A
Index of files changed: File1, File2

Message: Complete Task B
Index of files changed: File2, File3
-------------------------------------------

---------------- Day 2 --------------------
Message: Correct typos
Index of files changed: File3, File1
-------------------------------------------
...
...
...and so on

Normalerweise beginne ich meinen Tag mit einer git pullAnfrage und beende ihn mit einer git pushAnfrage. Alles in einem Tagesbericht entspricht also dem, was zwischen ihnen passiert. Während eines jeden Tages erledige ich eine oder mehrere logische Aufgaben , bei denen einige Dateien geändert werden müssen. Die während dieser Aufgabe bearbeiteten Dateien werden in einem Index aufgelistet.

Jede dieser Unteraufgaben (Aufgabe A und Aufgabe B hier) sind individuelle Commits. Der git addBefehl fügt Dateien zur Liste "Index der geänderten Dateien" hinzu. Dieser Vorgang wird auch als Staging bezeichnet. Der git commitBefehl zeichnet die Änderungen und die entsprechende Indexliste zusammen mit einer benutzerdefinierten Nachricht auf / schließt sie ab.

Denken Sie daran, dass Sie immer noch nur die lokale Kopie Ihres Repositorys ändern und nicht die auf Github. Danach werden alle aufgezeichneten Änderungen zusammen mit Ihren Indexdateien für jedes Commit im Hauptrepository (auf Github) protokolliert, wenn Sie einen "Git-Push" ausführen.

Um beispielsweise den zweiten Eintrag in dieser imaginären Protokolldatei zu erhalten, hätte ich Folgendes getan:

git pull
# Make changes to these files
git add File3 File4
# Verify changes, run tests etc..
git commit -m 'Correct typos'
git push

Kurz gesagt, git addund git commitSie können eine Änderung am Haupt-Repository in systematische logische Unteränderungen aufteilen. Wie andere Antworten und Kommentare gezeigt haben, gibt es natürlich noch viel mehr Verwendungszwecke. Dies ist jedoch eine der häufigsten Verwendungen und ein treibendes Prinzip hinter Git, das im Gegensatz zu anderen populären Systemen wie Svn ein mehrstufiges Revisionskontrollsystem ist.

Cibin Joseph
quelle
2

Der Bereitstellungsbereich hilft uns dabei, die Commits flexibler zu gestalten. Mit Basteln meine ich, die Commits in logische Einheiten aufzuteilen. Dies ist sehr wichtig, wenn Sie eine wartbare Software wünschen. Der naheliegendste Weg, dies zu erreichen:

Sie können mehrere Funktionen / Fehler in einem einzigen Arbeitsverzeichnis bearbeiten und dennoch aussagekräftige Commits erstellen. Es ist auch sehr praktisch, ein einziges Arbeitsverzeichnis zu haben, das alle unsere aktiven Arbeiten enthält. (Dies kann nur ohne Staging-Bereich erfolgen, solange sich die Änderungen niemals mit einer Datei überschneiden. Außerdem haben Sie die zusätzliche Verantwortung, manuell zu verfolgen, ob sie sich überschneiden.)

Weitere Beispiele finden Sie hier: Verwendung des Index

Und das Beste daran ist, dass die Vorteile bei dieser Liste von Workflows nicht aufhören. Wenn ein eindeutiger Workflow angezeigt wird, können Sie fast sicher sein, dass der Staging-Bereich Ihnen dabei hilft.

Andrew Nessin
quelle
1

Ich sehe den Sinn darin, die Bühne zu verwenden, um Commits kleiner zu machen, wie von @Ben Jackson und @Tapashee Tabassum Urmi erwähnt, und manchmal benutze ich es für diesen Zweck, aber ich benutze es hauptsächlich, um meine Commits größer zu machen! Hier ist mein Punkt:

Angenommen, ich möchte eine kleine Funktion hinzufügen, für die mehrere kleinere Schritte erforderlich sind. Ich sehe keinen Grund darin, ein separates Commit für kleinere Schritte durchzuführen und meine Zeitleiste zu überfluten. Ich möchte jedoch jeden Schritt speichern und gegebenenfalls zurückgehen.

Ich inszeniere einfach die kleineren Schritte übereinander und wenn ich der Meinung bin, dass es eines Commits würdig ist, verpflichte ich mich. Auf diese Weise entferne ich die unnötigen Commits von der Timeline und kann den letzten Schritt rückgängig machen (auschecken).

Ich sehe andere Möglichkeiten, dies zu tun (Vereinfachung des Git-Verlaufs), die Sie je nach Ihren Vorlieben verwenden können:

  1. Git-Änderung (die Ihr letztes Commit ändert), die Sie für diesen speziellen Zweck nicht möchten (ich sehe es meistens als schlechtes Commit an und behebe es dann)
  2. Git Rebase, ein nachträglicher Gedanke, der Ihnen und anderen, die Ihr Repository verwenden, ernsthafte Probleme bereiten kann.
  3. Erstellen Sie einen temporären Zweig, führen Sie ihn zusammen und löschen Sie ihn anschließend (was ebenfalls eine gute Option ist, erfordert mehr Schritte, gibt Ihnen aber mehr Kontrolle).
Ali80
quelle
1

Um die Antwort von Ben Jackson zu erweitern , die in Ordnung ist, schauen wir uns die ursprüngliche Frage genau an. (In seiner Antwort erfahren Sie, warum Sie Fragen stellen müssen. Hier geht es mehr darum, was los ist .)

Ich bin neu in der Versionskontrolle und verstehe, dass beim "Festschreiben" im Wesentlichen ein Backup erstellt wird, während die neue "aktuelle" Version Ihrer Arbeit aktualisiert wird.

Das ist nicht ganz richtig. Backups und Versionskontrolle hängen sicherlich zusammen - genau wie stark sie von einigen Dingen abhängen, die in gewissem Maße Meinungsfragen sind -, aber es gibt sicherlich einige Unterschiede, wenn auch nur in der Absicht: Backups sind normalerweise für die Notfallwiederherstellung konzipiert (Computer fällt aus, Feuer zerstört gesamtes Gebäude einschließlich aller Speichermedien usw.). Die Versionskontrolle ist in der Regel für feinkörnigere Interaktionen konzipiert und bietet Funktionen, die Backups nicht bieten. Backups werden normalerweise einige Zeit gespeichert und dann als "zu alt" abgeworfen: Ein frischeres Backup ist alles, was zählt. Die Versionskontrolle speichert normalerweise jede festgeschriebene Version für immer.

Was ich nicht verstehe, ist, wofür Inszenierung aus praktischer Sicht ist. Ist die Inszenierung etwas, das nur im Namen existiert, oder erfüllt es einen Zweck? Wenn Sie sich verpflichten, wird es sowieso alles festlegen, oder?

Ja und nein. Gits Design hier ist etwas eigenartig. Es gibt Versionskontrollsysteme, für die kein separater Staging-Schritt erforderlich ist. Zum Beispiel erfordert Mercurial, das in Bezug auf die Verwendung Git sehr ähnlich ist, keinen separaten hg addSchritt, der über den allerersten hinausgeht, in dem eine brandneue Datei eingeführt wird. Bei Mercurial verwenden Sie den hgBefehl, der ein Commit auswählt. Dann erledigen Sie Ihre Arbeit, führen es aus hg commitund sind fertig. Mit Git verwenden Sie git checkout, 1 dann tun Sie Ihre Arbeit, dann laufen Sie git addund dann git commit. Warum der zusätzliche git addSchritt?

Das Geheimnis hier ist das, was Git auf verschiedene Weise den Index oder den Staging-Bereich oder manchmal - heutzutage selten - den Cache nennt . Dies sind alles Namen für dasselbe.

Bearbeiten: Ich denke, ich kann die Terminologie verwirren. Ist eine "inszenierte" Datei dasselbe wie eine "verfolgte" Datei?

Nein, aber diese sind verwandt. Eine verfolgte Datei ist eine, die im Git-Index vorhanden ist. Um den Index richtig zu verstehen, sollten Sie zunächst die Commits verstehen.


Seit Git Version 2.23 können Sie git switchanstelle von verwenden git checkout. In diesem speziellen Fall machen diese beiden Befehle genau dasselbe. Der neue Befehl existiert, weil git checkouter mit zu vielen Dingen überfüllt war. sie wurde in zwei getrennte Befehle aufzuschlüsseln, git switchund git restorees einfacher und sicherer zu bedienen Git zu machen.


Commits

In Git speichert ein Commit einen vollständigen Snapshot jeder Datei, die Git kennt. (Welche Dateien kennt Git? Wir werden das im nächsten Abschnitt sehen.) Diese Schnappschüsse werden in einer speziellen, schreibgeschützten, schreibgeschützten, komprimierten und duplizierten Form gespeichert, die im Allgemeinen nur Git selbst lesen kann . (In jedem Commit steckt mehr Material als nur dieser Schnappschuss, aber das ist alles, was wir hier behandeln werden.)

Die Deduplizierung hilft beim Speicherplatz: Normalerweise ändern wir nur einige Dateien und führen dann ein neues Commit durch. Daher sind die meisten Dateien in einem Commit meistens dieselben wie die Dateien im vorherigen Commit. Durch die direkte Wiederverwendung dieser Dateien spart Git viel Platz: Wenn wir nur eine Datei berührt haben, nimmt das neue Commit nur Platz für eine neue Kopie. Selbst dann ist es komprimiert - manchmal sehr komprimiert, obwohl dies tatsächlich später geschieht -, sodass ein .gitVerzeichnis tatsächlich kleiner sein kann als die darin enthaltenen Dateien, sobald sie zu normalen Alltagsdateien erweitert wurden. Die Deduplizierung ist sicher, da die festgeschriebenen Dateien für alle Zeiten eingefroren sind. Niemand kann einen ändern, daher ist es sicher, dass Commits von den Kopien des jeweils anderen abhängen.

Da die gespeicherten Dateien in diesem speziellen sind, frozen-for-all-time, Git-nur - Format, obwohl, hat Git zu erweitern heraus jede Datei in eine gewöhnliche Alltag Kopie. Diese gewöhnliche Kopie ist nicht Gits Kopie: Es ist Ihre Kopie, damit zu tun, wie Sie wollen. Git schreibt nur dann an diese, wenn Sie es dazu auffordern, damit Sie mit Ihren Kopien arbeiten können. Diese verwendbaren Kopien befinden sich in Ihrem Arbeitsbaum oder Arbeitsbaum .

Dies bedeutet, dass beim Auschecken eines bestimmten Commits automatisch zwei Kopien jeder Datei vorhanden sind:

  • Git hat eine für alle Zeiten eingefrorene, Git-ified-Kopie im aktuellen Commit . Sie können diese Kopie nicht ändern (obwohl Sie natürlich ein anderes Commit auswählen oder ein neues Commit durchführen können).

  • Sie haben in Ihrem Arbeitsbaum eine Kopie im Normalformat. Sie können alles Mögliche tun, indem Sie einen der Befehle auf Ihrem Computer verwenden.

Andere Versionskontrollsysteme (einschließlich Mercurial wie oben erwähnt) hören hier mit diesen beiden Kopien auf. Sie ändern einfach Ihre Arbeitsbaumkopie und schreiben sie fest. Git ... nicht.

Der Index

Zwischen diesen beiden Kopien speichert Git eine dritte Kopie 2 jeder Datei. Diese dritte Kopie hat das eingefrorene Format , aber im Gegensatz zur eingefrorenen Kopie im Commit können Sie sie ändern. Um es zu ändern, verwenden Sie git add.

Der git addBefehl bedeutet, dass die Indexkopie der Datei mit der Arbeitsbaumkopie übereinstimmt . Das heißt, Sie sagen Git: Ersetzen Sie die im Index enthaltene, nicht duplizierte Kopie im eingefrorenen Format, indem Sie meine aktualisierte Arbeitsbaumkopie komprimieren, sie duplizieren und sie für das Einfrieren in ein neues Commit vorbereiten. Wenn Sie nicht verwenden git add, enthält der Index weiterhin die Kopie im eingefrorenen Format aus dem aktuellen Commit.

Wenn Sie ausführen git commit, packt Git alles, was sich im Index befindet, richtig zusammen , um es als neuen Snapshot zu verwenden. Da Git bereits im eingefrorenen Format vorliegt und vorab dupliziert wurde, muss Git nicht viel zusätzliche Arbeit leisten.

Dies erklärt auch, worum es bei nicht verfolgten Dateien geht. Eine untracked - Datei ist eine Datei , die in Ihrer Arbeit Baum ist aber nicht in Git-Index jetzt . Es spielt keine Rolle, wie die Datei in diesem Zustand endete. Vielleicht haben Sie es von einem anderen Ort auf Ihrem Computer in Ihren Arbeitsbaum kopiert. Vielleicht hast du es hier frisch gemacht. Vielleicht gab es eine Kopie in Gits Index, aber Sie haben diese Kopie mit entfernt git rm --cached. Auf die eine oder andere Weise gibt es hier in Ihrem Arbeitsbaum eine Kopie, aber keine Kopie in Gits Index. Wenn Sie jetzt ein neues Commit durchführen, befindet sich diese Datei nicht im neuen Commit.

Beachten Sie, dass git checkoutzunächst in füllt Git-Index aus der Sie verpflichten überprüfen. Der Index beginnt also mit dem Commit. Git füllt auch Ihren Arbeitsbaum aus derselben Quelle aus. Zunächst stimmen also alle drei überein. Wenn Sie Dateien in Ihrem Arbeitsbaum und in git adddiesen ändern , stimmen nun der Index und Ihr Arbeitsbaum überein. Dann laufen Sie git commitund Git macht ein neues Commit aus dem Index, und jetzt stimmen alle drei wieder überein.

Da Git neue Commits aus dem Index erstellt, können wir die Dinge so formulieren: Der Git-Index enthält das nächste Commit, das Sie planen. Dies ignoriert die erweiterte Rolle, die Gits Index während einer Konfliktzusammenführung übernimmt, aber wir möchten dies vorerst trotzdem ignorieren. :-)

Das ist alles - aber es ist immer noch ziemlich kompliziert! Es ist besonders schwierig, weil es keine einfache Möglichkeit gibt, genau zu sehen, was in Gits Index enthalten ist. 3 Aber es gibt einen Git-Befehl, der Ihnen auf eine ziemlich nützliche Weise sagt, was los ist, und dieser Befehl ist es git status.


2 Technisch gesehen ist dies überhaupt keine Kopie . Stattdessen ist es ein Verweis auf die Git-ified-Datei, vordupliziert und alles. Hier gibt es noch mehr Dinge, wie den Modus, den Dateinamen, eine Staging-Nummer und einige Cache-Daten, damit Git schnell geht. Aber wenn Sie nicht mit einigen der einfachen Befehle von Git arbeiten - git ls-files --stageund git update-indexinsbesondere -, können Sie sich das einfach als Kopie vorstellen.

3 Der git ls-files --stageBefehl zeigt Ihnen die Namen und Staging-Nummern jeder Datei im Git-Index an, aber normalerweise ist dies sowieso nicht sehr nützlich.


git status

Der git statusBefehl funktioniert tatsächlich, indem zwei separate git diffBefehle für Sie ausgeführt werden (und auch einige andere nützliche Dinge ausgeführt werden, z. B. die Angabe, in welchem ​​Zweig Sie sich befinden).

Der erste git diffvergleicht das aktuelle Commit - das für alle Zeiten eingefroren ist - mit dem, was in Gits Index enthalten ist. Für Dateien, die gleich sind , sagt Git überhaupt nichts. Bei Dateien , die sind anders , wird Git Ihnen sagen , dass diese Datei für begehen inszeniert . Dazu gehören alle neuen Dateien-wenn der Commit muss nicht sub.pydrin, aber der Index nicht haben sub.pydarin, so wird diese Datei hinzugefügt-und alle gelöschten Dateien, die waren (und sind) in der begehen , sind aber nicht in der Index nicht mehr ( git rmvielleicht).

Der zweite git diffvergleicht alle Dateien im Git-Index mit den Dateien in Ihrem Arbeitsbaum. Für Dateien, die gleich sind , sagt Git überhaupt nichts. Bei Dateien , die sind anders , wird Git Ihnen sagen , dass diese Datei nicht begehen inszeniert . Im Gegensatz zum ersten Diff enthält diese Liste keine brandneuen Dateien: Wenn die Datei untrackedin Ihrem Arbeitsbaum vorhanden ist, jedoch nicht im Git-Index, fügt Git sie nur der Liste der nicht verfolgten Dateien hinzu . 4

Am Ende, nachdem diese untracked Dateien in einer Liste angesammelt hat , git statusbekannt geben , diejenigen zu Dateien Namen, aber es gibt eine spezielle Ausnahme: wenn die Name eine Datei in einer aufgeführte .gitignoreDatei, die dieses letzte Angebot unterdrückt. Beachten Sie, dass das Auflisten einer verfolgten Datei - eine, die im Git-Index enthalten ist - in a .gitignorekeine Auswirkung hat : Die Datei befindet sich im Index, wird also verglichen und festgeschrieben, selbst wenn sie in aufgeführt ist .gitignore. Die Ignorierdatei unterdrückt nur die Beschwerden über "nicht verfolgte Datei". 5


4 Wenn Sie die Kurzversion von git status- git status -sverwenden, sind die nicht verfolgten Dateien nicht so getrennt, aber das Prinzip ist dasselbe. Wenn Sie die Dateien auf diese Weise akkumulieren, können Sie auch git statuseine Reihe von nicht verfolgten Dateinamen zusammenfassen, indem Sie manchmal nur einen Verzeichnisnamen drucken. Verwenden Sie git status -ualloder, um die vollständige Liste zu erhalten git status -u.

5 Durch das Auflisten einer Datei können auch viele Dateivorgänge wie die nicht verfolgte Datei massenweise hinzugefügtgit add . oder git add *übersprungen werden. Dieser Teil wird etwas komplizierter, da Sie damit git add --forceeine Datei hinzufügen können, die normalerweise übersprungen wird. Es gibt einige andere normalerweise geringfügige Sonderfälle, die sich alle dazu summieren: Die Datei wird .gitignoremöglicherweise besser aufgerufen .git-do-not-complain-about-these-untracked-files-and-do-not-auto-add-themoder ist ebenfalls unhandlich. Aber das ist zu lächerlich, so ist .gitignorees.


git add -u, git commit -aUsw.

Hier gibt es einige nützliche Verknüpfungen:

  • git add .fügt alle aktualisierten Dateien im aktuellen Verzeichnis und in jedem Unterverzeichnis hinzu. Dies .gitignoregilt. Wenn also eine Datei, die derzeit nicht verfolgt wird, nicht beanstandet wird git status, wird sie nicht automatisch hinzugefügt.

  • git add -ufügt automatisch alle aktualisierten Dateien an einer beliebigen Stelle in Ihrem Arbeitsbaum hinzu . 6 Dies betrifft nur nachverfolgte Dateien. Beachten Sie, dass beim Entfernen der Arbeitsbaumkopie auch die Indexkopie entfernt wird (dies git addführt dazu, dass der Index mit dem Arbeitsbaum übereinstimmt ).

  • git add -Aist wie das Laufen git add .von der obersten Ebene Ihres Arbeitsbaums (siehe jedoch Fußnote 6).

Neben diesen können Sie laufen git commit -a, was entspricht in etwa 7 zu laufen git add -uund dann git commit. Das heißt, Sie erhalten das gleiche Verhalten, das in Mercurial praktisch ist.

Ich rate generell von dem git commit -aMuster ab: Ich finde, dass es besser ist, es git statushäufig zu verwenden , die Ausgabe genau zu betrachten und herauszufinden, warum dies der Fall ist, wenn der Status nicht Ihren Erwartungen entspricht. Mit git commit -aist es zu einfach, versehentlich eine Datei zu ändern und eine Änderung festzuschreiben, die Sie nicht festschreiben wollten. Dies ist jedoch meistens eine Frage des Geschmacks / der Meinung.


6 Wenn Ihre Git-Version älter als Git 2.0 ist, seien Sie hier vorsichtig: Funktioniert git add -unur im aktuellen Verzeichnis und in den Unterverzeichnissen. Sie müssen also zuerst auf die oberste Ebene Ihres Arbeitsbaums klettern. Die git add -AOption hat ein ähnliches Problem.

7 Ich sage ungefähr gleichwertig, weil git commit -atatsächlich ein zusätzlicher Index erstellt und dieser andere Index für das Commit verwendet wird. Wenn das Festschreiben funktioniert , erhalten Sie den gleichen Effekt wie beim Ausführen git add -u && git commit. Wenn das Commit nicht funktioniert - wenn Sie Git dazu bringen, das Commit auf eine der vielen Arten zu überspringen, die Sie tun können -, werden danach keine Dateien mehr gespeichert git add, da Git den temporären zusätzlichen Index löscht und wieder den Hauptindex verwendet .

Es gibt zusätzliche Komplikationen, die auftreten, wenn Sie git commit --onlyhier verwenden. In diesem Fall erstellt Git einen dritten Index, und die Dinge werden sehr schwierig, insbesondere wenn Sie Pre-Commit-Hooks verwenden. Dies ist ein weiterer Grund, separate git addOperationen zu verwenden.

torek
quelle
0

Es ist wie ein Kontrollkästchen, mit dem Sie auswählen können, welche Dateien festgeschrieben werden sollen.

Zum Beispiel, wenn ich bearbeitet habe fileA.txtund fileB.txt.Aber ich möchte fileA.txtnur Änderungen von festschreiben . weil ich noch nicht fertig bin mit fileB.txt.

Ich kann einfach verwenden git add fileA.txtund festschreiben git commit -m "changed fileA.txt"und weiterarbeiten fileB.txtund nach Abschluss kann ich fileB.txtleicht festschreiben

Ramoun
quelle