Cuando trabaje con Git, encontrará que a veces las confirmaciones deben eliminarse ya que han introducido un error o necesitan ser reelaboradas.
Si es así el último compromiso es muy sencillo. Simplemente ejecute:
git reset HEAD^
Esto mostrará la última confirmación, pero dejará todos los cambios en los archivos intactos.
Si necesita eliminar algo más que la última confirmación, hay dos métodos que puede utilizar. La primera es usar rebase, esto te permitirá eliminar una o más confirmaciones consecutivas, la otra es cherry-pick, que te permite eliminar confirmaciones no consecutivas.
Ejemplo de registro de git
Número | Hash | Confirmar mensaje | Autor |
---|---|---|---|
1 | 2c6a45b | (HEAD) Añadiendo método público para acceder al método protegido | Tom |
2 | ae45fab | Actualizaciones en la interfaz de la base de datos | Contratista 1 |
3 | 77b9b82 | Mejora de la interfaz de la base de datos | Contractor 2 |
4 | 3c9093c | Se fusionó la rama de desarrollo en el maestro | Tom |
5 | b3d92c5 | Adición de un nuevo módulo CMS de eventos | Paul |
6 | 7feddbb | Adición de archivos y clases CMS | Tom |
7 | a809379 | Agregar proyecto a Git | Tom |
Usando Rebase
Usando el registro de git anterior queremos eliminar las siguientes confirmaciones; 2 & 3 (ae45fab & 77b9b82). Como son confirmaciones consecutivas, podemos usar rebase.
git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name>
Por ejemplo, para eliminar las confirmaciones 2 & 3 anterior
git rebase --onto repair~3 repair~1 repair
Usando Cherry Pick
Paso 1: Encuentra la confirmación antes de la confirmación desea eliminar git log
Paso 2: Verifique que confirme git checkout <commit hash>
Paso 3 : Crea una nueva rama usando tu confirmación de pago actual git checkout -b <new branch>
Paso 4: Ahora necesitas agregar la confirmación después de la confirmación eliminada git cherry-pick <commit hash>
Paso 5: Ahora repita el Paso 4 para todas las demás confirmaciones que desee mantener.
Paso 6: Una vez que se hayan agregado todas las confirmaciones a su nueva rama y sido cometido. Compruebe que todo esté en el estado correcto y que funcione según lo previsto. Verifique que todo se haya confirmado: git status
Paso 7: cambie a su rama rota git checkout <broken branch>
Paso 8: Ahora realice un restablecimiento completo en la rama rota a la confirmación antes de la que desea eliminar git reset --hard <commit hash>
Paso 9: Combine su rama fija en esta rama git merge <branch name>
Paso 10: Empuje los cambios combinados de regreso al origen. ADVERTENCIA: ¡Esto sobrescribirá el repositorio remoto! git push --force origin <branch name>
Puede realizar el proceso sin crear una nueva rama reemplazando el Paso 2 & 3 con el Paso 8 y luego no realizar el Paso 7 & 9.
Ejemplo
Digamos que queremos eliminar las confirmaciones 2 & 4 del repositorio.
-
git checkout b3d92c5
Verifique la última confirmación utilizable. -
git checkout -b repair
Cree una nueva rama para trabajar. -
git cherry-pick 77b9b82
Ejecute la confirmación 3. -
git cherry-pick 2c6a45b
Ejecutar a través de la confirmación 1. -
git checkout master
Checkout master. -
git reset --hard b3d92c5
Restablecer master a la última confirmación utilizable. -
git merge repair
Fusionar nuestra nueva rama con master. -
git push --hard origin master
Empuje el master al repositorio remoto.
Nota final
Git rebase & cherrypick son peligrosos pero poderosos soluciones que solo deben usarse como último opción y solo puede ser asumido por alguien que sepa lo que está haciendo. Tenga en cuenta que ambas soluciones podrían tener efectos adversos en otros usuarios que estén trabajando en el mismo repositorio / rama.
¡Por último, recuerde tener cuidado y buena suerte!