¿Cómo cambiar git antiguo?

Hice 3 git commit, pero no se hizo clic. ¿Cómo cambiar el antiguo (ddc6859af44) y (47175e84c), que no es el último?

 $git log commit f4074f289b8a49250b15a4f25ca4b46017454781 Date: Tue Jan 10 10:57:27 2012 -0800 commit ddc6859af448b8fd2e86dd0437c47b6014380a7f Date: Mon Jan 9 16:29:30 2012 -0800 commit 47175e84c2cb7e47520f7dde824718eae3624550 Date: Mon Jan 9 13:13:22 2012 -0800 
111
11 янв. fijado por michael 11 de enero 2012-01-11 21:52 '12 a las 9:52 PM 2012-01-11 21:52
@ 6 respuestas
 git rebase -i HEAD^^^ 

Ahora marque los que desea cambiar con edit o e (reemplazar pick ). Ahora guarda y sal.

Ahora haz tus cambios, entonces

 git add -A git commit --amend --no-edit git rebase --continue 

Si desea agregar una eliminación adicional, elimine los parámetros del comando commit. Si desea personalizar el mensaje, omita solo el parámetro --no-edit .

141
11 янв. La respuesta la da Adam Dymitruk el 11 de enero. 2012-01-11 22:06 '12 a las 10:06 pm 2012-01-11 22:06

Preparé el compromiso que quería hacer con uno más viejo, y me sorprendió ver que rebase -me quejé de que tenía cambios no comprometidos. Pero no quería que mis cambios indicasen nuevamente el parámetro de edición del compromiso senior. Por lo tanto, la solución fue bastante simple y directa:

  • prepara tu actualización para la anterior, agrégala y ejecuta
  • git rebase -i <commit you want to amend>^ - observe el ^ para que pueda ver la corrección especificada en un editor de texto
  • Recibirá lo siguiente:

     pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies pick e23d23a fix indentation of jgroups.xml 
  • Ahora, para combinar e23d23a con 8c83e24, puedes cambiar el orden de las líneas y usar squash de la siguiente manera:

     pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync squash e23d23a fix indentation of jgroups.xml pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies 
  • escriba y salga del archivo, estará con el editor para combinar los mensajes de confirmación. Haga esto y guarde / salga del documento de texto.

  • Has terminado, tus cambios han cambiado.
border=0

El crédito es para: http://git-scm.com/book/en/Git-Tools-Rewriting-History También hay demostrada la magia git demostrada.

75
09 авг. la respuesta es dada por akostadinov 09 ago. 2013-08-09 18:42 '13 a las 18:42 2013-08-09 18:42

Puede utilizar git rebase para sobrescribir el historial de confirmación. Esto puede ser potencialmente perjudicial para sus cambios, así que use con precaución.

Primero haga su cambio "cambio" como de costumbre. Luego realice una redirección interactiva, comenzando con el padre de su antiguo compromiso

 git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^ 

Esto lanzará tu editor con todas las fijaciones. Cambie el orden para que su "corrección" se haga debajo de la que desea cambiar. Luego, reemplace la primera palabra en la línea con "commit" con s , que la fusionará ( s quash) con un commit anterior. Guarde y salga del editor y siga las instrucciones.

9
11 янв. Respuesta dada por Benjamin Bannier el 11 de enero. 2012-01-11 21:55 '12 a las 9:55 pm 2012-01-11 21:55

Puede usar git rebase --interactive , usando el comando edit para commit, que desea cambiar.

9
11 янв. La respuesta se da Avi 11 jan. 2012-01-11 22:01 '12 a las 10:01 pm 2012-01-11 22:01

Utilicé un método diferente varias veces. De hecho, este es un git rebase -i , y es útil si desea reorganizar varias confirmaciones, incluso aplastar o dividir algunas de ellas. La principal ventaja es que no es necesario tomar una decisión sobre cada comisión del destino en un momento. También tendrá todas las funciones de Git disponibles durante el proceso, a diferencia de durante la reinstalación. Por ejemplo, puede en cualquier momento mostrar un registro del historial original y sobrescrito, ¡o incluso realizar otro reinicio!

Me referiré a los compromisos de la siguiente manera, por lo que es fácil de leer:

 C # good commit after a bad one B # bad commit A # good commit before a bad one 

Tu historia al principio es la siguiente:

 x - A - B - C | | | master | origin/master 

Lo recreamos de esta manera:

 x - A - B*- C' | | | master | origin/master 

Este es el procedimiento:

 git checkout B # get working-tree to the state of commit B git reset --soft A # tell git that we are working before commit B git checkout -b rewrite-history # switch to a new branch for our alternative history 

Mejore su antiguo compromiso con git add ( git add -i , git stash , etc.). Incluso puedes dividir tu antigua fijación en dos o más.

 git commit # recreate commit B (result = B*) git cherry-pick C # copy C to our new branch (result = C') 

Resultado intermedio:

 x - A - B - C | \ | | \ master | \ | B*- C' | | | rewrite-history | origin/master 

Deja que termine:

 git checkout master git reset --hard rewrite-history # make this branch master 

Para hacer esto, puedes push hacia adelante.

7
19 авг. La respuesta está dada por Melebius 19 ago. 2013-08-19 10:24 '13 a las 10:24 am 2013-08-19 10:24

En caso de que el OP desee exprimir 2 confirmaciones especificadas en 1, aquí hay una forma alternativa de hacerlo sin reiniciar

 git checkout HEAD^ # go to the first commit you want squashed git reset --soft HEAD^ # go to the second one but keep the tree and index the same git commit --amend -C HEAD@{1} # use the message from first commit (omit this to change) git checkout HEAD@{3} -- . # get the tree from the commit you did not want to touch git add -A # add everything git commit -C HEAD@{3} # commit again using the message from that commit 

La sintaxis @{N) es conveniente, ya que le permitirá consultar el historial de dónde estaban sus enlaces. En este caso, es la CABEZA que representa su compromiso actual.

2
11 янв. La respuesta la da Adam Dymitruk el 11 de enero. 2012-01-11 23:52 '12 a las 11:52 2012-01-11 23:52

Otras preguntas sobre etiquetas de o haga una pregunta