Teilweise ein Commit mit Git zu knacken

Ich arbeite an 2 verschiedenen Branchen: Veröffentlichung und Entwicklung .

Mir ist aufgefallen, dass ich noch einige Änderungen, die im Release- Zweig festgeschrieben wurden, wieder in den Entwicklungszweig integrieren muss .

Das Problem ist, ich brauche nicht alle Commits, nur einige hunks in bestimmten Dateien, also ein einfaches

git cherry-pick bc66559 

macht den Trick nicht.

Wenn ich a

 git show bc66559 

Ich kann den Unterschied sehen, aber weiß nicht wirklich eine gute Weise, das teilweise auf meinen gegenwärtigen Arbeitsbaum anzuwenden.

   

Das corestü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, sodass Sie entscheiden können, ob jedes einzelne Stück hineingehen soll, und Sie können das Stück sogar manuell bearbeiten.

Um es in Kombination mit Cherry-Pick zu verwenden:

 git cherry-pick -n  # 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, der mich daran erinnert hat, dass git-cherry-pick die Option –no-commit hat, und Felix Rabe, der darauf hingewiesen hat, dass Sie einen Reset durchführen müssen! Wenn Sie nur ein paar Dinge aus dem Commit herauslassen wollen können Sie git reset ... , um nur diese Dateien zu deaktivieren.)

Sie können natürlich spezifische Pfade add -p , add -p bei Bedarf add -p . Wenn du mit einem Patch beginnst, kannst du den cherry-pick durch apply ersetzen.


Wenn du wirklich eine git cherry-pick -p willst (diese Option existiert nicht), kannst du sie verwenden

 git checkout -p  

Dadurch wird das aktuelle Commit gegen das von Ihnen angegebene Commit geändert und Sie können Hunks von diesem Diff einzeln anwenden. Diese Option ist möglicherweise sinnvoller, wenn das Commit, das Sie einbinden, Konflikte in einem Teil des Commits enthält, an dem Sie nicht interessiert sind. (Beachten Sie jedoch, dass der checkout sich von cherry-pick : checkout versucht anzuwenden s Inhalt vollständig, cherry-pick wendet das diff des angegebenen Commits von seinem übergeordneten Element an. Das bedeutet, dass checkout mehr als nur dieses Commit anwenden kann, was mehr als gewünscht sein kann.)

Ich weiß, dass ich eine alte Frage beantworte, aber es sieht so aus, als ob es eine neue Möglichkeit gibt, dies interaktiv zu tun:

 git checkout -p bc66559 

Credit to Kann ich interaktiv Hunks von einem anderen Git Commit auswählen?

Angenommen, die gewünschten Änderungen sind an der Spitze der Verzweigung, von der die Änderungen übernommen werden sollen, 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 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 Antwort können Sie auch eine oder mehrere Dateien zum Auschecken aus dem mitgelieferten sha1 / branch angeben.

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

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

Wenn “partially cherry picking” bedeutet “innerhalb von Dateien, einige Änderungen auswählen, aber andere abcasting”, kann dies durch Einbringen des git stash geschehen:

  1. Mach die volle Kirsche pflücken.
  2. git reset HEAD^ , um das gesamte ausgewählte Commit in nicht gespeicherte Arbeitsänderungen zu konvertieren.
  3. Jetzt git stash save --patch : interaktives Auswählen von unerwünschtem Material zum Speichern.
  4. Git rollt die verdeckten Änderungen von Ihrer Arbeitskopie zurück.
  5. git commit
  6. Werfen Sie den Vorrat an unerwünschten Änderungen weg: git stash drop .

Tipp: Wenn du dem Versteck der unerwünschten Änderungen einen Namen git stash save --patch junk : git stash save --patch junk dann, wenn du vergisst, (7) jetzt zu tun, später wirst du den Stash für das, was er ist, erkennen.