¿Cómo puedo fusionar muchas confirmaciones, pero dejar una?

Supongamos que tengo esta twig de function "foo". Ahora quiero fusionarlo de nuevo en el maestro, pero he agregado un código de debugging que no quiero en el maestro.

El código de debugging está en su propia confirmación, por lo que podría usar git cherry-pick en cada confirmación y omitir este compromiso. Pero eso va a ser bastante tedioso.

¿Hay alguna "selección inversa" que hace esto, o una combinación interactiva?

Use rebase interactivo:

 git rebase -i SHA-OF-FIRST-COMMIT-IN-BRANCH 

Eso abrirá algo como esto en tu $ EDITOR:

  pick 8ac4783 folders and folders pick cf8b1f5 minor refactor pick 762b37a Lots of improvement. Folders adn shit. pick 3fae6e1 Be ready to tableview pick b174dc0 replace folder collection view w/ table view pick ef1b65b more finish pick ecc407f responder chain and whatnot pick 080a847 play/pause video pick 6719000 wip: movie fader pick c5f2933 presentation window fade transition # Rebase e6f77c8..c5f2933 onto e6f77c8 # # Commands: # p, pick = use commit # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. # 

Entonces, lo que debes hacer es simplemente eliminar la línea que contiene el commit de debugging, escribir el file y cerrar tu editor, y git te dirá algo como:

 Successfully rebased and updated refs/heads/master. 

Ahora puedes simplemente fusionarte en esa twig para dominar.

ACTUALIZACIÓN: Se debe tener en count que la alteración del historial con rebase solo debería ocurrir en sucursales privadas. Si esta twig ha estado expuesta al público, use git revert según lo propuesto por otro respondedor.

A pesar de lo que otros SCMs usan para significar, en git , git revert es una elección inversa.

Otra idea es agregar la confirmación revertida de la que tiene el código de debugging y fusionarla en su twig principal. Luego eliminamos ese compromiso extra en la twig foo.

 git checkout foo git revert COMMIT_REF_WITH_DEBUG_CODE git checkout master git merge foo git checkout foo git reset --hard HEAD~1 

Asegúrate de que tu tree de trabajo esté limpio. Primero crea la confirmación revertida. Luego, combínalo en maestro. Luego reinicie el puntero de twig de la twig foo al padre de la confirmación revertida, por lo que vuelve a estar en su estado original.

Si no le gusta usar el git reset , puede crear una bifurcación temporal donde crea la confirmación revertida. Al final, eliminas la twig temporal.

Use la database interactiva para eliminar las confirmaciones que no desea.

En una nueva twig "foo-merge" creada a partir de "foo":

 git rebase -i master 

Una vez que esté en modo de edición de compromiso, elimine las líneas que contienen las confirmaciones de debugging, guarde y salga del editor.

Después de volver a basar, simplemente tire foo-merge en master:

 git checkout master git pull . foo-merge 

He tenido éxito con:

 git rebase -p --onto SHA^ SHA 

Donde SHA es la confirmación que desea eliminar.

a través de http://sethrobertson.github.io/GitFixUm/fixup.html#remove_deep