601 Stimmen

Einen Commit mit Git teilweise herauspicken

Ich arbeite an 2 verschiedenen Zweigen: freigeben et Entwicklung .

Ich habe bemerkt, dass ich noch einige Änderungen integrieren muss, die in der freigeben Verzweigung zurück in die Entwicklung Zweigstelle.

Das Problem ist, dass ich nicht die gesamte Commit-Datei benötige, sondern nur einige Brocken in bestimmten Dateien.

git cherry-pick bc66559

reicht nicht aus.

Wenn ich eine

git show bc66559

Ich sehe den Unterschied, weiß aber nicht wirklich, wie ich das teilweise auf meinen aktuellen Arbeitsbaum anwenden kann.

981voto

Cascabel Punkte 449595

Das Wichtigste, was Sie hier brauchen, ist git add -p ( -p ist ein Synonym für --patch ). Auf diese Weise können Sie interaktiv Inhalte hinzufügen und entscheiden, ob die einzelnen Teile hinzugefügt werden sollen oder nicht, und den Patch bei Bedarf sogar manuell bearbeiten.

Zur Verwendung 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!

(Dank an Tim Henigan, der mich daran erinnert hat, dass git-cherry-pick hat eine --no-commit Option, und danke an Felix Rabe für den Hinweis, dass man die git reset . Wenn Sie nur ein paar Dinge aus dem Commit herauslassen wollen, können Sie git reset <path>... um nur diese Dateien freizugeben).

Sie können bestimmte Pfade zu add -p falls erforderlich. Wenn Sie mit einem Patch beginnen, können Sie die cherry-pick con apply .


Wenn Sie wirklich wollen git cherry-pick -p <commit> (diese Option gibt es nicht), können Sie

git checkout -p <commit>

Dadurch wird der aktuelle Commit mit dem von Ihnen angegebenen Commit verglichen und Sie können die Hunks aus diesem Vergleich einzeln anwenden. Diese Option ist nützlicher, wenn der Commit, den Sie heranziehen, Merge-Konflikte in einem Teil des Commits hat, an dem Sie nicht interessiert sind. (Beachten Sie jedoch, dass checkout unterscheidet sich von cherry-pick : checkout versucht zu bewerben <commit> Inhalt vollständig, während cherry-pick wendet die Differenz zwischen dem angegebenen Commit und seinem Parent an. Dies bedeutet, dass checkout kann mehr als nur diesen Commit anwenden, was vielleicht mehr ist, als Sie wollen.)

87voto

Mike Monkiewicz Punkte 3991

Ich weiß, dass ich damit eine alte Frage beantworte, aber es sieht so aus, als gäbe es eine neue Möglichkeit, dies mit dem interaktiven Auschecken zu tun:

git checkout -p bc66559

Kredit an Kann ich interaktiv Hunks aus einem anderen Git-Commit auswählen?

37voto

Jay Swain Punkte 740

Angenommen, die gewünschten Änderungen befinden sich im Kopf des Zweigs, aus dem Sie die Änderungen übernehmen wollen, verwenden Sie git checkout

für eine einzelne Datei:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

für mehrere Dateien einfach aneinanderreihen:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb

16voto

Christian.D Punkte 799

Aufbauend auf Mike Monkiewicz Antwort können Sie auch eine oder mehrere Dateien angeben, die aus dem mitgelieferten sha1/Zweig ausgecheckt werden sollen.

git checkout -p bc66559 -- path/to/file.java 

Auf diese Weise können Sie interaktiv die Änderungen auswählen, die Sie auf Ihre aktuelle Version der Datei anwenden möchten.

2voto

nyanpasu64 Punkte 2407

Wenn Sie eine Liste von Dateien auf der Befehlszeile angeben wollen und das Ganze in einem einzigen atomaren Befehl erledigen wollen, versuchen Sie es:

git apply --3way <(git show -- list-of-files)

--3way : Wenn ein Patch nicht sauber angewendet werden kann, erzeugt Git einen Merge-Konflikt, so dass Sie die Funktion git mergetool . Auslassen von --3way bringt Git dazu, Patches aufzugeben, die sich nicht sauber anwenden lassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X