pushed make how example git github git-revert

make - ¿Por qué git revertir quejarse de una opción-m falta?



revert push git (3)

Así que estoy trabajando en un proyecto con otras personas, y hay varias horquillas github trabajando. Alguien acaba de hacer una solución para un problema y me fusioné con su tenedor, pero luego me di cuenta de que podía encontrar una mejor solución. Quiero revertir el compromiso que acabo de hacer. Intenté hacer esto con git revert HEAD pero me dio este error:

fatal: Commit <SHA1> is a merge but no -m option was given.

Qué significa eso? Cuando me fusioné y me comprometí, usé la opción -m para decir "Fusionado con <nombre de usuario>".

¿Qué estoy haciendo mal aquí?


Digamos que el otro chico creó el bar en la parte superior de foo, pero creaste baz mientras tanto y luego se fusionó, dando un historial de

$ git lola * 2582152 (HEAD, master) Merge branch ''otherguy'' |/ | * c7256de (otherguy) bar * | b7e7176 baz |/ * 9968f79 foo

Nota: git lola es un alias no estándar pero útil.

No hay dados con git revert :

$ git revert HEAD fatal: Commit 2582152... is a merge but no -m option was given.

Charles Bailey dio una respuesta excelente, como de costumbre. Usando git revert como en

$ git revert --no-edit -m 1 HEAD [master e900aad] Revert "Merge branch ''otherguy''" 0 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bar

elimina efectivamente la bar y produce un historial de

$ git lola * e900aad (HEAD, master) Revert "Merge branch ''otherguy''" * 2582152 Merge branch ''otherguy'' |/ | * c7256de (otherguy) bar * | b7e7176 baz |/ * 9968f79 foo

Pero sospecho que quieres descartar la fusión de compromiso:

$ git reset --hard HEAD^ HEAD is now at b7e7176 baz $ git lola * b7e7176 (HEAD, master) baz | * c7256de (otherguy) bar |/ * 9968f79 foo

Como se documenta en el manual de git rev-parse

<rev>^ , por ej. HEAD ^, v1.5.1^0
Un sufijo ^ para un parámetro de revisión significa el primer padre de ese objeto de confirmación. ^<n> significa el n -ésimo padre ( es decir, <rev>^ es equivalente a <rev>^1 ). Como regla especial, <rev>^0 significa el compromiso en sí y se usa cuando <rev> es el nombre del objeto de un objeto de etiqueta que hace referencia a un objeto de confirmación.

así que antes de invocar el git reset , HEAD^ (o HEAD^1 ) era b7e7176 y HEAD^2 era c7256de, es decir , respectivamente el primer y segundo padre de la confirmación de fusión.

Tenga cuidado con el git reset --hard porque puede destruir el trabajo.


Por defecto, git revert rehúsa a revertir un commit de fusión ya que lo que realmente significa es ambiguo. Supongo que su HEAD es, de hecho, un compromiso de fusión.

Si desea revertir la confirmación de fusión, debe especificar qué padre de la fusión desea considerar como la troncal principal, es decir, a qué desea revertir.

A menudo, este será el padre número uno, por ejemplo, si fue master y se git merge unwanted no git merge unwanted y luego decidió revertir la fusión de los unwanted . El primer padre sería su rama master anterior a la fusión y el segundo padre sería la punta de unwanted .

En este caso, podrías hacer:

git revert -m 1 HEAD


Tuve este problema, la solución fue mirar el gráfico de confirmación (usando gitk) y ver que tenía lo siguiente:

* commit I want to cherry-pick (x) |/ | * branch I want to cherry-pick to (y) * | |/ * common parent (x)

Ahora entiendo que quiero hacer

git cherry-pick -m 2 mycommitsha

Esto se debe a que -m 1 se fusionaría en función del padre común donde -m 2 fusiona en función de la rama y, que es a la que quiero elegir.