ver pendientes modificados log commits comandos archivos git

pendientes - ¿Cómo se elimina una revisión específica en el historial de git?



git ver archivos modificados (9)

Así que aquí está el escenario que enfrenté y cómo lo resolví.

[branch-a] [Hundreds of commits] -> [R] -> [I]

aquí R es el compromiso que necesitaba que se elimine, y I es un compromiso único que viene después de R

Hice un commit de revertir y los aplasté juntos

git revert [commit id of R] git rebase -i HEAD~3

Durante la squash de reabastecimiento interactivo, los últimos 2 commits.

Supongamos que su historial de git tiene este aspecto:

1 2 3 4 5

1-5 son revisiones separadas. Necesitas eliminar 3 manteniendo 1, 2, 4 y 5. ¿Cómo se puede hacer esto?

¿Hay un método eficiente cuando hay cientos de revisiones después del que se va a eliminar?


Como se señaló antes, git-rebase (1) es tu amigo. Suponiendo que las confirmaciones se encuentran en su rama master , haría:

git rebase --onto master~3 master~2 master

Antes de:

1---2---3---4---5 master

Después:

1---2---4''---5'' master

De git-rebase (1):

Un rango de commits también podría eliminarse con rebase. Si tenemos la siguiente situación:

E---F---G---H---I---J topicA

entonces el comando

git rebase --onto topicA~5 topicA~3 topicA

daría como resultado la eliminación de confirmaciones F y G:

E---H''---I''---J'' topicA

Esto es útil si F y G fueron defectuosos de alguna manera, o no deberían ser parte del tema A. Tenga en cuenta que el argumento para --onto y el parámetro puede ser cualquier commit-ish válido.


Esta es una forma de eliminar de manera no interactiva un <commit-id> específico, sabiendo solo el <commit-id> que desea eliminar:

git rebase --onto <commit-id>^ <commit-id> HEAD


Las respuestas de rado y kareem no hacen nada por mí (aparece el mensaje "La sucursal actual está actualizada"). Posiblemente esto ocurra porque el símbolo ''^'' no funciona en la consola de Windows. Sin embargo, según this comentario, reemplazar ''^'' por ''~ 1'' resuelve el problema.

git rebase --onto <commit-id>^ <commit-id>


Para combinar la revisión 3 y 4 en una única revisión, puede usar git rebase. Si desea eliminar los cambios en la revisión 3, debe usar el comando de edición en el modo rebase interactivo. Si desea combinar los cambios en una única revisión, use squash.

He utilizado con éxito esta técnica de squash, pero nunca antes había necesitado eliminar una revisión. La documentación de git-rebase en "Dividir compromisos" debería con suerte darle una idea suficiente para resolverlo. (O alguien más podría saber).

De la documentación de git :

Comience con la confirmación más antigua que desee conservar tal como está:

git rebase -i <after-this-commit>

Un editor se disparará con todas las confirmaciones en su rama actual (ignorando las asignaciones de fusión), que se producen después de la confirmación determinada. Puede reordenar los commits en esta lista al contenido de su corazón, y puede eliminarlos. La lista se ve más o menos así:

pick deadbee The oneline of this commit pick fa1afe1 The oneline of the next commit ...

Las descripciones en línea son puramente para su placer; git-rebase no los verá sino a los nombres de los commits ("deadbee" y "fa1afe1" en este ejemplo), así que no elimines ni edites los nombres.

Al reemplazar el comando "seleccionar" por el comando "editar", puede indicarle a git-rebase que se detenga después de aplicar esa confirmación, para que pueda editar los archivos y / o el mensaje de confirmación, modificar la confirmación y continuar con la actualización.

Si quiere doblar dos o más commits en uno, reemplace el comando "pick" por "squash" para el segundo y posterior commit. Si los commits tienen autores diferentes, atribuirá el compromiso aplastado al autor del primer commit.


Según este comentario (y comprobé que esto sea cierto), la respuesta de rado es muy similar, pero deja a git en un estado de cabeza desprendida. En su lugar, elimine HEAD y use esto para eliminar <commit-id> de la rama en la que se encuentra:

git rebase --onto <commit-id>^ <commit-id>


Si todo lo que quiere hacer es eliminar los cambios realizados en la revisión 3, es posible que desee utilizar git revertir.

Git revert simplemente crea una nueva revisión con cambios que deshacen todos los cambios en la revisión que está revertiendo.

Lo que esto significa es que conserva información sobre la confirmación no deseada y la confirmación que elimina esos cambios.

Esto es probablemente mucho más amigable si es posible que alguien haya sacado de su repositorio mientras tanto, ya que la reversión es básicamente una confirmación estándar.


También aterricé en una situación similar. Use la rebase interactiva usando el siguiente comando y mientras selecciona, suelte el tercer commit.

git rebase -i remote/branch


Todas las respuestas hasta ahora no abordan la preocupación final:

¿Hay un método eficiente cuando hay cientos de revisiones después del que se va a eliminar?

Los pasos siguen, pero para referencia, supongamos el siguiente historial:

[master] -> [hundreds-of-commits-including-merges] -> [C] -> [R] -> [B]

C : comprometerse justo después del compromiso para ser eliminado (limpio)

R : el compromiso de ser eliminado

B : commit justo antes del commit para ser removido (base)

Debido a la restricción de "cientos de revisiones", asumo las siguientes condiciones previas:

  1. hay algún compromiso vergonzoso que desearías nunca haber existido
  2. hay CERO confirmaciones posteriores que en realidad dependen de esa comisión embarazosa (cero conflictos en revertir)
  3. no te importa que seas incluido como el "Comprador" de los cientos de confirmaciones intermedias (se conservará el "Autor")
  4. nunca has compartido el repositorio
    • o realmente tienes suficiente influencia sobre todas las personas que alguna vez han clonado la historia con la que se comprometen para convencerlos de usar tu nueva historia
    • y no te importa reescribir la historia

Este es un conjunto bastante restrictivo de restricciones, pero hay una respuesta interesante que realmente funciona en este caso de esquina.

Estos son los pasos:

  1. git branch base B
  2. git branch remove-me R
  3. git branch save
  4. git rebase --preserve-merges --onto base remove-me

Si realmente no hay conflictos, entonces esto debería continuar sin más interrupciones. Si hay conflictos, puede resolverlos y rebase --continue o decidir vivir solo con la vergüenza y la rebase --abort .

Ahora deberías estar en master que ya no tiene commit R en él. La bifurcación de save apunta hacia donde estabas antes, en caso de que quieras reconciliarte.

La forma en que desee organizar la transferencia de todos los demás a su nuevo historial depende de usted. Tendrá que estar familiarizado con el stash , reset --hard y cherry-pick . Y puedes borrar la base , remove-me y save ramas