Das Kernstück, das Sie hier wollen, ist git add -p
( -p
ist ein Synonym für --patch
). Dies bietet eine interaktive Möglichkeit zum Einchecken von Inhalten, mit der Sie entscheiden können, ob jeder Hunk eingehen soll, und bei Bedarf können Sie den Patch sogar manuell bearbeiten.
So verwenden Sie es in Kombination mit Cherry-Pick:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Vielen Dank an Tim Henigan, der mich daran erinnert hat, dass git-cherry-pick die Option --no-commit hat, und an Felix Rabe, der darauf hingewiesen hat, dass Sie zurücksetzen müssen! Wenn Sie nur ein paar Dinge aus dem Commit herauslassen möchten , könnten Sie verwenden git reset <path>...
, um nur diese Dateien zu entfernen.)
Natürlich können Sie bei Bedarf bestimmte Pfade add -p
angeben. Wenn Sie mit einem Patch fängst könnten Sie die ersetzen cherry-pick
mit apply
.
Wenn Sie wirklich eine möchten git cherry-pick -p <commit>
(diese Option gibt es nicht), können Sie diese verwenden
git checkout -p <commit>
Dadurch wird das aktuelle Commit von dem von Ihnen angegebenen Commit unterschieden, und Sie können Hunks aus diesem Diff einzeln anwenden. Diese Option kann mehr sinnvoll , wenn der Commit Sie in hat merge Konflikte in einem Teil der du ziehen begehen Sie nicht interessiert sind (Beachten Sie jedoch, dass. checkout
Unterscheidet sich von cherry-pick
: checkout
Versuchen anwenden <commit>
‚s Inhalte vollständig, cherry-pick
gilt die Diff Dies bedeutet, dass checkout
mehr als nur dieses Commit angewendet werden kann, was möglicherweise mehr ist, als Sie möchten.)
cherry-pick -n
anscheinend irgendwann nicht mehr inszeniert wurden - die Konvention besagt definitiv, dass--no-commit
Optionen unmittelbar vor dem Festschreiben aufhören , dh mit allen inszenierten Änderungen. Ich werde den Reset in die Antwort einfügen.git checkout -p <F>
ist nicht erhalten Sie nur die Änderungen von F, erhält man ABCDEF alle zusammen püriert und lässt Sie aussortieren , was Teil , dass Sie wollen . Es ist schmerzhaft, das auf einige der Änderungen von F zu reduzieren. Auf der anderen Seite erhaltengit cherry-pick -n <F>
Sie nur die Änderungen von F - und wenn einige dieser Änderungen in Konflikt stehen, werden Sie hilfreich informiert, damit Sie herausfinden können, wie Sie richtig zusammenführen.git reset
würde die bereitgestellten Dateien entfernen undadd -p
nur "nichts hinzufügen" sagen.Ich weiß, dass ich eine alte Frage beantworte, aber es sieht so aus, als gäbe es einen neuen Weg, dies durch interaktives Auschecken zu tun:
Gutschrift an Kann ich interaktiv Hunks von einem anderen Git-Commit auswählen?
quelle
Angenommen, die gewünschten Änderungen befinden sich am Anfang des Zweigs, in dem Sie die Änderungen vornehmen möchten, verwenden Sie git checkout
für eine einzelne Datei:
für mehrere Dateien nur Daisy Chain:
quelle
Aufbauend auf der Antwort von Mike Monkiewicz können Sie auch eine oder mehrere Dateien angeben, die aus dem mitgelieferten sha1 / branch ausgecheckt werden sollen.
Auf diese Weise können Sie interaktiv die Änderungen auswählen, die Sie auf Ihre aktuelle Version der Datei anwenden möchten.
quelle
Wenn Sie eine Liste von Dateien in der Befehlszeile angeben und das Ganze in einem einzigen atomaren Befehl erledigen möchten, versuchen Sie Folgendes:
git apply --3way <(git show -- list-of-files)
--3way
: Wenn ein Patch nicht sauber angewendet wird, erstellt Git einen Zusammenführungskonflikt, damit Sie ihn ausführen könnengit mergetool
. Durch das Weglassen--3way
gibt Git Patches auf, die nicht sauber angewendet werden.quelle
Wenn "teilweise Kirschernte" "innerhalb von Dateien, einige Änderungen auswählen, andere verwerfen" bedeutet, können Sie Folgendes tun
git stash
:git reset HEAD^
das gesamte von Kirschen gepflückte Commit in nicht inszenierte Arbeitsänderungen umzuwandeln.git stash save --patch
: Wählen Sie interaktiv unerwünschtes Material zum Verstauen aus.git commit
git stash drop
.Tipp: Wenn Sie dem Vorrat an unerwünschten Änderungen einen Namen geben:
git stash save --patch junk
Wenn Sie jetzt vergessen (6), erkennen Sie den Vorrat später als das, was er ist.quelle
Verwenden Sie
git format-patch
diese Option, um den Teil des Commits, den Sie interessieren, herauszuschneiden undgit am
auf einen anderen Zweig anzuwendenquelle