HOWTO · Git
Rebase a una confirmación específica en Git
Usa git rebase --onto para rebasar una rama a una confirmación específica y seleccionar qué confirmaciones se mueven.
En esta página
Para rebasar una rama de Git sobre un commit específico, usa git rebase --onto <newbase> <upstream> [<branch>]. Git mueve a newbase los commits accesibles desde la rama, pero no desde upstream. En los ejemplos se usan new-feature y main; sustituye los ID abreviados de los commits por los de tu repositorio. Estos comandos son operaciones nativas de Git y se ofrecen como ejemplos no ejecutados.
Rebasar una rama sobre un commit específico en Git
Primero, revisa los nombres de las ramas, el estado del árbol de trabajo y el grafo de commits con git status --short --branch y git log --oneline --graph --decorate --all. Identifica el commit de destino, el límite de upstream que separa los commits que quieres mover y la rama que vas a rebasar. Un rebase reescribe el historial de commits, así que confirma que estás en la rama correcta y coordínate con los demás antes de reescribir una rama que usen otras personas.
La opción --onto recibe primero la nueva base y después el límite de upstream. El tercer argumento, que es opcional, indica la rama que se va a rebasar; no indica el nuevo padre. Si lo omites, Git rebasa la rama actualmente seleccionada, a la que apunta HEAD.
Por ejemplo, supongamos que 846e2fa es el commit deseado de main y que bd9172c es el límite de upstream anterior a los commits de new-feature. Para mover esos commits de la rama de funcionalidad al commit seleccionado, ejecuta git rebase --onto 846e2fa bd9172c new-feature. Git selecciona los commits accesibles desde new-feature, pero no desde bd9172c, y luego los vuelve a aplicar sobre 846e2fa.
Excluir el primer commit del rango que se va a rebasar
Para omitir el primer commit de la rama de funcionalidad, úsalo como límite de upstream. Si e2ff2bc es el primer commit que quieres dejar fuera, ejecuta git rebase --onto 846e2fa e2ff2bc new-feature. Git rebasa los commits accesibles desde new-feature, pero no desde e2ff2bc; así, e2ff2bc y sus antecesores quedan fuera del rango seleccionado. Antes, revisa el grafo para confirmar que e2ff2bc es el límite correcto y que los commits posteriores contienen los cambios que quieres conservar.
Excluir el último commit del rango que se va a rebasar
El argumento de rama no descarta automáticamente el commit de la punta. Para mover el rango a 846e2fa y omitir el commit de la punta d7dbeb, usa un rebase interactivo: git rebase -i --onto 846e2fa bd9172c new-feature. En la lista de tareas, cambia de pick a drop el comando de d7dbeb (o elimina esa línea) y guarda los cambios antes de cerrar el editor. Deja los demás commits como pick. De este modo, se selecciona el mismo rango posterior a bd9172c y se omite explícitamente el commit no deseado al volver a aplicar la lista.
Verificar el nuevo historial y resolver conflictos
Después, revisa git log --oneline --graph --decorate --all y confirma que new-feature apunta al historial esperado sobre 846e2fa y que solo contiene los commits previstos. Si hace falta, compara la rama con main mediante git diff main...new-feature.
Si Git se detiene por un conflicto, revisa los archivos afectados, resuelve cada conflicto y prepara las resoluciones con git add <file>. Continúa con git rebase --continue; para descartar el rebase en curso y restaurar la rama a su estado inicial, usa git rebase --abort. Vuelve a verificar el historial antes de compartirlo. Como el rebase cambia los ID de los commits, coordínate antes de enviar commits reescritos a una rama compartida; puede que se necesite un envío forzado, revisado cuidadosamente.