¿Cómo eliminar la última confirmación en Git?

Recientemente creé una nueva twig, vamos a llamarla "branch1", que está basada en otra twig, vamos a llamarla "master". Luego hice un montón de commits para branch1, y ahora me he dado count de que los primeros commits fueron en realidad un error. ¡Los que están después de los primeros, sin embargo, siguen teniendo grandes compromisos! Entonces, lo que estoy tratando de hacer aquí es básicamente eliminar esos primeros commits, para que los que están detrás de ellos básicamente se vuelvan a basar en master … ¿cómo se haría esto?

Su mejor opción probablemente sea utilizar git revert (documentos aquí ) para las confirmaciones que desea cancelar.

3 notas al respecto:

  1. Este command te permite revertir confirmaciones específicas, en contraposition al git reset que te llevará de vuelta hasta el punto en el que estás interesado, posiblemente deshaciendo todos los commits en el path.
  2. Cada revertir se considerará como un compromiso propio, lo que significa que su historial puede llenarse con confirmaciones no deseadas y revertir. Sin embargo, antes de fusionarse con la twig master puede aplastar sus confirmaciones en la branch1 utilizando git reset --soft <initial commit in branch1> y luego volver a comprometer todos los cambios mediante git commit -m <your commit message> .
  3. Para evitar conflictos de combinación, se recomienda utilizarlo en el order inverso de las confirmaciones.

Diga que este es su historial de compromisos desde el más reciente hasta el más antiguo:

 branch1 5XXXX Good Commit 4XXXX Good Commit 3XXXX Good Commit 2XXXX Bad Commit 1XXXX Bad Commit 

Por lo tanto, supongamos que desea deshacerse solo del código de 1XXXX y 2XXXX y realmente no le importa si las confirmaciones permanecen o desaparecen. Por lo tanto, ahora puedes hacer:

git revert 1XXXX Hace una nueva confirmación que tiene un post similar a reverts 1XXXX

entonces,

git revert 2XXXX Hace una nueva confirmación que tiene un post similar a reverts 2XXXX

Ahora tiene dos nuevos commits que revierten 1XXXX y 2XXXX . Simplemente empújelos …

git push origin branch1

Por lo tanto, tus compromisos ahora serán:

 branch1 7XXXX Good Commit reverting bad commit 2XXXX 6XXXX Good Commit reverting bad commit 1XXXX 5XXXX Good Commit 4XXXX Good Commit 3XXXX Good Commit 2XXXX Bad Commit 1XXXX Bad Commit 

Si quiere deshacerse de los commits, puede hacer:

git rebase --interactive 1XXXX

Por lo tanto, en la misma twig branch1 , ahora está haciendo una rebase al primer commit 1XXXX . Ahora obtendrás un editor de text que tiene algo similar a:

 pick 5XXXX Good Commit pick 4XXXX Good Commit pick 3XXXX Good Commit pick 2XXXX Bad Commit pick 1XXXX Bad Commit 

Cambie la pick de Bad Commits por squash .

 pick 5XXXX Good Commit pick 4XXXX Good Commit pick 3XXXX Good Commit squash 2XXXX Bad Commit squash 1XXXX Bad Commit 

¡Solucione los merge conflicts si surgen y BOOM! 1XXXX y 2XXXX nunca existieron !!

¿Ya has empujado tus cambios? Supongo que lo hiciste. En ese caso, recomendaría deshacerse de los commits malos usando git revert . Esa es la elección segura.

Las malas confirmaciones aún serán visibles en el historial, pero sus colegas no tendrán problemas cuando ya hayan retirado sus cambios.

Si aún no ha enviado sus cambios, tiene la opción de reescribir el historial de Git, ya sea usando git rebase -i o por git reset y recomiendo.