Cómo eliminar confirmaciones de una solicitud de extracción

105

Hice una solicitud de extracción, pero después de eso hice algunos compromisos con el proyecto localmente, lo que terminó contaminando mi solicitud de extracción, intenté eliminarla pero sin suerte.

Encontré algunas preguntas similares en StackOverflow pero no puedo aplicar lo que hay allí. Es mi primera solicitud de extracción en GitHub, por lo que me resulta un poco extraño cómo funciona todo esto.

La confirmación resaltada es la que necesito para mantener y eliminar todas las demás cosas. Se convierte en el cuarto compromiso en la historia porque hago algunas fusiones.

ingrese la descripción de la imagen aquí

mi registro de git ingrese la descripción de la imagen aquí

¿Alguien puede explicar qué está pasando y cómo solucionar este problema?

asombrado
fuente
2
Necesita reajustar , y solo "seleccionar" la confirmación "agregada de github" (es decir, comentar las líneas para cada otra confirmación)
Robbie Averill
1
rebase qué rama en qué rama puede agregar más explicación.
humazed
what branch= la rama en la que está trabajando, onto what branch= la rama a la que está ingresando la solicitud
Robbie Averill
Expliqué lo que @Robbie Averill insinuó en mi respuesta. Es extraño que nadie haya escrito una respuesta explicando esto hasta ahora.
Ferit

Respuestas:

109

Tienes varias técnicas para hacerlo.

Esta publicación: lea la parte sobre la reversión y explicará en detalle lo que queremos hacer y cómo hacerlo.

Aquí está la solución más simple a su problema:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

El comando revert creará una nueva confirmación con el deshacer de la confirmación original.

CodeWizard
fuente
2
¿Funciona incluso cuando bifurcamos el proyecto de otra persona y queremos eliminar algunos comentarios en la solicitud de extracción?
Dr.jacky
110

A la gente no le gustaría ver un compromiso incorrecto y un compromiso de reversión para deshacer los cambios del compromiso incorrecto. Esto contamina comete la historia.

Aquí hay una forma sencilla de eliminar la confirmación incorrecta en lugar de deshacer los cambios con una confirmación de reversión.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n // dónde n es el número de últimas confirmaciones que desea incluir en la rebase interactiva.

  3. Reemplazar pickcondrop confirmaciones que desea descartar.
  4. Guardar y Salir.
  5. git push --force
feritar
fuente
8
esto funcionó para mí como un encanto. Tuve un montón de confirmaciones que no deberían haber estado en las relaciones públicas. Simplemente lo modifiqué de forma interactiva, eliminé esas confirmaciones y las
rechacé
1
De todos modos, debe sincronizar con el maestro remoto antes de iniciar una pr, ¿no?
ferit
5
Para empujar que tenía que hacer: git push origin HEAD:myBranch --force. Pero por lo demás genial y útil.
ScottyBlades
4
Esto también es útil cuando desea arreglar un PR abierto en GitHub, solo necesita poder hacer un empujón forzado
Vladimir Hidalgo
1
@jorijnsmit se refieren a después de ejecutar git rebase -i HEAD~<n>, en la parte superior del archivo habrá <n>líneas de confirmaciones, con cada línea que contiene el texto pick <commit id>. Las confirmaciones predeterminadas son pick, por lo que para cada confirmación que desee eliminar, cambie el texto pickadrop
Slim
6

Si está eliminando una confirmación y no desea mantener sus cambios, @ferit tiene una buena solución.

Si desea agregar ese compromiso a la rama actual, pero no tiene sentido ser parte del pr actual, puede hacer lo siguiente en su lugar:

  1. utilizar git rebase -i HEAD~n
  2. Cambie la confirmación que desea eliminar a la posición inferior (más reciente)
  3. Guardar y Salir
  4. utilícelo git reset HEAD^ --softpara deshacer los cambios y devolverlos a un estado por etapas.
  5. utilícelo git push --forcepara actualizar la rama remota sin su confirmación eliminada.

Ahora habrá eliminado la confirmación de su control remoto, pero aún tendrá los cambios localmente.

Juan
fuente
2

Entonces haz lo siguiente,

Digamos que el nombre de su rama es my_branch y esto tiene las confirmaciones adicionales.

  1. git checkout -b my_branch_with_extra_commits (Mantener esta rama guardada con un nombre diferente)
  2. gitk (Abre la consola de git)
  3. Busque el compromiso que desea mantener. Copie el SHA de ese compromiso en un bloc de notas.
  4. git checkout my_branch
  5. gitk (Esto abrirá la consola de git)
  6. Haga clic con el botón derecho en la confirmación a la que desea volver (Estado anterior a sus cambios) y haga clic en "reset branch to here "
  7. Hacer un git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Ahora mire el historial de confirmaciones de la sucursal local y asegúrese de que todo se vea bien.

Som Bhattacharyya
fuente
0

Esto es lo que me ayudó:

  1. Crea una nueva rama con la existente. Llamemos al existente branch_oldy al nuevo como branch_new.

  2. Restablezca branch_newa un estado estable, cuando no tuvo ningún problema para comprometerse. Por ejemplo, para ponerlo en el nivel de su maestro local, haga lo siguiente:

    git reset —hard master git push —force origin

  3. cherry-picklas confirmaciones de branch_oldenbranch_new

  4. git push
Sampada
fuente