
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.

jfs
git-rebase(1) hace exactamente eso.
$ git rebase -i HEAD~5
git impresionante [git rebase –interactive] contiene un ejemplo.
- no usar
git-rebase
en confirmaciones públicas (remotas).
- Asegúrese de que su directorio de trabajo esté limpio (
commit
o stash
sus cambios actuales).
- Ejecute el comando anterior. Lanza tu
$EDITOR
.
- 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
# 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

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.
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í)

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.

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)
@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