Cómo eliminar seleccionados cometer las entradas del registro de un repositorio de Git, manteniendo sus cambios?

StackOverflow https://stackoverflow.com/questions/495345

  •  20-08-2019
  •  | 
  •  

Pregunta

Me gustaría eliminar seleccionados cometer entradas de registro de un lineal de cometer árbol, de modo que las entradas no se muestran en el registro de confirmación.

Mi comprometerse árbol se ve algo como:

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

Me gustaría quitar el B y C las entradas para que no se muestran en el log, pero los cambios de la a a la D debe ser preservada.Tal vez por la introducción de un único commit, por lo que B y C en AC y el árbol se parece.

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

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

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

Es esto posible?si sí, ¿cómo?

Esto es bastante un nuevo proyecto, así que no tiene ramas como la de ahora, por tanto, no se funde así.

¿Fue útil?

Solución

git rebase(1) hace exactamente eso.

$ git rebase -i HEAD~5

git awsome-ness [git rebase --interactive] contiene un ejemplo.

  1. No uso git-rebase en público (remoto) comete.
  2. Asegúrese de que su directorio de trabajo es limpio (commit o stash los cambios actuales).
  3. Ejecutar el comando anterior.El lanzamiento de su $EDITOR.
  4. Reemplazar pick antes de C y D por squash.Que se funden C y D en B.Si desea eliminar un commit, a continuación, acaba de eliminar su línea.

Si estás perdido, escriba:

$ git rebase --abort  

Otros consejos

# 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

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.

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

Tenga en cuenta que esto realmente elimina el cambio que introdujo el commit.

Para ampliar la respuesta de J.F. 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 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í )

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 estarán en D; estarán desaparecidos .

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 top (debe dejar el más antiguo)

Creo 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 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>

Acabo de recopilar las respuestas de todas las personas: (nuevo en git por favor úselo solo como referencia)

git rebase para eliminar cualquier confirmación

git log

-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á así:

  

pick 0c2236d Nueva línea agregada.

     

Rebase 2a1cd65..0c2236d en 2a1cd65 (1 comando)

     

#

     

Comandos:

     

p, pick = use commit

     

r, reword = use commit, pero edite el mensaje de confirmación

     

e, edit = use commit, pero deténgase para enmendar

     

s, squash = usar commit, pero fusionarse con el commit anterior

     

f, fixup = like " squash " ;, pero descarte el mensaje de registro de este commit

     

x, exec = ejecutar comando (el resto de la línea) usando shell

     

d, drop = remove commit

     

#

     

Estas líneas se pueden reordenar; se ejecutan de arriba a abajo.

     

#

     

Si elimina una línea aquí, ESTE COMPROMISO SE PERDERÁ.

     

#

     

Sin embargo, si elimina todo, se cancelará el rebase.

     

#

     

Tenga en cuenta que las confirmaciones vacías se comentan ~ ~

     

~
  ~
  ~
  ~
  ~
  ~
  ~
  ~
  ~

Aquí cambie la primera línea según su necesidad (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 luego

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 origin

Puedes usar git cherry-pick para esto. 'cherry-pick' aplicará una confirmación en la rama en la que está ahora.

luego haz

git rebase --hard <SHA1 of A>

luego aplique las confirmaciones D y E.

git cherry-pick <SHA1 of D>
git cherry-pick <SHA1 of E>

Esto omitirá la confirmación B y C. Habiendo dicho eso, podría ser imposible aplicar la confirmación D a la rama sin B, por lo que YMMV.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top