2011-05-11 11 views
98

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. He intentado hacer esto con git revert HEAD pero me dio este error:¿Por qué git revertir se queja de una opción -m que falta?

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í?

Respuesta

107

De forma predeterminada, git revert se niega a revertir una combinación de fusión ya que lo que realmente significa es ambiguo. Supongo que su HEAD es, de hecho, una confirmación de fusión.

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

A menudo este será el padre número uno, por ejemplo, si estaba en master e hizo git merge unwanted y luego decidió revertir la fusión de unwanted. El primer padre sería su rama precombina master y el segundo padre sería la punta de unwanted.

En este caso se podría hacer:

git revert -m 1 HEAD 
+3

OK gracias. Me resultó más fácil simplemente cambiar los dos archivos que se vieron afectados por la fusión y luego confirmar algunos de mis otros cambios también. – icnhzabot

+19

¿Dónde puedo encontrar información si tengo que usar -m1 o -m2, ...? –

+10

'git cat-file -p [MERGE_COMMIT_ID]' mostrará las ramas padre en orden. La primera lista sería '-m 1', la segunda' -m 2'. – nostromo

34

Diga el otro tipo creado barra en la parte superior del foo, pero creado Baz, mientras tanto, y luego se fusionaron, dando una historia 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 excellent answer 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 bar y produce una historia de

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

Pero sospecho que deseas tiro de la fusión cometer:

$ 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 git rev-parse manual

<rev>^ , e.g. HEAD^, v1.5.1^0
A suffix ^ to a revision parameter means the first parent of that commit object. ^<n> means the n-th parent (i.e.<rev>^ is equivalent to <rev>^1). As a special rule, <rev>^0 means the commit itself and is used when <rev> is the object name of a tag object that refers to a commit object.

así antes de invocar git reset, HEAD^ (o HEAD^1) fue b7e7176 y HEAD^2 era c7256de, es decir, respectivamente la primera y segunda padres de la fusión se comprometen.

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

+2

Es un mundo confuso, confuso y agitado. Excepto por Lola. Gracias a un millón por este fantástico alias. – Barney

3

he tenido este problema, la solución fue mirar el gráfico de comprometerse (usando gitk) y ver que tenía los siguientes:

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

Ahora entiendo que yo quiero hacer

git cherry-pick -m 2 mycommitsha 

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

+0

¿Podría alguien comentar por qué desestimaron esto? – shmish111

+0

Posiblemente porque no está relacionado con 'git-revert', de lo que se trata esta pregunta. – pnomolos

+0

Creo que esta pregunta es sobre la opción '-m', no exclusivamente sobre' git merge'. Es decir, el razonamiento detrás del uso de la opción '-m' parecería ser similar para revertir y seleccionar. Si eso no es cierto, háganoslo saber. Como no he encontrado ninguna otra pregunta que aborde específicamente el uso exclusivo de la misma, gracias por esta respuesta, que probablemente llevó a Google a ayudarme a encontrar esta pregunta y una discusión útil y relevante. – nealmcb

Cuestiones relacionadas