Der Zweck des Staging-Bereichs besteht darin, einen flexiblen Bereich für Ihr Commit bereitzustellen. Ich denke, dies wird klarer, wenn Sie git mit zentralisierten Versionskontrollsystemen wie Subversion vergleichen.
Subversion
In Subversion können Sie festlegen, dass bestimmte Dateien Ihrer Arbeitskopie festgeschrieben werden. Aber nur die kompletten Dateien. Jetzt: Was ist, wenn Sie eine Datei bereitstellen möchten A
, nicht eine Datei B
, und die Teile der Datei C
, die sich auf die Datei beziehen, A
jedoch nicht die Teile, die von Änderungen in der Datei abhängen B
(seitdem hätten Sie ein Problem mit der Festschreibungskonsistenz).
Git
Git löst dieses Problem, indem die Bereitstellung als zweite Arbeitskopie bereitgestellt wird. Innerhalb des Staging-Bereichs stellen Sie einen Schnappschuss zusammen, den Sie (grob gesagt) festschreiben werden.
Daher können Sie im Staging-Bereich einen Snapshot erstellen, der Änderungen an A
und eine Version der Datei enthält, C
die nur die Änderungen in widerspiegelt A
.
Für die spezifischen Fragen
Sie können jederzeit inszenieren. Ich persönlich bevorzuge es, direkt vor dem Start des Commits zu inszenieren.
Wenn Änderungen an einer Datei bereitgestellt und diese Datei dann in der Arbeitskopie geändert werden, haben Sie die bereitgestellte Datei natürlich nicht geändert. Sie können entweder entscheiden, ob Sie diese auch inszenieren möchten oder nicht. Das heißt, wenn Sie ausführen git gui citool
, werden Sie Unterschiede zwischen bereitgestellten und nicht bereitgestellten Versionen sehen (nette und einfache Tools für das zeilenweise Bereitstellen und Festschreiben).
Git ist hier vorsichtig, was wahrscheinlich eine gute Sache ist.
Allgemeine Festschreibungsstrategie: Granulare Festschreibungen
Ich denke, wenn man über die Frage "Wann sollte ich inszenieren" spricht, sollte man auch über Commit-Gewohnheiten sprechen.
Zentralisiertes VCS
In zentralisierten Versionskontrollsystemen, in denen Sie sich auf einen zentralen Server festlegen, war es für Ihre Mitarbeiter wichtig, dass Ihre Festschreibungen vollständig und gut getestet sind. Daher würden die Benutzer versuchen, nicht so oft einen Commit durchzuführen und dann den Status vollständiger Dateien festzuschreiben, um die Möglichkeit eines Fehlers zu minimieren. Daher sind Commits in der Regel ziemlich große Blöcke, die viele Änderungen enthalten (wenn es sich nicht um einfache Korrekturen handelt). Die Änderungen in einem Commit können völlig unabhängig sein.
Git
In Git wird ein Commit lokal ausgeführt. Wenn Sie sie nur auf einen Server übertragen, werden sie öffentlich. Daher ist ein Commit in gewissem Sinne billig . Ein Commit im Sinne der Subversion ist eher vergleichbar mit mehreren, git commit
gefolgt von git push
. Dieser Unterschied ist wichtig.
Mit Git können Sie einzelne Codezeilen festschreiben, auch wenn Sie auch andere Zeilen in derselben Datei geändert haben. Dies bietet Ihnen viele Vorteile, da Sie beispielsweise einen Sicherheitsfehler in Zeile 100 festschreiben können, während Sie die Zeilen 300 bis 350 geändert haben, um eine neue Funktion einzuführen.
- Sie können verschiedene Änderungen in verschiedenen Commits trennen. Dies trennt sie gut in Ihrem Versionsverlauf und ermöglicht es Ihnen sogar, das eine, aber nicht das andere zurückzusetzen.
- Ihr Commit muss nicht unbedingt einen "Kompilierungs" -Status Ihrer Arbeitskopie widerspiegeln (obwohl ich versuche, dies so zu halten).
Wo also befindet sich die "Qualitätskontrolle" und die Build-Garantie in einem Commit, die ein Subversion-Benutzer erwarten würde? Es wird auf andere Aktionen in Git verschoben. Sie möchten weiterhin einen funktionierenden Status des Programms in einem öffentlichen Repository veröffentlichen. Stellen Sie daher sicher, dass die Tests erfolgreich sind und das Programm funktioniert, bevor Sie Ihre Änderungen veröffentlichen.
Versuchen Sie auch, Zweige maximal zu nutzen. Wenn Sie viele kleine Änderungen vornehmen, erhalten Sie einen ziemlich großen Versionsverlauf. Wenn Sie in Zweigen arbeiten, können Sie diese granularen Commits nach dem Zweignamen kategorisieren und dann wieder zusammenführen (die Option --no-ff
behält auch bei, dass diese Funktionen in einem eindeutigen Zweig gespeichert sind).
Das heißt, Sie können die Gewohnheit behalten, master
nur dann mit dem Zweig zu verschmelzen , wenn sich der Zweig in einem guten Zustand befindet. Sie können Tags auch verwenden, um Meilensteine und Veröffentlichungen zu verfolgen.
Zurück zum Staging: Sobald Sie einige Zeilen pro Commit festgeschrieben haben, werden Sie direkt vor dem Festschreiben inszeniert. (Zumindest mache ich das so).
git diff
undgit diff --cached
gut sind, aber manchmal möchte ich mehr).