tag - qué tipos de etiquetas existen en git
¿Cómo aplastar los compromisos en git después de haber sido empujados? (6)
Esto da una buena explicación de aplastar múltiples confirmaciones:
http://git-scm.com/book/en/Git-Branching-Rebasing
pero no funciona para los compromisos que ya se han empujado. ¿Cómo aplasto los últimos compromisos tanto en mis repositorios locales como remotos?
EDITAR: Cuando hago git rebase -i origin/master~4 master
, mantengo el primero como pick
, configuro los otros tres como squash
y luego salgo (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 ninguna de las 4 confirmaciones aparece en el git log
. Esperaba que mi editor se reiniciara para poder ingresar un mensaje de confirmación. ¿Qué estoy haciendo mal?
Diferencia menor a la respuesta aceptada, pero estaba teniendo muchas dificultades para aplastar y finalmente lo conseguí.
$ git rebase -i HEAD~4
- En la pantalla interactiva que se abre, reemplace pick con squash en la parte superior para todas las confirmaciones que desea aplastar.
- Guarde y cierre el editor a través de
esc --> :wq
Empuje hacia el control remoto usando:
$ git push origin branch-name --force
En una rama pude hacerlo de esta manera (para las últimas 4 confirmaciones)
git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
Para aplastar dos confirmaciones, una de las cuales ya estaba presionada, en una sola rama funcionó lo siguiente:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
De forma predeterminada, esto incluirá el mensaje de confirmación de la confirmación más reciente como un comentario sobre la confirmación anterior.
Se pueden evitar muchos problemas creando solo una branch
para trabajar y no trabajando en el master
:
git checkout -b mybranch
Los siguientes trabajos para confirmaciones remote
ya han sido empujados y una mezcla de confirmaciones remotadas / confirmaciones solo local
:
# example merging 4 commits
git checkout mybranch
git rebase -i mybranch~4 mybranch
# at the interactive screen
# choose fixup for commit: 2 / 3 / 4
git push -u origin +mybranch
También tengo algunas notas de solicitud de extracción que pueden ser útiles.
Squash se compromete localmente con
git rebase -i origin/master~4 master
y luego forzar empujar con
git push origin +master
Diferencia entre --force
y +
De la documentación de git push
:
Tenga en cuenta que
--force
aplica a todos los refs que se empujan, por lo tanto, usarlo conpush.default
configurado paramatching
o con múltiples destinos de push configurados conremote.*.push
puede sobrescribir los refs que no sean la rama actual (incluidos los refs locales estrictamente detrás de su contraparte remota). Para forzar un empuje a solo una rama, use un+
delante de refspec para empujar (por ejemplo,git push origin +master
para forzar un empuje a la ramamaster
).
git rebase -i master
obtendrá el editor vm abierto y msgs algo como esto
Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message
#
#some more
Aquí he cambiado la selección de todos los demás compromisos de "f" (Stands for fixup).
git push -f origin feature/feature-branch-name-xyz
esto solucionará todos los compromisos de un compromiso y eliminará todos los demás compromisos. Hice esto y me ayudó.