Ich bin ziemlich neu in der weiten Welt von Git. Ich habe das Handbuch gelesen und geübt, bin aber verwirrt über einige Aspekte, die ich nach der Suche nicht herausfinden konnte.
Ich frage mich:
Wann ist in einem Projekt (Post First Commit) der richtige Zeitpunkt, um Quelldateien bereitzustellen? Kurz vor dem Festschreiben? Direkt nach dem Hinzufügen / Löschen oder Ändern?
Was passiert mit Git, wenn Dateien auf halbem Weg zwischen zwei Commits bereitgestellt werden und dann geändert werden? Muss es sich um Inhaltsänderungen kümmern, als es angegeben wurde und was es seitdem geworden ist?
Wenn ich eine neue Datei erstelle, sie inszeniere und dann löschen möchte, warum fordert Git mich auf, das Flag "-f" zu verwenden, und eine einfache Datei "git -rm file.ext" funktioniert nicht?
Ich habe "Was Stufe bedeutet" und verschiedene andere Themen des Handbuchs und anderer Tutorials auf Git gelesen, aber wie gesagt, ich verstehe die oben genannten Dinge immer noch nicht.
Wenn Sie könnten, beantworten Sie die Fragen bitte mit Ihren eigenen Worten und Beispielen, damit ich sie besser verstehen kann.
Vielen Dank.
git diff
undgit diff --cached
gut sind, aber manchmal möchte ich mehr).Antworten:
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 DateiB
, und die Teile der DateiC
, die sich auf die Datei beziehen,A
jedoch nicht die Teile, die von Änderungen in der Datei abhängenB
(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 widerspiegeltA
.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 vongit 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.
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).
quelle
git add -p
ist so sehr schön.Ich denke du nimmst es zu ernst. Beim Staging wird nur das ausgewählt, was Sie in das nächste Commit aufnehmen möchten. Es ist sehr selten wichtig, wann oder wie Sie die Inszenierung durchführen. und wenn Sie zu einem bestimmten Zeitpunkt viele inszenierte und nicht inszenierte Änderungen haben, müssen Sie wahrscheinlich Ihren Entwicklungsprozess überarbeiten.
Normalerweise mache ich das direkt vor dem Festschreiben (es sei denn, ich bemerke einen Tippfehler, also muss ich im letzten Moment eine Korrektur vornehmen und sie auch inszenieren). Der Prozess ist der folgende: Bearbeiten, Tests ausführen, Stufe, Festschreiben. Wenn Sie vor dem Test eine Phase durchführen, besteht die Möglichkeit, dass die Tests fehlschlagen, und Sie müssen Änderungen vornehmen und diese ebenfalls durchführen. Warum sollten Sie sie nicht bis zur Festschreibungszeit belassen?
Es zeigt Ihnen den Unterschied zwischen dem aktuellen Status des Repos und (letzte Festschreibung + inszenierte Änderungen). Wenn Sie einige der neuen Änderungen vornehmen, wird nur der Status (letzte Festschreibung + bereitgestellte Änderungen) neu berechnet.
Jetzt rate ich hier, aber es liegt wahrscheinlich daran, dass die bereitgestellten Informationen wichtig sein könnten (sonst würden Sie sie nicht bereitstellen), aber sie stehen noch nicht unter Versionskontrolle (wie eine Datei, mit der Sie sie entfernen können
git -rm
). Sogit
will man sicherstellen wissen , was Sie tun.quelle