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 los cambios de A a D deben conservarse. Tal vez introduciendo un solo commit, para que B y C se conviertan en BC y el árbol se vea como.
R--A--BC--D--E--HEAD
O, idealmente, después de A viene D directamente. D 'representa los cambios de A a B, B a C y C a D.
R--A--D'--E--HEAD
es posible? Si es así, ¿cómo?
Este es un proyecto bastante nuevo, por lo que no tiene sucursales a partir de ahora, por lo tanto, tampoco hay fusiones.
rebase
puede eliminar viejas / crear nuevas confirmaciones. No sé qué significa "confirmar entradas de registro".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 los cambios.Respuestas:
git-rebase (1) hace exactamente eso.
git awsome-ness [git rebase --interactive] contiene un ejemplo.
git-rebase
en confirmaciones públicas (remotas).commit
ostash
sus cambios actuales).$EDITOR
.pick
antesC
yD
porsquash
. Fusionará C y D en B. Si desea eliminar una confirmación, simplemente elimine su línea.Si está perdido, escriba:
fuente
git rebase -i D [A]
?push -f
tus cambios. No lo hagas si no estás trabajando solo.git-rebase
manual de puntos y la máquina de retroceso para la publicación del blog.fuente
Aquí hay una manera de eliminar una identificación de confirmación específica conociendo solo la identificación de confirmación que desea eliminar.
Tenga en cuenta que esto realmente elimina el cambio que introdujo el commit.
fuente
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:
Puede mover líneas para cambiar el orden de las confirmaciones y eliminar líneas para eliminar esa confirmación. O bien, puede agregar un comando para combinar (aplastar) dos confirmaciones en una única confirmación (la confirmación anterior es la confirmación anterior), editar confirmaciones (lo que se modificó) o redactar mensajes de confirmación.
Creo que elegir solo significa que quieres dejar ese compromiso solo.
(El ejemplo es de aquí )
fuente
Puede eliminar de forma no interactiva B y C en su ejemplo con:
o simbólicamente
Tenga en cuenta que los cambios en B y C no serán en D; Se habrán ido .
fuente
Una forma más
elija el hash que desea usar como base, y el comando anterior debe hacerlo interactivo para que pueda aplastar todos los mensajes principales (debe dejar el más antiguo)
fuente
Encuentro este proceso mucho más seguro y fácil de entender al crear otra rama del 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.
fuente
Acabo de recopilar las respuestas de todas las personas: (soy nuevo en git, por favor úselo solo como referencia)
git rebase para eliminar cualquier confirmación
registro de git
git rebase -i CABEZA ~ 1
Entonces la pantalla se verá así:
Aquí cambie la primera línea según sus necesidades (utilizando los comandos enumerados anteriormente, es decir, 'soltar' para eliminar commit, etc.) Una vez realizada la edición, presione ': x' para guardar y salir del editor (esto es solo para el editor vim)
Y entonces
git push
Si muestra un problema, entonces necesita forzar los cambios a control remoto (ES MUY CRÍTICO: no fuerce el empuje si está trabajando en equipo)
git push -f origen
fuente
Puedes usar git cherry-pick para esto. 'cherry-pick' aplicará un commit en la rama en la que estás ahora.
entonces hazlo
luego aplique las confirmaciones D y E.
Esto omitirá la confirmación B y C. Dicho esto, podría ser imposible aplicar la confirmación D a la rama sin B, por lo que YMMV.
fuente
reset --hard
, norebase --hard
(que no existe)