tipos tag remove qué practices existen etiquetas crear best git squash

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 con push.default configurado para matching o con múltiples destinos de push configurados con remote.*.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 rama master ).


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ó.