Frage

Ich arbeite an zwei verschiedenen Branchen: Release und Entwicklung .

Ich habe bemerkt, ich muss noch einige Änderungen integrieren, die auf die Freigabe begangen wurden Zweig zurück in die Entwicklung Zweig.

Das Problem ist, lege ich nicht alle die Notwendigkeit, nur einige große Stücke in bestimmten Dateien, so dass eine einfache

git cherry-pick bc66559

nicht tut den Trick.

Wenn ich ein

git show bc66559

kann ich das Diff sieht, weiß aber nicht wirklich eine gute Möglichkeit, dass zum Teil meines aktuellen Arbeitsbaum Anwendung.

War es hilfreich?

Lösung

Das Kern, was Sie vorhaben, hier zu wollen, ist git add -p (-p ist ein Synonym für --patch). Dies stellt eine interaktive Art und Weise in Inhalt zu überprüfen, Sie lassen sich entscheiden, ob jedes Stück hineingehen sollte, und sogar lassen Sie manuell den Patch bei Bedarf bearbeiten.

Um es in Kombination mit verwenden herauspicken:

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!

(Danke an Tim Henigan für erinnert mich, dass git-cherry-pick hat eine --no-Commit-Option, und dank Felix Rabe für den Hinweis auf, dass Sie zurücksetzen müssen! Wenn Sie nur ein paar Dinge verlassen wollen heraus der begehen, könnten Sie git reset <path>... zu unstage nur diese Dateien verwenden.)

Sie können natürlich bestimmte Pfade zu add -p bieten, wenn nötig. Wenn Sie mit einem Patch fängst du die cherry-pick mit apply ersetzen könnte.


Wenn Sie wirklich eine git cherry-pick -p <commit> wollen (diese Option nicht vorhanden ist), Ihr Lieblings Verwendung

git checkout -p <commit>

Das wird diff die aktuelle begehen gegen die Sie commit angeben, und lassen Sie große Stücke einzeln von diesem diff anzuwenden. 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 versucht <commit> den Inhalt vollständig anzuwenden, cherry-pick gilt der Unterschied der angegebenen von seinen Eltern begehen. Dies bedeutet, dass checkout mehr anwenden kann als nur das zu begehen, was mehr sein könnte als Sie wollen.)

Andere Tipps

Ich weiß, ich bin eine alte Frage zu beantworten, aber es sieht aus wie es eine neue Art und Weise, dies zu tun mit interaktiv Check-out:

git checkout -p bc66559

Kredit Kann ich interaktiv von einem anderen git hunks holen begehen ?

Unter der Annahme, die gewünschten Änderungen sind an der Spitze der Branche wollen Sie die Änderungen aus, die Verwendung git checkout

für eine einzelne Datei:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

für mehrere Dateien nur daisy chain:

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

Aufbauend auf Mike Monkiewicz beantworten Sie auch eine einzelne oder mehrere Dateien an eine Kasse aus dem mitgelieferten SHA1 / Filiale angeben.

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

Damit können Sie interaktiv die Änderungen holen Sie, um Ihre aktuelle Version der Datei angewendet werden sollen.

Wenn Sie eine Liste der Dateien auf der Kommandozeile angeben möchten, und bekommen das Ganze in einem einzigen Atom-Kommando, versuchen Sie:

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

--3way: Wenn ein Patch gilt nicht sauber, wird Git einen Merge-Konflikt erstellen, damit Sie git mergetool ausführen können. --3way Weglassen macht Git oben auf Patches geben, die nicht sauber gelten.

Wenn „teilweise cherry picking“ bedeutet „innerhalb von Dateien, einige Änderungen der Wahl aber verwerfen andere“, kann es, indem in git stash getan werden:

  1. Sie die vollständige Kirsche Pick.
  2. git reset HEAD^ die gesamte Kirsche gepflückt konvertieren begehen in unstaged Arbeits Änderungen.
  3. Jetzt git stash save --patch. Interaktiv auswählen unerwünschtes Material zu Stash
  4. Git Rollen zurück, um die verstaute Änderungen aus der Arbeitskopie.
  5. git commit
  6. Werfen Sie den Vorrat an unerwünschten Änderungen weg: git stash drop.

Tipp: Wenn Sie den Vorrat an unerwünschten Änderungen einen Namen geben. git stash save --patch junk dann, wenn Sie vergessen, jetzt zu tun (6), später werden Sie das Versteck für erkennen, was es ist

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top