Esta pregunta se refiere no solo a cómo realizar esta tarea, sino a si hacerlo es una buena o mala práctica con Git.
Considere que localmente trabajo más en la rama maestra, pero he creado una rama tópica que llamaré "topical_xFeature". En el proceso de trabajar en "topical_xFeature" y cambiar de un lado a otro para realizar otro trabajo en la rama maestra, resulta que he realizado más de un commit en la rama "topical_xFeature", pero entre cada commit, no he hecho empujar.
Primero , ¿considerarías esta mala práctica? ¿No sería más prudente mantener una confirmación por rama por inserción? ¿En qué casos sería bueno tener varias confirmaciones en una rama antes de realizar una inserción?
En segundo lugar , ¿cómo debo lograr llevar las múltiples confirmaciones de la rama topical_xFeature a la rama maestra para un impulso? ¿Es una molestia no preocuparse por eso y solo hacer el empuje donde se empujan múltiples confirmaciones, o es menos molesto fusionar las confirmaciones en una y luego empujar? De nuevo, ¿cómo hacer esto?
fuente
git branch -d topic
. ¿Por qué git no puede identificar que todos los cambios se fusionan?git branch -D topic
para eliminarla por la fuerza.Esta es la forma en que generalmente sigo para combinar varias confirmaciones en una sola confirmación antes de insertar el código.
Para lograr esto, le sugiero que use el concepto de ' squash ' proporcionado por GIT.
Sigue los pasos a continuación.
1) git rebase -i master (en lugar de master también puedes usar un commit específico)
abra el editor interactivo rebase, donde mostrará todas sus confirmaciones. Básicamente, donde necesita identificar las confirmaciones que desea fusionar en una única confirmación.
Imagina que estos son tus commits y se muestran algo como esto en el editor.
Es importante tener en cuenta que estas confirmaciones se enumeran en el orden opuesto al que normalmente se ve con el comando log. Significa que la confirmación anterior se mostrará primero.
2) Cambie 'pick' a 'squash' para los últimos cambios confirmados. algo como se muestra a continuación. Al hacer eso, tus últimos 2 commits se fusionarán con el primero.
También puede usar la forma abreviada si tiene muchas confirmaciones para combinar:
para editar use 'i', habilitará el editor para la inserción. Tenga en cuenta que la confirmación más alta (más antigua) no se puede aplastar ya que no hay una confirmación previa para combinar. Por lo tanto, debe ser elegido o 'p'. Use 'Esc' para salir del modo de inserción.
3) Ahora, guarde el editor con el siguiente comando. : wq
Cuando guarda eso, tiene una única confirmación que introduce los cambios de las tres confirmaciones anteriores.
Espero que esto te ayudará.
fuente
git rebase -i HEAD~2
fue un lugar útil para comenzar. Entonces esta respuesta fue útil. Luego, migit status
mostró "Su rama y 'origin / feature / xyz' han divergido, y tienen 1 y 1 confirmaciones diferentes cada uno, respectivamente". Así que necesitabagit push origin feature/xyz --force-with-lease
ver stackoverflow.com/a/59309553/470749 y freecodecamp.org/forum/t/…Primero : nada le dice que solo tenga una confirmación por rama por inserción: una inserción es un mecanismo de publicación que le permite publicar un historial local (es decir, una colección de confirmaciones) en un repositorio remoto.
Segundo : un
git merge --no-ff topical_xFeature
registro en master como un solo compromiso de su trabajo de tema, antes de presionarmaster
.(De esa manera, se mantiene
topical_xFeature
para futuras evoluciones, en las que puede grabarmaster
como un nuevo compromiso en la próxima fusión --no-ff.Si deshacerse de él
topical_xFeature
es el objetivo, entoncesgit merge --squash
es la opción correcta, como se detalla en Brian Campbell la respuesta )fuente
--squash
no--no-ff
es lo que quieres.--no-ff
crearía una confirmación de fusión, pero también dejaría todas las confirmaciones detopical_xFeature
.topical_feature
bifurcación y solo registrar una confirmación en lamaster
bifurcación.Cambie a la rama maestra y asegúrese de estar actualizado.
git fetch
esto puede ser necesario (dependiendo de su configuración de git) para recibir actualizaciones sobre origen / maestroCombinar la rama de características en la rama maestra.
Restablece la rama maestra al estado de origen.
Git ahora considera todos los cambios como cambios no organizados. Podemos agregar estos cambios como una confirmación. Sumando también agregará archivos sin seguimiento.
Ref: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
fuente
Primero elija qué compromiso quiere que todo venga después.
Restablecer a la cabeza seleccionada (he elegido
HEAD@{2}
)git status
(sólo para estar seguro)Agrega tu nueva confirmación
Nota:
HEAD@{0}
&HEAD@{1}
Ahora se fusionan en 1 commit, esto también se puede hacer para múltiples commits.git reflog
nuevamente debería mostrar:fuente
Una herramienta para automatizar múltiples confirmaciones en una
como dice Kondal Kolipaka . Usando "git rebase -i"
La lógica de "git rebase"
Cuando se usa "git rebase -i", git genera el archivo git-rebase-todo en el directorio actual .git / rebase-merge, y luego invoca el editor git para permitir a los usuarios editar el archivo git-rebase-todo para su procesamiento. Entonces la herramienta necesita cumplir:
Modificar el editor de git predeterminado
Entonces, la herramienta necesita cambiar el editor git y procesar el archivo git-rebase-todo. La herramienta que usa Python a continuación:
Ref: https://liwugang.github.io/2019/12/30/git_commits_en.html
fuente