Wie entferne ich interaktiv ein bestimmtes Stück Git?

106

Wenn ich in git ein paar Hunks aus derselben Datei in meinem Index habe, wie kann ich dann einen von ihnen interaktiv entfernen?

Gibt es eine Alternative zum Aufheben der Bereitstellung der gesamten Datei und zum erneuten Bereitstellen der Hunks, die ich behalten möchte, oder zum manuellen Rückgängigmachen der Änderungen an der Arbeitskopie und zum interaktiven Hinzufügen dieser rückgängig gemachten Änderungen?

Andrew Grimm
quelle

Antworten:

135

Versuchen Sie es git reset --patch filename; Dies sollte git add --patchlaut Dokumentation das Gegenteil von tun . Die Kurzform -pfunktioniert auch für beide Befehle.

Aasmund Eldhuset
quelle
Ich glaube nicht, dass meine Version es hat (es ist 1.6.3.3), aber das sieht nach der richtigen Antwort aus.
Andrew Grimm
2
In diesem Fall (und unter der Annahme, dass Sie aus irgendeinem Grund kein Upgrade durchführen können) empfehle ich, dass Sie git stash save --keep-indexIhre aktuellen Änderungen an der Arbeitskopie speichern und zurücksetzen. Anschließend können Sie Ihre Datei zurücksetzen und die gewünschten Änderungen rückgängig machen. Wenn Sie die Datei zuerst an einen temporären Speicherort kopieren, können diffSie die rückgängig gemachten Änderungen speichern. Anschließend können Sie die Datei wieder hinzufügen (kein interaktives Hinzufügen erforderlich, da Sie die anderen Änderungen, an denen Sie nicht interessiert waren, verstaut haben). Verwenden Sie diese Option git stash pop, um die alten Änderungen diffwiederherzustellen und die Änderungen, die Sie rückgängig gemacht haben, anzuwenden. Ziemlich umständlich ... :-(
Aasmund Eldhuset
The short form -p also works for both commands... Du meinst git reset -p filename?
Nawaz
1
@Nawaz: Das ist richtig - git add -p filenameÄnderungen aus dieser Datei werden git reset -p filenameselektiv inszeniert und Änderungen werden selektiv aufgehoben. Es gibt auch git checkout -p -- filenameeine Möglichkeit, Änderungen aus einer Datei selektiv zu verwerfen. Warnung: Jedes von addund resetkann verwendet werden, um das andere der beiden rückgängig zu machen. Wenn Sie jedoch diese Form verwenden checkout, um eine Änderung zu verwerfen, können Sie sie nicht zurückerhalten.
Aasmund Eldhuset
2

git guihat eine anständige GUI, um interaktiv Hunks oder Lines zu inszenieren oder zu entfernen. Es gibt hübschere / bessere GUI-Clients, die jedoch git guileichtgewichtig, integriert und plattformübergreifend sind (lin, win, mac).

https://git-scm.com/docs/git-gui

Klicken Sie einfach mit der rechten Maustaste auf ein Stück, um die Bühne zu verlassen. Markieren Sie bei Linien zuerst die Linien und klicken Sie dann mit der rechten Maustaste.

wisbucky
quelle
-1

GitX hat eine schöne Benutzeroberfläche zum Aufheben der Bereitstellung von Teilen einer Datei: Geben Sie hier die Bildbeschreibung ein

Der offizielle Client wurde seit einiger Zeit nicht mehr gewartet, aber in einigen Kreisen ist ein Fork Over bei GitHub mit mehr Funktionen beliebt. ( Blogbeitrag darüber )

John Douthat
quelle
1
Für die Windows-Benutzer da draußen hat Git Extensions eine ähnlich schöne Benutzeroberfläche.
Aasmund Eldhuset
4
Das git gui
Gleiche gilt für das Eingebaute
1
SourceTree (Windows + Mac) hat auch eine schöne Benutzeroberfläche dafür.
Chrnola
Ich sollte jetzt die neueren grafischen Git-Clients erwähnen - GitKraken ist wunderschön und unterstützt dies (obwohl es jetzt eine hohe Gebühr für die kommerzielle Nutzung gibt). GitHubs Desktop von GitHub ist kostenlos, schön und unterstützt das einfache Staging und Unstaging von Hunks. GitKraken und GitHub Desktop sind beide plattformübergreifend, aber keine Open Source.
Jdgregson