git - tag - ¿Cómo puedo fusionar muchas confirmaciones, pero dejar una?
git ver archivos modificados (5)
Supongamos que tengo esta rama de función "foo". Ahora quiero fusionarlo de nuevo en el maestro, pero he agregado un código de depuración que no quiero en el maestro.
El código de depuración 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?
A pesar de lo que otros SCMs usan para significar, en git
, git revert
es una elección inversa.
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
Otra idea es agregar la confirmación revertida de la que tiene el código de depuración y fusionarla en su rama principal. Luego eliminamos ese compromiso extra en la rama 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 árbol de trabajo esté limpio. Primero crea la confirmación revertida. Luego, combínalo en maestro. Luego reinicie el puntero de rama de la rama 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 rama temporal.
Use la base de datos interactiva para eliminar las confirmaciones que no desea.
En una nueva rama "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 depuración, guarde y salga del editor.
Después de volver a basar, simplemente tire foo-merge en master:
git checkout master
git pull . foo-merge
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 la confirmación de depuración, escribir el archivo y cerrar el editor, y git te dirá algo como:
Successfully rebased and updated refs/heads/master.
Ahora puedes simplemente fusionarte en esa rama para dominar.
ACTUALIZACIÓN: Se debe tener en cuenta que la alteración del historial con rebase
solo debería ocurrir en sucursales privadas. Si esta rama ha estado expuesta al público, use git revert
según lo propuesto por otro respondedor.