tipos - ¿Cómo eliminar las entradas de registro de confirmación seleccionadas de un repositorio Git mientras se mantienen sus cambios?
qué tipos de etiquetas existen en git (9)
Acabo de recopilar todas las respuestas de las personas: (m nuevo en git plz, utilícelo solo como referencia)
git rebase para eliminar cualquier commit
registro de git
-first check from which commit you want to rebase
git rebase -i HEAD ~ 1
-Here i want to rebase on the second last commit- commit count starts from ''1'')
-this will open the command line editor (called vim editor i guess)
Entonces la pantalla se verá algo así:
pick 0c2236d Agregada nueva línea.
Rebase 2a1cd65..0c2236d en 2a1cd65 (1 comando)
#
Comandos:
p, pick = use commit
r, reword = usa commit, pero edita el mensaje de commit
e, edit = use commit, pero pare para enmendar
s, squash = usar commit, pero fusionarse en el commit anterior
f, fixup = como "squash", pero descarta el mensaje de registro de este commit
x, exec = ejecutar comando (el resto de la línea) usando shell
d, drop = eliminar commit
#
Estas líneas pueden ser reordenadas; Se ejecutan de arriba a abajo.
#
Si eliminas una línea aquí, ese compromiso se perderá.
#
Sin embargo, si eliminas todo, la rebase será abortada.
#
Tenga en cuenta que las confirmaciones vacías están comentadas ~ ~
~
~
~
~
~
~
~
~
~
Aquí cambie la primera línea según su necesidad (utilizando los comandos enumerados anteriormente, es decir, "soltar" para eliminar la confirmación, etc.) Una vez que haya terminado, presione "x" para guardar y salir del editor (esto es solo para el editor vim)
Y entonces
git push
Si está mostrando un problema, entonces necesita forzar los cambios al control remoto (ES MUY CRÍTICO: no fuerce el empuje si está trabajando en equipo)
git push -f origen
Me gustaría eliminar las entradas del 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 compromiso se ve algo así como:
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 mediante la introducción de un solo compromiso, para que B y C se conviertan en BC y el árbol parezca.
R--A--BC--D--E--HEAD
O, idealmente, después de A viene D directamente. D ''representa 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 que tampoco se fusiona.
Aquí hay una forma de eliminar un ID de confirmación específico, sabiendo solo la ID de confirmación que desea eliminar.
git rebase --onto commit-id^ commit-id
Tenga en cuenta que esto elimina realmente el cambio introducido por la confirmación.
Considero que este proceso es 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 quitar la rama antigua 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>
Para ampliar la respuesta de JF Sebastian:
Puede usar git-rebase para realizar fácilmente todo tipo de cambios en su historial de compromisos.
Después de ejecutar git rebase --interactive, obtiene lo siguiente en su $ 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 las líneas para eliminar esa confirmación. O 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 cambió) o reformular los mensajes de confirmación.
Creo que escoger solo significa que quieres dejar ese compromiso solo.
(El ejemplo es de here )
Puede eliminar de forma no interactiva B y C en su 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 serán en D; se habrán ido
Puedes usar git cherry-pick para esto. ''cherry-pick'' aplicará un commit en la rama en la que estás ahora.
entonces hazlo
git rebase --hard <SHA1 of A>
A continuación, aplicar los compromisos D y E.
git cherry-pick <SHA1 of D>
git cherry-pick <SHA1 of E>
Esto omitirá el compromiso B y C. Habiendo dicho que podría ser imposible aplicar la confirmación D a la rama sin B, entonces YMMV.
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 debe hacerlo interactivo para que pueda aplastar todos los mensajes principales (debe dejar el más antiguo)
git-rebase(1) hace exactamente eso.
$ git rebase -i HEAD~5
git awsome-ness [git rebase --interactive] contiene un ejemplo.
- No utilice
git-rebase
engit-rebase
públicas (remotas). - Asegúrese de que su directorio de trabajo esté limpio (
commit
ostash
sus cambios actuales). - Ejecute el comando anterior. Lanza tu
$EDITOR
. - Reemplace la
pick
antes deC
yD
porsquash
. Combinará 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