Wie kann ich nur einige der Änderungen festschreiben, wenn ich Änderungen an einer Datei in Git vornehme?
Wie kann ich beispielsweise nur 15 von 30 Zeilen festschreiben, die in einer Datei geändert wurden?
git
git-commit
Freddiefujiwara
quelle
quelle
git gui
=git add -e
>git add -i -p
; in Bezug auf Komfort:git gui
>git add -i -p
>git add -e
. Also: Wählengit gui
Sie, wenn Sie Zugriff auf Xgit add -i -p
haben.git add -e
Antworten:
Sie können verwenden
git add --patch <filename>
(oder-p
kurz), und git beginnt, Ihre Datei in das zu zerlegen, was es für sinnvolle "Hunks" (Teile der Datei) hält. Sie werden dann mit folgender Frage aufgefordert:Hier ist eine Beschreibung jeder Option:
Wenn sich die Datei noch nicht im Repository befindet, können Sie dies zuerst tun
git add -N <filename>
. Danach können Sie fortfahrengit add -p <filename>
.Danach können Sie verwenden:
git diff --staged
um zu überprüfen, ob Sie die richtigen Änderungen vorgenommen habengit reset -p
irrtümlich hinzugefügte Kerle zu entfernengit commit -v
um Ihr Commit anzuzeigen, während Sie die Commit-Nachricht bearbeiten.Beachten Sie, dass dies ein großer Unterschied zu dem
git format-patch
Befehl ist, mit dem Festschreibungsdaten in.patch
Dateien analysiert werden sollen.Referenz für die Zukunft: Git Tools - Interactive Staging
quelle
-p/--patch
eine Verknüpfung zu der Patch-Aktion innerhalb des-i/--interactive
Befehls ist, die den nützlichen interaktiven Modus initiiert .git diff
.e
können Sie das Stück manuell bearbeiten, indem Sie es ersetzen+
oder-
durch#
git push
sagt es schon aktuell. und wenn ich das tue,git diff
sehe ich die Kerle, zu denen ich gesagtn
habe. Wenn ich das tue,git diff --staged
sehe ich das Commit, das ich pushen möchte. Angenommen, ich kann das Commit pushen, wie lösche ich die Hunks, zu denen ich gesagtno
habe?Sie können
git add --interactive
oder verwenden und dann ( nicht ); Siehe Interaktiver Modus in der git-add- Manpage oder folgen Sie einfach den Anweisungen.git add -p <file>
git commit
git commit -a
Modern Git hat auch
git commit --interactive
(undgit commit --patch
, die Abkürzung zur Patch-Option im interaktiven Commit).Wenn Sie es lieber über die GUI tun, können Sie git-gui verwenden . Sie können einfach Chunks markieren, die in Commit enthalten sein sollen. Ich persönlich finde es einfacher als zu benutzen
git add -i
. Andere Git-GUIs wie QGit oder GitX verfügen möglicherweise ebenfalls über diese Funktionalität.quelle
git gui bietet diese Funktionalität in der Diff-Ansicht. Klicken Sie einfach mit der rechten Maustaste auf die Zeile (n), an der Sie interessiert sind, und Sie sollten den Menüpunkt "Diese Zeile zum Festschreiben bereitstellen" sehen.
quelle
gitk
Fall ist , aber in Git Bash für Windows enthalten ist. Sie sollten einen Startmenüeintrag dafür haben oder können ihn mit dem Befehl startengit gui
. Es gibt auchstage this hunk
was wahrscheinlich nützlicher ist alsstage this line
. Könnte neu sein, da diese Antwort vor 10 Jahren erstellt wurde.Ich glaube das
git add -e myfile
ist der einfachste Weg (zumindest meine Präferenz), da dadurch einfach ein Texteditor geöffnet wird und Sie auswählen können, welche Zeile Sie inszenieren möchten und welche nicht. Zu Bearbeitungsbefehlen:hinzugefügter Inhalt:
entfernter Inhalt:
geänderter Inhalt:
Alle Details zu
git add
sind auf verfügbargit --help add
quelle
-e
ist--edit
.git --help add
s
im interaktiven Patch-Modus keine Hunks verkleinern können.git add -e
) den Dateiinhalt auf der Festplatte * nicht * ändert. Es wird nur ein Teil der Änderungen von nicht inszeniert nach inszeniert (Index) verschoben.Wenn Sie vim verwenden, können Sie das hervorragende Plugin namens fugitive ausprobieren .
Sie können den Unterschied einer Datei zwischen Arbeitskopie und Index mit
:Gdiff
anzeigen und dann dem Index Zeilen oder Hunks hinzufügen, indem Sie klassische vim diff-Befehle wie verwendendp
. Speichern Sie die Änderungen im Index und legen Sie fest:Gcommit
, und Sie sind fertig.Sehr gute einführende Screencasts hier (siehe insbesondere Teil 2 ).
quelle
:diffget/:diffput
im visuellen Modus, wo ich bestimmte Zeilen auswählen kann, die ich zurücksetzen / festschreiben möchte. Stellen Sie also noch einmal sicher: vim ist großartig.Ich würde dringend empfehlen, SourceTree von Atlassian zu verwenden. (Es ist kostenlos.) Es macht dies trivial. Sie können einzelne Codeblöcke oder einzelne Codezeilen schnell und einfach bereitstellen.
quelle
Beachten Sie, dass Sie zur Verwendung
git add --patch
für eine neue Datei zuerst die Datei zum Index hinzufügen müssen mitgit add --intent-to-add
:quelle
Wenn ich viele Änderungen vorgenommen habe und am Ende einige Commits aus den Änderungen erstellen werde, möchte ich meinen Startpunkt vorübergehend speichern, bevor ich Dinge bereitstelle.
So was:
Whymarrhs Antwort ist das, was ich normalerweise mache, außer manchmal gibt es viele Änderungen und ich kann sagen, dass ich beim Inszenieren von Dingen einen Fehler machen könnte, und ich möchte einen festen Zustand, auf den ich für einen zweiten Durchgang zurückgreifen kann.
quelle
Wenn Sie Emacs verwenden, schauen Sie sich Magit an , das eine Git-Oberfläche für Emacs bietet. Es unterstützt das Staging von Hunks (Teilen von Dateien) recht gut.
quelle
Intellij IDEA (und ich denke, alle anderen Produkte der Serie) unterstützt seit Version 2018.1 Teil-Commits
quelle
Für diejenigen, die Git Extensions verwenden :
Wählen Sie im Fenster "Festschreiben" die Datei aus, die Sie teilweise festschreiben möchten, wählen Sie dann im rechten Bereich den Text aus, den Sie festschreiben möchten, klicken Sie mit der rechten Maustaste auf die Auswahl und wählen Sie im Kontextmenü die Option "Ausgewählte Zeilen inszenieren".
quelle
s
inszenieren " ist sehr nützlich, um schnell Teile von Dateien für ein Commit bereitzustellen.Ähnlich wie bei der Antwort von jdsumsion können Sie auch Ihre aktuelle Arbeit speichern, aber dann ein Difftool wie meld verwenden, um ausgewählte Änderungen aus dem Speicher zu ziehen. Auf diese Weise können Sie die Hunks sogar sehr einfach manuell bearbeiten, was ein bisschen schmerzhaft ist, wenn Sie
git add -p
:Mit der Stash-Methode können Sie testen, ob Ihr Code noch funktioniert, bevor Sie ihn festschreiben.
quelle
git commit --amend
, scheint es, dass Sie den Stash danach nicht mehr öffnen können, oder gibt es eine Möglichkeit, dies zu tun?Wenn Sie eine vorherige Antwort hinzufügen und die Befehlszeile bevorzugen, können Sie bei der Eingabe
git add -e myfile
zeilenweise auswählen, was Sie festschreiben möchten, da dieser Befehl einen Editor mit den folgenden Unterschieden öffnet:Wie Sie vielleicht
+
wissen, sind Zeilen, die mit beginnen, Hinzufügungen, Zeilen, die mit beginnen,-
Löschungen. Damit:-
Leerzeichen.
Folgendes
git add -h
sagt das Hinzufügen von Dateien auf diese Weise aus (Patchen von Dateien):Achtung: Ändern Sie nicht den Inhalt der Datei, dies ist kein guter Ort, um dies zu tun. Ändern Sie einfach die Operatoren für gelöschte oder hinzugefügte Zeilen.
quelle
Das vim-gitgutter- Plugin kann Hunks inszenieren, ohne den vim-Editor zu verlassen
Daneben bietet es andere coole Funktionen wie eine Diff-Sign-Spalte wie in einigen modernen IDEs
Wenn nur ein Teil des Stücks vim-flüchtig inszeniert werden soll
Ermöglicht dann die Auswahl des Sichtbereichs
:'<,'>diffput
oder:'<,'>diffget
das Stufen / Zurücksetzen einzelner Linienänderungen.quelle
Versucht
git add -p filename.x
, aber auf einem Mac fand ich gitx ( http://gitx.frim.nl/ oder https://github.com/pieter/gitx ) viel einfacher, genau die Zeilen festzuschreiben , die ich wollte.quelle
Mit TortoiseGit:
quelle
Es ist 10 Jahre her, seit diese Frage gestellt wurde. Und ich hoffe, diese Antwort wird jemandem nützlich sein. Wie in der Antwort hier erwähnt , wo GUI keine Option ist, hilft Andrew Shaduras crecord-Erweiterung dabei , ein ncurses-Fenster zu öffnen , in dem wir die zu festschreibenden Zeilen auswählen können.
Richten Sie die Erweiterung wie folgt ein:
cd zu deinem git repo und rufe es wie folgt auf:
Dies würde die ncurses-Schnittstelle aufrufen, die wie unten gezeigt verwendet werden kann. Durch Drücken der folgenden Tasten im Fenster ncurses werden bestimmte Aktionen ausgeführt:
Screencast mit einer Beispielnutzung
quelle
Für Atom- Benutzer enthält das Paket github interaktives Staging im Stil von
git gui
. Verknüpfungen finden Sie in der Dokumentation des Pakets .Mit Atom können Sie mit einem Thema arbeiten, das einen dunklen Hintergrund hat (standardmäßig
git gui
einen weißen Hintergrund).quelle
Für Emacs gibt es auch Gitsum
quelle
git-meld-index - Zitat aus der Website:
git-meld-index führt meld - oder ein anderes Git-Difftool (kdiff3, diffuse usw.) - aus, damit Sie Änderungen am Git-Index (auch als Git-Staging-Bereich bezeichnet) interaktiv inszenieren 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. Das liegt daran, dass Sie mit meld beispielsweise Folgendes tun können:
Verwendungszweck
Führen Sie in einem Git-Repository Folgendes aus:
Sie sehen meld (oder Ihr konfiguriertes Git-Difftool) mit:
LEFT : temporäre Verzeichnis contining Dateien von Ihrem Arbeits Baum kopiert
RECHTS : Temporäres Verzeichnis mit dem Inhalt des Index. Dies schließt auch Dateien ein, die noch nicht im Index enthalten sind, aber in der Arbeitskopie geändert oder nicht verfolgt werden. In diesem Fall wird der Dateiinhalt von HEAD angezeigt.
Bearbeiten Sie den Index (rechte Seite), bis Sie zufrieden sind. Denken Sie daran, bei Bedarf zu speichern.
Wenn Sie fertig sind, schließen Sie meld und git-meld-index aktualisiert den Index so, dass er mit dem Inhalt des temporären Verzeichnisses auf der rechten Seite von meld übereinstimmt, das Sie gerade bearbeitet haben.
quelle
Wenn es auf der
Windows
Plattform ist, ist meiner Meinunggit gui
nach ein sehr gutes Werkzeug fürstage
/commit
wenige Zeilen aus derunstaged
Datei1. Hunk weise:
unstagged Changes
AbschnittStage Hunk for commit
2. Linie weise:
unstagged Changes
AbschnittStage Lines for commit
3. Wenn Sie die gesamte Datei mit Ausnahme einiger Zeilen bereitstellen möchten:
unstagged Changes
AbschnittCtrl+T (Stage file to commit)
Staged Changes
Abschnitt verschobenUnStage Lines for commit
quelle
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, die sich bereits in Ihrem Repository befinden, ist es in s viel besser, das Flag --patch direkt im Befehl commit zu verwenden (wenn Sie eine ausreichend aktuelle Version von git verwenden):
git commit --patch filename.txt
... oder wieder die Kurzform
git commit -p filename.txt
... und dann mit den genannten Schlüsseln (j / n usw.) Zeilen auswählen, die in das Commit aufgenommen werden sollen.
quelle
git add -p filename.txt
" außer weniger Spielraum für Fehler? Wenn Sie die Änderung der Teildatei durcheinander bringen, ist das Rückgängigmachen eines Adds besser als das Rückgängigmachen eines Commits.git-cola ist eine großartige GUI und hat auch diese Funktion eingebaut. Wählen Sie einfach die zu inszenierenden Zeilen aus und drücken Sie S. Wenn keine Auswahl getroffen wird, wird das gesamte Stück bereitgestellt.
quelle