¿Por qué git devuelve una queja sobre la opción -m faltante?

Por lo tanto, trabajo en un proyecto con otras personas, y hay varios ingenios trabajando allí. Alguien simplemente solucionaría el problema, y ​​me fusioné con su tenedor, pero luego me di cuenta de que podía encontrar una mejor solución. Quiero cancelar el compromiso que hice. Traté de hacer esto con git revert HEAD , pero me dio este error:

  fatal: Commit <SHA1> es una combinación pero no se dio la opción -m. 

¿Qué significa esto? Cuando me fusioné e hice esto, usé la opción -m para decir "Combinar con <nombre de usuario>".

¿Qué estoy haciendo mal aquí?

92
12 мая '11 в 0:34 2011-05-12 00:34 icnhzabot se establece el 12 de mayo de 2011 a las 0:34 2011-05-12 00:34
@ 3 respuestas

Por defecto, git revert niega a devolver un commit de fusión, porque lo que realmente significa es ambiguo. Creo que tu HEAD es en realidad una solución de fusión.

Si desea cancelar un compromiso de combinación, debe especificar qué elemento de combinación principal desea tratar como la línea de conexión principal, es decir, a qué desea volver.

A menudo, este será el número uno de los padres, por ejemplo, si estaba en el master e hizo git merge unwanted , y luego decidió devolver la fusión unwanted . El primer padre será su rama master previa a la fusión, y el segundo padre será el final de lo unwanted .

En este caso, puedes hacer:

 git revert -m 1 HEAD 
103
12 мая '11 в 0:48 2011-05-12 00:48 Charles Bailey dio la respuesta el 12 de mayo de 2011 a las 0:48 2011-05-12 00:48

Digamos que otro tipo creó un panel encima de Foo, pero usted creó una base al mismo tiempo, y luego se fusionó, dando la historia.

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

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

No cubos con git revert :

  $ git revertir HEAD fatal: Commit 2582152 ... es una combinación pero no se dio la opción -m. 

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

  $ git revert --no-edit -m 1 HEAD [master e900aad] Revertir "Combinar rama 'otherguy'"  0 archivos modificados, 0 inserciones (+), 0 eliminaciones (-)  modo de borrado 100644 bar 

Elimina efectivamente la bar y crea la historia.

border=0
  $ git lola * e900aad (HEAD, master) Revertir "Combinar rama 'otherguy'" * 2582152 fusionar rama 'otherguy' | \   |  * c7256de (otherguy) bar * |  b7e7176 baz | /   * 9968f79 foo 

Pero sospecho que quieres tirar la fusión:

  $ git reset - hard HEAD ^ HEAD está ahora en b7e7176 baz $ git lola * b7e7176 (HEAD, master) baz |  * c7256de (otherguy) bar | /   * 9968f79 foo 

Como se describe en el manual de git rev-parse .

<rev>^ , por ejemplo. CABEZA ^, v1.5.1^0
El sufijo ^ al parámetro de revisión significa el primer padre de este objeto de confirmación. ^<n> significa que el nth elemento padre (es decir, <rev>^ equivalente a <rev>^1 ). Como regla especial, <rev>^0 significa commit en sí mismo y se usa cuando <rev> es el nombre del objeto de etiqueta asociado con el objeto de commit.

por lo tanto, antes de llamar a git reset , HEAD^ (o HEAD^1 ) era b7e7176, y HEAD^2 era c7256de, es decir, el primer y segundo padre de la fusión, respectivamente.

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

34
12 мая '11 в 1:20 2011-05-12 01:20 Greg Bacon da la respuesta el 12 de mayo de 2011 a las 1:20 am 2011-05-12 01:20

Tuve este problema, la solución fue mirar el programa de fijación (usando gitk) y ver lo que tenía:

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

Ahora entiendo lo que quiero hacer.

 git cherry-pick -m 2 mycommitsha 

Esto se debe al hecho de que -m 1 se fusionará en función de un padre común, donde -m 2 combina -m 2 en base a la rama y, es decir, la que quiero seleccionar cherry-pick.

3
24 окт. la respuesta se da shmish111 24 oct. 2014-10-24 15:56 '14 a las 15:56 2014-10-24 15:56

Otras preguntas acerca de tags o Haz una pregunta