Ich habe kürzlich die patch
Option von git für den add
Befehl entdeckt, und ich muss sagen, dass es wirklich eine fantastische Funktion ist. Ich entdeckte auch, dass ein großer Teil durch Drücken der sTaste in kleinere Teile aufgeteilt werden kann , was die Genauigkeit des Festschreibens erhöht. Aber was ist, wenn ich noch mehr Präzision will, wenn das geteilte Stück nicht klein genug ist?
Betrachten Sie zum Beispiel dieses bereits geteilte Stück:
@@ -34,12 +34,7 @@
width: 440px;
}
-/*#field_teacher_id {
- display: block;
-} */
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
+#user-register form.table-form .field-type-checkbox label {
width: 300px;
}
Wie kann ich das Entfernen von CSS-Kommentaren nur zum nächsten Commit hinzufügen? Die s
Option ist nicht mehr verfügbar!
-
Zeichen einfach löschen kann , und Git hat sich beschwert, dass mein Patch nicht angewendet wurde.git add -p
und bearbeitet hättene
, hätte dies nur Auswirkungen auf die Inszenierung, nicht auf Ihren Arbeitsbaum.Nehmen wir an, Sie sehen so
example.css
aus:Lassen Sie uns nun die Stilauswahl im mittleren Block ändern und, während wir gerade dabei sind, einen alten auskommentierten Stil löschen, den wir nicht mehr benötigen.
Das war einfach, jetzt legen wir fest. Aber warten Sie, ich möchte die logische Trennung der Änderungen in der Versionskontrolle für eine einfache schrittweise Codeüberprüfung beibehalten, damit mein Team und ich den Commit-Verlauf problemlos nach Einzelheiten durchsuchen können.
Das Löschen von altem Code ist logisch von der anderen Änderung der Stilauswahl getrennt. Wir werden zwei unterschiedliche Commits benötigen, also fügen wir Hunks für einen Patch hinzu.
Hoppla, es sieht so aus, als wären die Änderungen zu eng, also hat git sie zusammengeschmissen.
Selbst der Versuch, es durch Drücken zu teilen , shat das gleiche Ergebnis, da die Teilung für unsere Präzisionsänderungen nicht detailliert genug ist. Unveränderte Zeilen sind zwischen geänderten Zeilen erforderlich, damit Git den Patch automatisch aufteilen kann.
Lassen Sie es uns also manuell bearbeiten , indem Sie auf drückene
git öffnet den Patch in unserem Editor Ihrer Wahl.
Lassen Sie uns das Ziel überprüfen:
Wir wollen dies in zwei Commits aufteilen:
Beim ersten Festschreiben werden einige Zeilen gelöscht (Entfernen von Kommentaren).
Um die kommentierten Zeilen zu entfernen, lassen Sie sie einfach in Ruhe. Sie sind bereits markiert, um die Löschungen in der Versionskontrolle genau so zu verfolgen, wie wir es möchten.
-/*#field_teacher_id {
- display: block;
-} */
Das zweite Commit ist eine Änderung, die durch Aufzeichnen von Löschungen und Hinzufügungen verfolgt wird:
Löschungen (alte Auswahlzeilen entfernt)
Um die alten Auswahlzeilen beizubehalten (löschen Sie sie während dieses Commits nicht), möchten wir ...
... das bedeutet wörtlich die minus ersetzen
-
Zeichen mit einem LeerzeichenCharakter.
Also diese drei Zeilen ...
-
-form.table-form #field_teacher + label,
-form.table-form #field_producer_distributor + label {
... wird ( beachten Sie das einzelne Leerzeichen in der ersten von allen 3 Zeilen):
form.table-form #field_teacher + label,
form.table-form #field_producer_distributor + label {
Ergänzungen (neue Auswahlzeile hinzugefügt)
Um nicht auf die neue Auswahlzeile zu achten, die während dieses Commits hinzugefügt wurde, möchten wir ...
... was wörtlich bedeutet, die ganze Zeile zu löschen:
+#user-register form.table-form .field-type-checkbox label {
(Bonus: Wenn Sie zufällig vim als Editor verwenden, drücken Sie dd, um eine Zeile zu löschen. Nano- Benutzer drücken Ctrl+ K)
Ihr Editor sollte beim Speichern folgendermaßen aussehen:
Jetzt legen wir fest.
Und um sicherzugehen, sehen wir uns die Änderungen seit dem letzten Commit an.
Perfekt - Sie können sehen, dass nur die Löschungen in diesem atomaren Commit enthalten waren. Jetzt beenden wir den Job und legen den Rest fest.
Schließlich können Sie sehen, dass das letzte Commit nur die Selektoränderungen enthält.
quelle
+
mit#
. Das Ergebnis ist das gleiche, aber möglicherweise ist das Löschen (und das Zurücksetzen) unangenehm oder Sie möchten experimentieren, bevor Sie speichern.r
#
vorbei plus xDWenn Sie Git Gui verwenden können, können Sie Änderungen zeilenweise durchführen. Leider weiß ich nicht, wie ich es über die Kommandozeile machen soll - oder auch wenn es möglich ist.
Eine andere Option, die ich in der Vergangenheit verwendet habe, besteht darin, einen Teil der Änderung zurückzusetzen (den Editor offen zu halten), die gewünschten Bits festzuschreiben, rückgängig zu machen und im Editor erneut zu speichern. Nicht sehr elegant, erledigt aber die Arbeit. :) :)
EDIT (Git-GUI-Verwendung):
Ich bin nicht sicher, ob die Git-GUI in msysgit- und Linux-Versionen identisch ist. Ich habe nur die msysgit-Version verwendet. Unter der Annahme, dass es dasselbe ist, gibt es beim Ausführen vier Bereiche: Im oberen linken Bereich werden die Änderungen Ihres Arbeitsverzeichnisses vorgenommen, unten links werden die Änderungen Ihrer Stufen vorgenommen, oben rechts wird der Unterschied für die ausgewählte Datei angezeigt (sei es das Arbeitsverzeichnis) oder inszeniert), und unten rechts finden Sie eine Beschreibung des Commits (ich vermute, Sie werden es nicht benötigen). Wenn Sie oben rechts auf eine Datei klicken, wird der Unterschied angezeigt. Wenn Sie mit der rechten Maustaste auf eine Diff-Linie klicken, wird ein Kontextmenü angezeigt. Die beiden zu beachtenden Optionen sind "Stage Hunk for Commit" und "Stage Line for Commit". Sie wählen in den Zeilen, die Sie festschreiben möchten, weiterhin "Stage Line for Commit" und sind fertig. Sie können sogar mehrere Linien auswählen und sie inszenieren, wenn Sie möchten.
Zum Festschreiben können Sie entweder das GUI-Tool oder die Befehlszeile verwenden.
quelle
git-gui
aber ich habe keine Ahnung, wie ich das erreichen kann, was Sie beschreiben.Eine Möglichkeit, dies zu tun, besteht darin, den Block zu überspringen,
git add
was auch immer Sie sonst noch benötigen, und ihn danngit add
erneut auszuführen . Wenn dies der einzige Block ist, können Sie ihn aufteilen.Wenn Sie sich Sorgen über die Reihenfolge der Commits machen, verwenden Sie einfach
git rebase -i
.quelle
git add -p
wieder renne , aber ich kann es nicht teilen. Ich verstehe das:Stage this hunk [y,n,q,a,d,/,e,?]?
und wenn ich dann auf 's' drücke, wird die Hilfe gedruckt. Übrigens, meintest duadd patch
nichtpatch add
? Oder gibt es eingit patch
Plugin, das ich installieren sollte?git rebase -i
. Welches ist flexibler alscommit --amend