¿Cómo eliminar las entradas de registro de confirmación seleccionadas de un repositorio de Git manteniendo sus cambios?

6 minutos de lectura

¿Como eliminar las entradas de registro de confirmacion seleccionadas de
xk0der

Me gustaría eliminar las entradas de registro de confirmación seleccionadas de un árbol de confirmación lineal, para que las entradas no se muestren en el registro de confirmación.

Mi árbol de confirmación se parece a:

R--A--B--C--D--E--HEAD

Me gustaría eliminar las entradas B y C para que no se muestren en el registro de confirmación, pero se deben conservar los cambios de A a D. Tal vez mediante la introducción de una sola confirmación, de modo que B y C se conviertan en BC y el árbol se vea así.

R--A--BC--D--E--HEAD

O, idealmente, después de A viene D directamente. D’ que representa los cambios de A a B, B a C y C a D.

R--A--D'--E--HEAD

es posible? en caso afirmativo, ¿cómo?

Este es un proyecto bastante nuevo, por lo que no tiene sucursales a partir de ahora, por lo tanto, tampoco se fusiona.

  • @xk0der: “compromisos” es el término correcto aquí. rebase puede eliminar compromisos antiguos/crear nuevos. No sé qué significa “entradas de registro de confirmación”.

    – jfs

    11 de agosto de 2012 a las 11:44

  • @JFSebastian No veo ningún problema con el “registro de confirmación”: registro de todas las confirmaciones. Y quería eliminar algunas entradas del registro, manteniendo los cambios reales (las confirmaciones).

    – xk0der

    12 de agosto de 2012 a las 13:20

  • @xk0der: las confirmaciones de git son direccionables por contenido es decir, si cambias cualquier cosa en un compromiso, por ejemplo, su mensaje de registro; creas un nuevo compromiso. Tú podrías lea el compromiso de git sin git y compruébelo usted mismo.

    – jfs

    12 de agosto de 2012 a las 15:18

  • @JFSebastian – Gracias por los enlaces – Lo sé – ¿Pero ese tecnicismo realmente cambia el problema al que me enfrentaba y cómo lo planteé? Supongo que no. Al final: quería eliminar “los mensajes de registro de confirmación”, sin eliminar los “cambios de confirmación”. Vuelva a leer mi pregunta, especialmente el segundo párrafo. Para agregar más git log muestra el “registro de confirmación” git-scm.com/docs/git-log . Y quería deshacerme de dos entradas de ese registro, no de los cambios.

    – xk0der

    12 de agosto de 2012 a las 17:25

¿Como eliminar las entradas de registro de confirmacion seleccionadas de
jfs

git-rebase(1) hace exactamente eso.

$ git rebase -i HEAD~5

git impresionante [git rebase –interactive] contiene un ejemplo.

  1. no usar git-rebase en confirmaciones públicas (remotas).
  2. Asegúrese de que su directorio de trabajo esté limpio (commit o stash sus cambios actuales).
  3. Ejecute el comando anterior. Lanza tu $EDITOR.
  4. Reemplazar pick antes de C y D por squash. Fusionará C y D en B. Si desea eliminar una confirmación, simplemente elimine su línea.

Si estás perdido, escribe:

$ git rebase --abort  

  • Gracias por la rápida respuesta. Entonces, pago A y hago una reorganización, algo así como git rebase -i D [A]?

    – xk0der

    30 de enero de 2009 a las 12:41

  • @slhck: replay.web.archive.org/20090627051320/http://blog.madism.org/…

    – Benjol

    19 de mayo de 2011 a las 9:58

  • ¿Cómo podemos hacerlo en repositorios remotos?

    – Eray

    18 de noviembre de 2011 a las 2:28

  • @Eray: solo push -f tus cambios No lo hagas si no estás trabajando solo.

    – jfs

    18 de noviembre de 2011 a las 19:37

  • @ripper234: He arreglado enlaces para apuntar git-rebase manual y wayback machine para la publicación del blog.

    – jfs

    28 de febrero de 2012 a las 12:57

# detach head and move to D commit
git checkout <SHA1-for-D>

# move HEAD to A, but leave the index and working tree as for D
git reset --soft <SHA1-for-A>

# Redo the D commit re-using the commit message, but now on top of A
git commit -C <SHA1-for-D>

# Re-apply everything from the old D onwards onto this new place 
git rebase --onto HEAD <SHA1-for-D> master

  • Esto también funciona y me ayudó a comprender qué es un restablecimiento parcial. De acuerdo, la respuesta “principal” también es correcta y más corta, pero también gracias por esta respuesta.

    – cgp

    26 de abril de 2012 a las 15:37

1646969708 353 ¿Como eliminar las entradas de registro de confirmacion seleccionadas de
rado

Aquí hay una forma de eliminar una identificación de confirmación específica sabiendo solo la identificación de confirmación que le gustaría eliminar.

git rebase --onto commit-id^ commit-id

Tenga en cuenta que esto elimina el cambio que introdujo la confirmación.

  • El HEAD adicional en este comando hará que el rebase termine con un ‘HEAD separado’ que no es deseable. Debe omitirse.

    – Escarchado

    27 de mayo de 2011 a las 12:45

  • Esto revierte los cambios introducidos en mi id de confirmación, el OP quiere conservar los cambios, simplemente aplaste las confirmaciones.

    –CB Bailey

    24 de septiembre de 2011 a las 7:28

  • -1 porque no hace lo que pidió el OP (más bien destruye algo que explícitamente quería retener).

    –Emil Styrke

    28 de marzo de 2013 a las 9:15

  • Aunque no hace lo que pidió el OP, era exactamente lo que necesitaba, así que +1 para una respuesta útil.

    – Edvins

    30 de julio de 2019 a las 11:27

Para ampliar la respuesta de JF Sebastian:

Puede usar git-rebase para realizar fácilmente todo tipo de cambios en su historial de confirmaciones.

Después de ejecutar git rebase –interactive obtienes lo siguiente en tu $EDITOR:

pick 366eca1 This has a huge file
pick d975b30 delete foo
pick 121802a delete bar
# Rebase 57d0b28..121802a onto 57d0b28
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit

Puede mover líneas para cambiar el orden de las confirmaciones y eliminar líneas para eliminar esa confirmación. O puede agregar un comando para combinar (aplastar) dos confirmaciones en una sola confirmación (la confirmación anterior es la confirmación anterior), editar confirmaciones (lo que se cambió) o reformular los mensajes de confirmación.

Creo que elegir solo significa que quieres dejar ese compromiso solo.

(El ejemplo es de aquí)

1646969708 793 ¿Como eliminar las entradas de registro de confirmacion seleccionadas de
Cabeza

Puede de forma no interactiva retirar B y C en tu ejemplo con:

git rebase --onto HEAD~5 HEAD~3 HEAD

o simbólicamente,

git rebase --onto A C HEAD

Tenga en cuenta que los cambios en B y C no estar en D; ellos estarán desaparecido.

1646969709 731 ¿Como eliminar las entradas de registro de confirmacion seleccionadas de
Eric Woodruff

Encuentro este proceso mucho más seguro y fácil de entender al crear otra rama desde el SHA1 de A y seleccionar los cambios deseados para asegurarme de que estoy satisfecho con el aspecto de esta nueva rama. Después de eso, es fácil eliminar la rama anterior y cambiar el nombre de la nueva.

git checkout <SHA1 of A>
git log #verify looks good
git checkout -b rework
git cherry-pick <SHA1 of D>
....
git log #verify looks good
git branch -D <oldbranch>
git branch -m rework <oldbranch>

Una forma más,

git rebase -i ad0389efc1a79b1f9c4dd6061dca6edc1d5bb78a (C's hash)
and
git push origin master  -f

elija el hash que desea usar como base, y el comando anterior debería hacerlo interactivo para que pueda aplastar todos los cima Mensajes (debes dejar el más antiguo)

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad