Fixiere nur einen Teil der Datei in Git

Wie kann ich bei Änderungen an einer Datei in Git nur einige der Änderungen vornehmen?

Wie kann ich zum Beispiel nur 15 Zeilen von 30 Zeilen ausführen, die in einer Datei geändert wurden?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara wird am 6. Juli 09 um 05:25 Uhr 2009-07-06 05:25 eingestellt
@ 22 Antworten

Sie können git add --patch <filename> (oder -p kurz) verwenden, und git beginnt, Ihre Datei in "vernünftige" Stücke (Teile der Datei) zu unterteilen. Dann wird er dir diese Frage sagen:

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

Hier ist eine Beschreibung jeder Option:

  • Bereiten Sie dieses Stück für das nächste Commit vor
  • n Setzen Sie dieses Stück nicht für das nächste Commit ein
  • q Ausgabe; Legen Sie dieses Stück oder eines der übrigen Teile nicht ab
  • a legt dieses Stück und alle nachfolgenden Fragmente in die Datei
  • d Fügen Sie diesen Block oder ein späteres Fragment nicht in die Datei ein
  • g Wählen Sie ein Stück aus, zu dem Sie wechseln möchten
  • / Suche nach einem Block, der dem angegebenen regulären Ausdruck entspricht
  • Ich lasse dieses Stück ungelöst, siehe das nächste ungelöste Stück
  • Ich lasse dieses Stück ungelöst, siehe das nächste Stück
  • k lassen dieses Stück ungelöst, siehe vorheriges Stück ungelöst
  • K lässt dieses Stück nicht gelöst, siehe vorheriges Stück
  • s teilt das aktuelle Stück in kleinere Fragmente
  • e den aktuellen Block manuell bearbeiten
  • ? Hilfe drucken

Wenn sich die Datei noch nicht im Repository befindet, können Sie zunächst git add -N <filename> . Danach können Sie mit git add -p <filename> fortfahren.

Danach können Sie verwenden:

  • git diff --staged , um sicherzustellen, dass Sie die korrekten Änderungen vornehmen
  • git reset -p , um versehentlich hinzugefügte Fragmente rückgängig zu machen
  • git commit -v , um das Commit während der Bearbeitung einer Commit-Nachricht anzuzeigen.

Bitte beachten Sie, dass sich dies sehr stark vom Befehl git format-patch , mit dem die .patch Daten der .patch Dateien .patch werden sollen.

Link zur Zukunft: Git Tools - Interaktive Produktion

3149
06 июля '09 в 5:36 2009-07-06 05:36 Die Antwort wird von cloudhead am 06. Juli 09 um 5:36 2009-07-06 05:36 gegeben

Sie können git add --interactive oder git add -p <file> und dann git commit ( nicht git commit -a ); Sehen Sie sich den interaktiven Modus in der git-add- Manpage an oder folgen Sie einfach den Anweisungen.

Modern Git hat auch git commit --interactive (und git commit --patch , was eine Abkürzung zum Patch-Parameter im interaktiven Commit darstellt).

border=0

Wenn Sie dies über die GUI vorziehen, können Sie git-gui verwenden . Sie können einfach die Teile markieren, die Sie in das Commit aufnehmen möchten. Ich persönlich finde es einfacher als git add -i . Andere Git-GUIs wie QGit oder GitX können diese Funktionalität ebenfalls haben.

223
06 июля '09 в 14:49 2009-07-06 14:49 Die Antwort wird von Jakub Narębski am 6. Juli 09 um 14:49 2009-07-06 14:49 gegeben

git gui stellt diese Funktionalität als Diff bereit. Klicken Sie einfach mit der rechten Maustaste auf die für Sie interessante Zeile und Sie werden den Menüpunkt "Diese Zeile zur Korrektur" sehen.

118
06 июля '09 в 5:41 2009-07-06 05:41 Die Antwort wurde von Ionuț G. Stan am 6. Juli 09 um 05:41 am 2009-07-06 05:41 gegeben

Ich glaube, dass git add -e myfile der einfachste Weg ist (zumindest meine Präferenz), weil dadurch einfach der Texteditor geöffnet wird und Sie auswählen können, welche Zeile Sie ausführen möchten und welche nicht. Bearbeitungsbefehle:

Inhalt hinzugefügt:

Der hinzugefügte Inhalt wird durch Zeilen dargestellt, die mit "+" beginnen. Sie können die Erstellung von zusätzlichen Zeilen verhindern, indem Sie sie löschen.

Remote-Inhalt:

Gelöschter Inhalt wird durch Zeichenfolgen dargestellt, die mit "-" beginnen. Sie können das Löschen verhindern, indem Sie "-" in "" (Leerzeichen) konvertieren.

modifizierter Inhalt:

Der geänderte Inhalt wird durch die Zeilen "-" (Löschen des alten Inhalts) dargestellt, gefolgt von den Zeilen "+" (Hinzufügen von Ersatzinhalt). Sie können die Installation einer Änderung verhindern, indem Sie die Zeichenfolgen "-" in "" konvertieren und die "+" - Zeilen entfernen. Denken Sie daran, dass die Änderung nur eines halben Paares wahrscheinlich zu verwirrenden Indexänderungen führt.

git --help add git add sind unter git --help add verfügbar

64
25 сент. Die Antwort wird von theFreedomBanana 25. September gegeben 2015-09-25 23:45 '15 um 23:45 Uhr 2015-09-25 23:45 Uhr

Wenn Sie vim verwenden, können Sie ein großartiges Plugin namens flüchtig testen .

Sie können eine diff-Datei zwischen einer Arbeitskopie und einem Index mit :Gdiff und dann mit klassischen vim diff-Befehlen, z. B. :Gdiff , Zeilen oder Spalten zum Index hinzufügen. Speichern Sie die Änderungen im Index und kopieren Sie sie mit :Gcommit .

Sehr gute Intro-Videos hier (siehe Teil 2 ).

42
23 февр. Die Antwort gibt François am 23. Februar. 2012-02-23 13:37 '12 um 13:37 Uhr 2012-02-23 13:37 Uhr

Ich empfehle die Verwendung von Atlassians SourceTree . (Es ist kostenlos.) Es macht es trivial. Sie können schnell und einfach einzelne Codeteile oder einzelne Codezeilen erstellen.

2019

29
12 авг. Die Antwort wird von user486646 12 aug gegeben. 2014-08-12 16:32 14 am 16:32 2014-08-12 16:32

Um git add --patch für eine neue Datei verwenden zu können, müssen Sie die Datei zunächst mit git add --intent-to-add : zum Index git add --intent-to-add .

 git add -N file git add -p file 
22
05 дек. Die Antwort wird von user1338062 05 dec gegeben. 2014-12-05 20:29 '14 um 20:29 2014-12-05 20:29

Wenn ich viele Änderungen vorgenommen habe und schließlich ein paar Commits aus den Änderungen erstelle, möchte ich meinen Ausgangspunkt vor dem Erstellen von Dingen vorübergehend speichern.

So:

 $ 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 

Whymarhs Antwort ist das, was ich normalerweise tue, abgesehen von der Tatsache, dass manchmal eine Menge Änderungen eintreten, und ich kann sagen, dass ich beim Einstellen der Einstellungen einen Fehler machen kann, und ich möchte, dass sich ein Staat in den zweiten Durchlauf zurückzieht .

19
07 июня '13 в 1:14 2013-06-07 01:14 die antwort ist gegeben jdsumsion 7. juni 13 um 01:14 2013-06-07 01:14

Wenn Sie Emacs verwenden, checken Sie Magit aus , das die Git-Schnittstelle für Emacs bereitstellt. Es unterstützt auch Zwischenfragmente (Teile von Dateien).

12
08 июля '09 в 10:00 2009-07-08 10:00 Antwort von Mark van Lent 8. Juli 09 um 10:00 Uhr 2009-07-08 10:00 Uhr

Wie bei jdsumsion können Sie auch Ihre aktuelle Arbeit ausblenden, dann jedoch ein Difffool (z. B. meld) verwenden, um die ausgewählten Änderungen aus dem Cache zu ziehen. So können Sie die Stücke sogar manuell bearbeiten, was in git add -p etwas schmerzhaft ist:

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

Wenn Sie die Stash-Methode verwenden, haben Sie die Möglichkeit, vor der Ausführung zu testen, ob der Code noch ausgeführt wird.

8
07 авг. antwort gegeben derhoch 07 aug. 2013-08-07 16:25 '13 am 16:25 2013-08-07 16:25

Intellij IDEA (und ich glaube, dass alle anderen Produkte der Serie) seit v2018.1 Unterstützung für Teil-Commits entwickelt haben

2019

28 марта '18 в 10:00 2018-03-28 10:00 Die Antwort wird von Holger Brandl am 28. März 18, 10:00 Uhr, 28.03.08, 28.08. Gegeben

Für diejenigen, die Git Extensions verwenden :

Wählen Sie im Fenster "Kopieren" die Datei aus, die Sie teilweise festschreiben möchten, wählen Sie dann im rechten Bereich den zu korrigierenden Text aus, klicken Sie mit der rechten Maustaste auf die Auswahl, und wählen Sie im Kontextmenü "Ausgewählte Zeilen generieren" aus.

7
27 июля '15 в 12:52 2015-07-27 12:52 Die Antwort ist gegeben srgstm 27. Juli 15 um 12:52 2015-07-27 12:52

Das vim-gitgutter- Plugin kann Hunks erstellen, ohne den vim-Editor zu verlassen

 :GitGutterStageHunk 

Darüber hinaus bietet es andere interessante Funktionen, beispielsweise eine Spalte mit einem anderen Zeichen als bei einigen modernen IDEs.

Wenn nur ein Teil des Hunks vim -fugitive geliefert werden soll

 :Gdiff 

Mit dieser :'<,'>diffput können Sie den Bereich des sichtbaren Bereichs auswählen. Anschließend können Sie folgende :'<,'>diffput oder :'<,'>diffget , um einzelne Zeilen zu ändern / ändern.

6
09 янв. die antwort ist c0ffeeartc 09 jan gegeben. 2015-01-09 20:11 '15 um 20:11 2015-01-09 20:11

Ich habe git add -p filename.x ausprobiert, aber auf einem Mac habe ich festgestellt, dass gitx ( http://gitx.frim.nl/ oder https://github.com/pieter/gitx ) die Zeilen, die ich wollte, viel einfacher macht .

5
16 авг. Antwort gegeben jasongregori 16 Aug. 2011-08-16 02:43 '11 at 2:43 2011-08-16 02:43

Mit TortoiseGit:

Klicken Sie mit der rechten Maustaste auf die Datei und verwenden Sie Context Menu → Restore after commit . Dadurch wird eine Kopie der Datei erstellt. Dann können Sie zum Beispiel die Datei bearbeiten. TortoiseGitMerge und verwerfen Sie alle Änderungen, die Sie nicht vornehmen möchten. Nach dem Speichern dieser Änderungen können Sie die Datei festschreiben.

4
06 апр. Die Antwort gibt Fr0sT 06 Apr. 2015-04-06 19:16 '15 um 19:16 2015-04-06 19:16

git-meld-index - Zitat von der Website:

git -meld-index läuft meld - oder ein beliebiges anderes git diffftool (kdiff3, diffuse usw.) -, damit Sie Änderungen am git-Index (auch als git bezeichnet) interaktiv ändern können.

Dies ähnelt der Funktionalität von git add -p und git add --interactive. In einigen Fällen ist meld einfacher / schneller zu verwenden als git add -p. Dies ist so, weil meld Sie beispielsweise zulässt:

  • mehr kontext sehen
  • siehe intraline Unterschiede
  • Manuelles Bearbeiten und Anzeige der "Live" -Diff-Aktualisierungen (aktualisiert nach jedem Tastendruck)
  • Gehen Sie zur Änderung, ohne n für jede Änderung, die Sie überspringen möchten.

Verwendung von

Führen Sie im git-Repository Folgendes aus:

 git meld-index 

Sie werden sehen, dass die Meldung (oder das konfigurierte Git-Diffftool) durch angezeigt wird

LEFT : Temporäre Verzeichnisdateien, die aus dem Arbeitsbaum kopiert wurden

RECHTS : temporäres Verzeichnis mit Indexinhalt. Dies schließt auch Dateien ein, die noch nicht im Index enthalten sind, aber in der Arbeitskopie geändert oder nicht geprüft wurden. In diesem Fall wird der Inhalt der Datei von HEAD angezeigt.

Bearbeiten Sie den Index (rechts), bis er zufrieden ist. Vergessen Sie nicht zu speichern, wenn nötig.

Wenn Sie fertig sind, schließen Sie die Meldung und git-meld-index aktualisiert den Index so, dass er mit dem Inhalt des temporären Verzeichnisses auf der rechten Seite des gerade bearbeiteten Meldungsbefehls übereinstimmt.

2
04 июля '15 в 23:26 2015-07-04 23:26 Die Antwort wird von Croad > am 4. Juli 15 um 23:26 Uhr 2015-07-04 23:26 gegeben

Emacs hat auch Gibsum

2
13 июля '09 в 0:52 2009-07-13 00:52 Die Antwort ist zut 13. Juli 09 um 0:52 2009-07-13 00:52

Wenn Sie die vorige Antwort git add -e myfile , wenn Sie die Befehlszeile verwenden git add -e myfile geben Sie git add -e myfile , und wählen Sie Zeile für Zeile aus, die Sie git add -e myfile möchten, da mit diesem Befehl ein Editor mit Unterschieden geöffnet wird. Beispiel:

2019

24 авг. Die Antwort wird Beto Aveiga 24 gegeben. 2018-08-24 18:24 '18 um 18:24 Uhr 2018-08-24 18:24

Für Atom- Benutzer enthält das github- Paket eine interaktive git gui style-Einstellung. Etiketten finden Sie in der Verpackungsdokumentation.

Mit Atom können Sie mit einem Motiv mit dunklem Hintergrund arbeiten (standardmäßig hat git gui einen weißen Hintergrund).

1
10 апр. Antwort von Ioannis Filippidis 10 Apr 2018-04-10 05:31 '18 um 17:31 Uhr 2018-04-10 05:31 Uhr

Wie eine Antwort oben zeigt, können Sie git add --patch filename.txt

oder Kurzform git add -p filename.txt

... Für Dateien, die sich bereits in Ihrem Repository befinden, ist es jedoch viel besser, das Flag -patch für den Commit-Befehl zu verwenden (wenn Sie eine relativ neue Version von git verwenden): git commit --patch filename.txt

... oder wieder die Kurzform git commit -p filename.txt

... und dann mit den angegebenen Schlüsseln (J / N usw.) die Zeilen auswählen, die in das Commit aufgenommen werden sollen.

1
30 июня '14 в 11:34 2014-06-30 11:34 Die Antwort wird von Samuel Lampa am 30. Juni 14 um 11:34 Uhr 2014-06-30 11:34 gegeben

git-cola ist eine ausgezeichnete grafische Benutzeroberfläche sowie eine integrierte Funktion. Wählen Sie einfach die Zeilen für die Szene aus und drücken Sie S. Wenn keine Auswahl getroffen wird, wird ein vollständiger Block ausgeführt.

0
27 авг. Die Antwort wird mit AndiDog 27 gegeben. 2015-08-27 14:28 '15 am 14:28 2015-08-27 14:28

Wenn ich auf einer Windows Plattform bin, ist git gui das beste Werkzeug für eine stage / commit mehrerer Zeilen aus einer nicht unstaged Datei.

1. Hank weise:

  • Wählen Sie eine Datei aus dem Abschnitt unstagged Changes
  • Klicken Sie mit der rechten Maustaste auf den Code, den Sie ausführen möchten.
  • Wählen Sie Stage Hunk for commit

2. Linie:

  • Wählen Sie eine Datei aus dem Abschnitt unstagged Changes
  • Wählen Sie die anzuordnende Zeile / Zeile.
  • Wählen Sie Stage Lines for commit

3. Wenn Sie eine vollständige Datei erstellen möchten, mit Ausnahme einiger Zeilen:

  • Wählen Sie eine Datei aus dem Abschnitt unstagged Changes
  • Drücken Sie Ctrl+T (Stage file to commit)
  • Die ausgewählte Datei wird jetzt in den Abschnitt " Staged Changes verschoben.
  • Wählen Sie die anzuordnende Zeile / Zeile.
  • Wählen Sie UnStage Lines for commit
0
28 мая '15 в 15:52 2015-05-28 15:52 Die Antwort wird von Anvesh Yalamarthy am 28. Mai 15 um 15:52 2015-05-28 15:52 gegeben

Weitere Fragen zu Tags oder Frage stellen