Git Staging: Wann inszenieren? Was tun, wenn danach Änderungen vorgenommen werden?

9

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.

Phil
quelle
1
Ich stelle Dateien bereit, wenn ich eine kleine Arbeit beendet habe (zu klein für ein Commit) oder vor einigen Änderungen, bei denen ich mir nicht sicher bin. Tun Sie, was auch immer für Sie funktioniert. Suchen Sie ein Tool (z. B. Git Gui oder Git Cola), das Ihnen sowohl die Phasen als auch die nicht bereitgestellten Änderungen zeigt ( git diffund git diff --cachedgut sind, aber manchmal möchte ich mehr).
Maaartinus

Antworten:

4

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, Ajedoch 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 Aund eine Version der Datei enthält, Cdie 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 commitgefolgt 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-ffbehält auch bei, dass diese Funktionen in einem eindeutigen Zweig gespeichert sind).

Das heißt, Sie können die Gewohnheit behalten, masternur 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).

wirrbel
quelle
git add -pist so sehr schön.
Vorac
2

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.

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?

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?

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?

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.

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?

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). So gitwill man sicherstellen wissen , was Sie tun.

Fjarri
quelle