Esto da una buena explicación de aplastar múltiples confirmaciones:
http://git-scm.com/book/en/Git-Branching-Rebasing
pero no funciona para confirmaciones que ya se han enviado. ¿Cómo elimino las últimas confirmaciones tanto en mis repositorios locales como remotos?
EDITAR: cuando lo haga git rebase -i origin/master~4 master
, mantenga el primero como pick
, configure los otros tres como squash
y luego salga (a través de cx cc en emacs), obtengo:
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
donde 2f40 es el pick
commit. Y ahora no aparece ninguno de los 4 commits git log
. Esperaba que mi editor se reiniciara para poder ingresar un mensaje de confirmación. ¿Qué estoy haciendo mal?
git push --force origin master
git rebase -i origin/master
, y en realidad quiere saber cómo volver a crear los commits más atrás que eso, por ejemplogit rebase -i origin/master~20 master
.+
fuerza solo la refspec que tiene el prefijo.--force
obligará a todas las especificaciones a ser empujadas. Por favor vea la respuesta actualizada.En una sucursal pude hacerlo así (durante los últimos 4 commits)
fuente
Diferencia menor a la respuesta aceptada, pero estaba teniendo muchas dificultades para aplastar y finalmente lo obtuve.
esc --> :wq
Empuje al control remoto usando:
fuente
Se pueden evitar muchos problemas creando solo una
branch
para trabajar y no trabajandomaster
:git checkout -b mybranch
Lo siguiente funciona para
remote
confirmaciones ya enviadas y una mezcla deremote
confirmaciones enviadas /local
solo confirmaciones:También tengo algunas notas de solicitud de extracción que pueden ser útiles.
fuente
git rebase -i master
obtendrá el editor vm abierto y msgs algo como esto
Aquí he cambiado la selección de todos los otros commits a "f" (significa reparación).
git push -f origin feature/feature-branch-name-xyz
esto arreglará todas las confirmaciones en una confirmación y eliminará todas las demás confirmaciones. Hice esto y me ayudó.
fuente
Cuando trabajas con un Gitlab o Github, puedes tener problemas de esta manera. Aplasta tus commits con uno de los métodos anteriores. Mi preferido es:
seleccione squash o arreglo para su compromiso. En este punto, debería verificar el estado de git. Y el mensaje podría ser:
Y puedes tener la tentación de tirar de él. NO HAGAS ESO o estarás en la misma situación que antes.
En su lugar, empuje a su origen con:
El + permite forzar el empuje solo a una rama.
fuente
Para aplastar dos commits, uno de los cuales ya fue empujado, en una sola rama funcionó lo siguiente:
Por defecto, esto incluirá el mensaje de confirmación de la confirmación más reciente como un comentario sobre la confirmación más antigua.
fuente
1)
git rebase -i HEAD~4
Para elaborar: Funciona en la rama actual; HEAD ~ 4 significa aplastar los últimos cuatro commits; modo interactivo (-i)
2) En este punto, el editor abrió, con la lista de confirmaciones, para cambiar las segundas y siguientes confirmaciones, reemplazando pick con squash y luego guárdelo.
salida: referencias y cabezas / nombre de sucursal actualizadas y actualizadas correctamente.
3)
git push origin refs/heads/branch-name --force
salida:
fuente