Commit nur ein Teil einer Datei in Git
-
23-08-2019 - |
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?
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.
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.
IntelliJ IDEA (und ich denke, alle anderen Produkte der Serie) wird für die teilweise zur Unterstützung gebaut verpflichtet seit v2018.1
ä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 Platzersetzen.
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
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
- Wählen Sie die Zeile / Zeilen Szene gesetzt werden
- Rechtsklick und wählen Sie
UnStage Lines for commit
Staged Changes
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.