Frage

Wenn ich Änderungen an einer Datei in Git machen, wie kann ich begehen einige der Änderungen nur?

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

War es hilfreich?

Lösung

Sie können mit git add --patch <filename> (oder -p kurz), und git beginnen Sie Ihre Datei in brechen, was es denkt, dass vernünftige „große Stücke“ (Teile der Datei) sind. Es wird dann aufgefordert, sich mit dieser Frage:

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

Hier ist eine Beschreibung der einzelnen Optionen:

  • y Stufe dieses Stück für die nächste commit
  • n Sie dieses Stück nicht für die nächste Stufe begehen
  • q beenden; nicht dieses Stück inszenieren oder einen der verbleibenden hunks
  • a Dieses große Stück inszenieren und alle späteren hunks in der Datei
  • d nicht über diese Hunk Bühne oder einen der später große Stücke in der Datei
  • g ein Stück wählen zu gehen
  • / für ein großes Stück sucht die angegebene Regex passende
  • j lassen Sie dieses Stück unentschieden, siehe nächste unentschieden großes Stück
  • J Dieses großes Stück unentschieden lassen, siehe nächstes Stück
  • k lassen Sie dieses Stück unentschieden, siehe vorheriges unentschieden großes Stück
  • K lassen Sie dieses Stück unschlüssig, siehe vorheriges großes Stück
  • s spaltet das aktuelle Stück in kleinere Brocken
  • e manuell die aktuelle großes Stück bearbeiten
  • ? Drucken großes Stück Hilfe

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

Danach können Sie verwenden:

  • git diff --staged überprüfen, ob Sie die richtigen Änderungen inszenierten
  • git reset -p unstage fälschlicherweise hinzugefügt hunks
  • git commit -v sehen Ihre verpflichten, während Sie die Commit-Nachricht bearbeiten.

Hinweis: Dies ist ganz anders als der git format-patch Befehl ist, dessen Zweck es ist, Daten in eine .patch Dateien zu analysieren zu begehen.

Referenz für zukünftige: Git Tools - Interaktive Staging

Andere Tipps

Sie können mit git add --interactive oder git add -p <file> und dann git commit ( nicht git commit -a); siehe Der interaktive Modus in git-add Manpage oder einfach folgen Anweisungen.

Modern Git hat auch git commit --interactive (und git commit --patch, die Abkürzung ist Option Patch in der interaktiven Festschreibung).

Wenn Sie es von GUI lieber tun, können Sie git-gui verwenden. Sie können einfach Stücke markieren, die Sie aufgenommen haben, wollen in begehen. Ich persönlich finde es einfacher als git add -i verwenden. Andere git GUIs, wie QGit oder GitX, könnte auch auch diese Funktionalität haben.

git gui stellt diese Funktionalität unter der diff-Ansicht. Einfach mit der rechten klicken Sie auf die Zeile (n), die Sie daran interessiert sind, und Sie sollten eine „Stufe diese Zeile zu begehen“ Menüpunkt sehen.

Ich glaube, dass git add -e myfile der einfachste Weg ist (meine Präferenz mindestens), da es einfach mit einem Texteditor öffnet und können Sie wählen, welche Leitung inszenieren wollen und welche Leitung nicht. In Bezug auf Bearbeitungsbefehle:

hinzugefügt Inhalt:

  

hinzugefügt Inhalt wird durch die Linien mit „+“ ab. Sie verhindern, dass durch das Löschen sie alle hinaus Linien Staging.

entfernt Inhalt:

  

Entfernter Inhalt wird durch Linien dargestellt beginnend mit „-“. „-“ Sie können durch die Umwandlung der Inszenierung ihre Entfernung verhindern. Zu einem „“ (Leerzeichen)

modifizierte Inhalt:

  „-“ Linien (Entfernen des alten Inhalt), gefolgt von „+“ Linien (Hinzufügen der Ersatz-Gehalt)

Modified-Gehalt wird durch dargestellt. „-“ Linien „“, und Entfernen von „+“ Sie können durch die Umwandlung der Inszenierung der Modifikation verhindern              Linien. Beachten Sie, dass nur die Hälfte des Paares zu modifizieren ist wahrscheinlich verwirrend Änderungen am Index einzuführen.

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

Wenn Sie vim verwenden, können Sie die hervorragende Plugin flüchtigen genannt versuchen.

Sie können die diff einer Datei zwischen Arbeitskopie und Index mit :Gdiff sehen, und dann Linien oder große Stücke fügen den Index klassische vim diff Befehle wie dp verwenden. Speichern Sie die Änderungen im Index und begehen mit :Gcommit, und du bist fertig.

Sehr gute einleitende Screencasts hier (siehe insbes. Teil 2 ).

würde ich dringend empfehlen die Verwendung von SourceTree von Atlassian. (Es ist kostenlos.) Es ist diese trivial macht. Sie können schnell und einfach einzelne große Stücke von Code oder einzelner Codezeilen inszenieren.

eingeben Bild Beschreibung hier

Bemerkenswert, dass git add --patch für eine neue Datei zu verwenden, Sie müssen zuerst die Datei zu indizieren mit git add --intent-to-add hinzufügen:

git add -N file
git add -p file

Wenn ich eine Menge Veränderungen haben, und werden ein paar Commits Erstellen von den Änderungen am Ende, dann möchte ich, bevor Inszenierung Dinge, die mein Ausgangspunkt vorübergehend speichern.

Wie folgt aus:

$ 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

Whymarrh Antwort ist, was ich in der Regel tun, außer manchmal gibt viele Veränderungen und ich kann sagen, ich könnte einen Fehler machen, während Dinge inszenieren, und ich möchte ein engagierter Zustand ich wieder auf einen zweiten Durchgang fallen kann.

Wenn Sie Emacs verwenden, werfen Sie einen Blick auf Magit , die eine git-Schnittstelle für Emacs zur Verfügung stellt. Es unterstützt hunks (Teile von Dateien) recht gut inszenieren.

IntelliJ IDEA (und ich denke, alle anderen Produkte der Serie) wird für die teilweise zur Unterstützung gebaut verpflichtet seit v2018.1

 image description hier

ähnlich wie jdsumsion Antwort können Sie auch Ihre aktuelle Arbeit bunkern aber dann ein difftool wie meld verwenden, um ausgewählte Änderungen aus dem Versteck zu ziehen. Auf diese Weise können sogar die große Stücke bearbeiten können manuell sehr einfach, die ein bisschen wie ein Schmerz, wenn in git add -p ist:

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

die Stash-Methode verwenden gibt Ihnen die Möglichkeit zu testen, wenn Ihr Code noch funktioniert, bevor Sie zu begehen es.

Für diejenigen, die mit Git Extensions :

Im Fenster Commit, wählen Sie die gewünschte Datei zu teilweise verpflichten, dann wählen Sie den Text, den Sie im rechten Fensterbereich begehen wollen, dann mit der rechten Maustaste auf die Auswahl und wählen Sie ‚Bühne ausgewählt Linien‘ aus dem Kontextmenü.

vim-gitgutter Plugin kann große Stücke inszenieren, ohne vim Editor verlassen mit

:GitGutterStageHunk

Daneben bietet es andere coole Features wie eine diff Zeichen Spalt wie in einigen modernen IDEs

Wenn nur ein Teil großes Stück inszeniert werden sollte vim-Flüchtling

:Gdiff

ermöglicht die visuelle Bereichswahl dann :'<,'>diffput oder :'<,'>diffget auf der Bühne / Revert einzelne Zeile ändert.

Ausprobiert git add -p filename.x, aber auf einem Mac, fand ich GitX ( http://gitx.frim.nl/ oder https://github.com/pieter/gitx ) viel leichter zu begehen genau ich Linien wollte.

Mit TortoiseGit:

  

rechts auf die Datei klicken und Context Menu → Restore after commit verwenden. Dadurch wird eine Kopie der Datei zu erstellen, wie es ist. Dann können Sie die Datei bearbeiten, zum Beispiel in TortoiseGitMerge und rückgängig machen alle Änderungen, die Sie nicht wollen, zu begehen. diese Änderungen Nach dem Speichern können Sie die Datei begehen.

Hinzufügen bei einer früheren Antwort, wenn Sie die Befehlszeile lieber mit, git add -e myfile Eingabe haben Sie die Wahl Zeile für Zeile zu wählen, was Sie verpflichten wollen, weil dieser Befehl einen Editor mit den Unterschieden öffnen wird, etwa so:

Wie Sie können bekannte Zeilen, die mit + beginnen, sind addtions, Linien, die mit - beginnen, sind Deletionen. Also:

  • Um nicht eine Addierstufe nur diese Zeile löschen.
  • Um nicht eine Löschung der Bühne nur - mit Platz ersetzen.

Dies ist, was git add -h sagt über Dateien auf diese Weise das Hinzufügen (Patching-Dateien):

  

hinzugefügt Inhalt              Hinzugefügt Inhalt wird durch die Linien mit „+“ ab. Du kannst              verhindern Staging alle zusätzlich Linien durch sie zu löschen.

     

entfernt Inhalt:              Entfernt Inhalt wird von Linien, beginnend mit vertreten „-“. Du kannst              verhindern, dass ihre Entfernung Inszenierung durch die Umwandlung von „-“ zu einem „“              (Raum).

     

modifizierten Inhalt:              Modifizierte Inhalt wird dargestellt durch „-“ Linien (Entfernen der alten              Inhalt), gefolgt von „+“ Linien (Hinzufügen des Ersatz-Gehalts).              „-“ auf Linien Sie können durch die Umwandlung der Inszenierung der Modifikation verhindern              „“ Und das Entfernen von „+“ Linien. Beachten Sie, dass Modifizieren nur die Hälfte der              Paar ist wahrscheinlich verwirrend Änderungen am Index einzuführen.

Achtung: nicht den Inhalt der Datei ändern, ist dies kein guter Ort, dies zu tun. Ändern Sie einfach den Betreibern gelöscht oder hinzugefügt Linien.

Atom Benutzer, das Paket github interaktive Inszenierung, die im Stil von git gui enthält. Für Verknüpfungen Paktes der Dokumentation rel="nofollow.

Mit Atom ermöglicht mit einem Thema arbeiten, die dunklen Hintergrund hat (standardmäßig git gui einen weißen Hintergrund).

Es ist schon 10 Jahre her, seit diese Frage gestellt wurde. Und ich hoffe, dass diese Antwort auf jemandem von Nutzen sein wird. Wie in der Antwort erwähnt hier , wo GUI ist keine Option, Andrew Shadura der crecord Erweiterung ein ncurses Fenster hilft bringen, in der wir die Linien auswählen zu begehen.

die Erweiterung wie folgt festgelegt:

git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord

cd zu Ihrem git Repo und rufen Sie es wie folgt:

git crecord

Dies würde die ncurses-Schnittstelle aufgerufen, das wie unten gezeigt verwendet werden kann. Drücken Sie die folgenden Tasten in der ncurses Fenster werden bestimmte Aktionen ausführen:

f       hunk toggle fold (arrow keys can also be used)
space   toggle hunk selection
a       toggle commit or amend
c       confirm and open commit window

Screen eine Beispielverwendung zeigt Beispiel

Für Emacs gibt es auch gitsum

git-meld-Index - unter Angabe von der Website:

git-meld-Index läuft meld - oder anderen git difftool (kdiff3, diffuse, etc.) -., Damit Sie interaktiv mit den git Indexänderungen auf der Bühne (auch als git Staging-Bereich bekannt)

Dies ist vergleichbar mit der Funktionalität von git add -p und git add --interactive. In einigen Fällen meld ist einfacher / schneller zu bedienen als git add -p. Das liegt daran, meld können Sie zum Beispiel an:

  • mehr Kontext
  • siehe intra-line diffs
  • Bearbeiten von Hand und 'live' diff-Updates (aktualisierte nach jedem Tastendruck)
  • siehe
  • zu einer Änderung navigieren, ohne ‚n‘ zu jedem sagen, ändern Sie überspringen mögen

Verwendung

In einem Git Repository, führt:

git meld-index

Sie werden sehen, meld (oder Ihre konfigurierten git difftool) Pop-up mit:

links : temporäre Verzeichnis Dateien contining aus der Arbeitsstruktur kopiert

rechts : temporäres Verzeichnis mit dem Inhalt des Index. Dazu gehört auch Dateien, die noch nicht im Index enthalten sind, sind aber modifizierte oder untracked in der Arbeitskopie -. In diesem Fall, dass Sie die Dateiinhalte von HEAD sehen werden

Bearbeiten Sie den Index (rechte Seite), bis glücklich. Denken Sie daran, zu speichern, wenn nötig.

Wenn Sie fertig ist, schließt meld und git-meld-Index wird den Index aktualisiert den Inhalt des temporären Verzeichnisses auf der rechte Seite von meld entsprechen, die Sie gerade bearbeitet werden.

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

oder die Kurzform git add -p filename.txt

... aber für Dateien bereits in Sie Repository, ist es, in s sind viel besser direkt --patch Flagge auf dem Commit-Befehl (wenn Sie eine aktuelle genug Version von git verwenden): git commit --patch filename.txt

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

... und dann die genannten Tasten: (y / n etc) für die Wahl Linien in einbezogen werden die begehen.

Wenn es auf Windows Plattform ist, meiner Meinung nach ist git gui sehr gutes Werkzeug stage / commit paar Zeilen aus unstaged Datei

1. Hunk weise:

  • Wählen Sie die Datei aus unstagged Changes Abschnitt
  • Rechtsklick Stück Code, die inszeniert werden muss,
  • Wählen Sie Stage Hunk for commit

2. Linie weise:

  • Wählen Sie die Datei aus unstagged Changes Abschnitt
  • Wählen Sie die Zeile / Zeilen inszeniert werden
  • Rechtsklick und wählen Sie Stage Lines for commit

3. Wenn Sie die komplette Datei außer paar Zeilen inszenieren wollen:

  • Wählen Sie die Datei aus unstagged Changes Abschnitt
  • Presse Ctrl+T (Stage file to commit)
  • Die ausgewählte Datei bewegt sich nun Section
  • Staged Changes
  • Wählen Sie die Zeile / Zeilen Szene gesetzt werden
  • Rechtsklick und wählen Sie UnStage Lines for commit

git-cola eine große GUI ist und hat auch diese Funktion eingebaut. Wählen Sie einfach die Linien zu Bühne und drücken Sie S . Wenn keine Auswahl getroffen wird, wird das komplette große Stück in Szene gesetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top