Frage Commit nur einen Teil einer Datei in Git


Wenn ich Änderungen an einer Datei in Git vornahm, wie kann ich nur einige der Änderungen übernehmen?

Zum Beispiel, wie könnte ich nur 15 Zeilen von 30 Zeilen, die in einer Datei geändert wurden, festlegen?


2237
2017-07-06 02:25


Ursprung


Antworten:


Sie können verwenden git add --patch <filename> (oder -p kurz, und git beginnt damit, Ihre Datei in sinnvolle "hunks" (Teile der Datei) zu zerlegen. Es wird Sie dann mit dieser Frage auffordern:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Hier ist eine Beschreibung jeder Option:

  • y Stage dieses Stück für den nächsten Commit
  • n Stellen Sie dieses Stück nicht für den nächsten Einsatz bereit
  • q Verlassen; Stage dieses Stück oder irgendeinen der verbleibenden Stücke nicht
  • ein Stage dieses Hunk und alle späteren Hunks in der Datei
  • d Stellen Sie dieses Hunk oder einen der späteren Hunks nicht in die Datei
  • G Wählen Sie ein Stück, zu dem Sie gehen möchten
  • / suche nach einem Brocken, der der gegebenen Regex entspricht
  • j Lassen Sie diesen Hunk unentschieden, sehen Sie den nächsten unbestimmten Brocken
  • J Verlasse dieses Stück unschlüssig, siehe nächstes Stück
  • k Lassen Sie dieses Stück unentschieden, siehe vorheriges unbestimmtes Stück
  • K Verlasse dieses Stück unschlüssig, siehe vorheriges Stück
  • s Teilen Sie das aktuelle Stück in kleinere Stücke
  • e Bearbeiten Sie das aktuelle Hunk manuell
  • ? print große Hilfe

Wenn die Datei noch nicht im Repository vorhanden ist, können Sie dies zuerst tun git add -N <filename>. Danach kannst du weitermachen mit git add -p <filename>.

Danach können Sie verwenden:
git diff --staged um zu überprüfen, ob Sie die richtigen Änderungen vorgenommen haben
git reset -p fälschlicherweise hinzugefügte Hunks auflösen
git commit -v um Ihren Commit anzuzeigen, während Sie die Commit-Nachricht bearbeiten.

Beachten Sie, dass dies viel anders ist als das git format-patch Befehl, der dazu dient, Commit - Daten in ein .patch Dateien.

Referenz für die Zukunft: https://git-scm.com/book/de/v2/Git-Tools-Interactive-Staging


2931
2017-07-06 11:49



Sie können verwenden git add --interactive oder git add -p <Datei>, und dann git commit (nicht  git commit -a); sehen Interaktiver Modus im Git-hinzufügen Manpage oder folgen Sie einfach den Anweisungen.

Moderne Git hat auch git commit --interactive (und git commit --patch, das ist die Abkürzung zur Patch-Option beim interaktiven Commit).

Wenn Sie es bevorzugen, es von der GUI zu tun, können Sie verwenden git-gui. Sie können einfach Chunks markieren, die beim Commit enthalten sein sollen. Ich persönlich finde es einfacher als zu benutzen git add -i. Andere Git-GUIs, wie QGit oder GitX, könnten ebenfalls diese Funktionalität haben.


215
2017-07-06 02:41



git gui stellt diese Funktionalität unter der Diff-Ansicht zur Verfügung. Klicken Sie einfach mit der rechten Maustaste auf die Zeile (n), an der Sie interessiert sind, und Sie sollten einen Menüeintrag "Diese Zeile zum Festschreiben" sehen.


115
2017-09-25 20:45



Ich glaube das git add -e myfile ist der einfachste Weg (zumindest meine Präferenz), da es einfach einen Texteditor öffnet und Sie wählen können, welche Zeile Sie inszenieren möchten und welche nicht. Bezüglich der Bearbeitung von Befehlen:

hinzugefügter Inhalt:

Zusätzlicher Inhalt wird durch Linien dargestellt, die mit "+" beginnen. Sie können das Staging zusätzlicher Zeilen verhindern, indem Sie sie löschen.

entfernter Inhalt:

Entfernter Inhalt wird durch Zeilen dargestellt, die mit "-" beginnen. Sie können verhindern, dass die Entfernung durch das Konvertieren von "-" in "" (Leerzeichen) erfolgt.

modifizierter Inhalt:

Geänderter Inhalt wird durch "-" Zeilen dargestellt (Entfernen des alten Inhalts), gefolgt von "+" Zeilen (Hinzufügen des Ersatzinhalts). Sie können das Staging der Änderung verhindern, indem Sie "-" Zeilen in "" konvertieren und "+" entfernen              Linien. Beachten Sie, dass Änderungen nur an der Hälfte des Paares zu verwirrenden Änderungen am Index führen können.

Alle Details über git add sind verfügbar auf git --help add 


55
2018-02-23 10:37



Wenn Sie vim verwenden, möchten Sie vielleicht das ausgezeichnete Plugin namens Flüchtling.

Sie können den Unterschied einer Datei zwischen Arbeitskopie und Index mit sehen :Gdiffund fügen Sie dem Index dann Zeilen oder Hunks hinzu, indem Sie klassische vim diff-Befehle wie dp. Speichern Sie die Änderungen im Index und committen Sie mit :Gcommit, und du bist fertig.

Sehr gute einleitende Screencasts Hier (siehe esp. Teil 2).


41
2017-08-12 13:32



Ich würde dringend empfehlen, zu verwenden SourceTree von Atlassian. (Es ist kostenlos.) Es macht das trivial. Sie können einzelne Codehälften oder einzelne Codezeilen schnell und einfach aufstellen.

enter image description here


26
2017-12-05 17:29



Bemerkenswert, dass zu verwenden git add --patch Für ein neue Datei Sie müssen zuerst die Datei hinzufügen, mit der indexiert werden soll git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14



Wenn ich viele Änderungen vorgenommen habe und am Ende ein paar Commits aus den Änderungen erstellen würde, möchte ich meinen Startpunkt vorübergehend speichern, bevor ich die Dinge inszeniere.

So was:

$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop

Whymarrhs ​​Antwort ist, was ich normalerweise tue, außer manchmal gibt es viele Veränderungen und ich kann sagen, dass ich einen Fehler machen könnte, wenn ich Dinge inszeniere, und ich möchte einen engagierten Zustand, auf den ich für einen zweiten Durchgang zurückgreifen kann.


17
2017-07-08 07:00



Sollten Sie Emacs verwenden, sehen Sie sich das an Mag, die eine Git-Schnittstelle für Emacs bietet. Es unterstützt Staging-Hunks (Teile von Dateien) ganz gut.


12
2017-08-07 13:25



Ähnlich wie jdsumsions Antwort können Sie auch Ihre aktuelle Arbeit speichern, aber dann ein difftool wie meld verwenden, um ausgewählte Änderungen aus dem Versteck zu ziehen. Auf diese Weise können Sie die Hunks auch sehr einfach manuell bearbeiten, was ein wenig nervig ist git add -p:

$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop

Mit der Stash-Methode haben Sie die Möglichkeit zu testen, ob Ihr Code noch funktioniert, bevor Sie ihn committen.


7
2017-07-27 09:52