2009-03-06 15 views
45

¡Me rindo! Cada vez que trate de empujar consigo una estúpida:git push rejected

! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '[email protected]:companyX/projectX.git' 

Nuestro equipo tiene una nueva configuración de Git. En lugar de crear sucursales privadas, ahora bifurqué nuestro repositorio principal (en github) para crear mi propia copia.

En algún momento lo que hice fue:

$ git fetch upstream master:upstreammaster 

Así que aquí es mi configuración actual ::

$ git branch 
master 
* upstreammaster 

$ git remote -v 
origin [email protected]:userX/projectX.git 
upstream [email protected]:companyX/projectX.git 

donde usuarioX es mi depósito privado.

Así que voy a hacer algunos cambios en mi rama upstreammaster, y el PULL de "upstream master". Todo se funde y esas cosas:

$ git pull upstream master 
remote: Counting objects: 95, done. 
remote: Compressing objects: 100% (60/60), done. 
remote: Total 60 (delta 54), reused 0 (delta 0) 
Unpacking objects: 100% (60/60), done. 
From [email protected]:companyX/projectX 
* branch   master  -> FETCH_HEAD 
Merge made by recursive. 
stuff      | 165 ++++++++++++-------- 
stuff      | 35 ++-- 
stuff      | 107 ++++++++++--- 
stuff      | 105 ++++++++++--- 
stuff    | 24 ++-- 
stuff    | 9 +- 
stuff     | 53 +++---- 
stuff   | 44 +++--- 
stuff    | 52 +++---- 
stuff | 32 +---- 
stuff   | 4 +- 
stuff    | 138 ++++++++--------- 
stuff  | 58 ++++---- 
stuff | 115 ++++++++------ 
stuff   | 5 +- 
stuff      | 39 ++--- 
stuff      | 28 ++-- 
17 files changed, 560 insertions(+), 453 deletions(-) 

pero luego cuando trato de hacer:

$ git push upstream master 
To [email protected]:companyX/projectX.git 
! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to '[email protected]:companyX/projectX.git' 

Cualquier ayuda se agradece greately! Si necesita una aclaración, pregunte: ¡responderé!

+0

@drozzy: ¿Sabe usted por qué Git no acepta su mando? Tu comando una vez funcionó para mí. Después de mover Git a otra carpeta en mi Mac, recibo un mensaje de error similar. –

+0

no lo siento, no sé. En este momento, hago principalmente "git push upstream master", después de haber fusionado mi otra rama en upstreammaster. – drozzy

+0

Ver también [Las actualizaciones de Git push no-fast-forward fueron rechazadas] (http://stackoverflow.com/questions/4684352/whats-a-fast-forward-in-git). –

Respuesta

20

Al hacer un empujón, intente especificar el refspec para el maestro de aguas arriba:

git push upstream upstreammaster:master 
+1

Esto funciona por alguna razón ... – drozzy

+3

@Jarret: No funciona para mí. Mi código $ git push [email protected]: usuario/repo.git [email protected]: usuario/repo.git: maestro. –

+0

Masi, intente sin utilizar la URL completa en el segundo parámetro: git push [email protected]: usuario/repo.git maestro –

13

En primer lugar, tratar de tirar de la misma refspec que usted está tratando de empujar a.

Si esto no funciona, puede forzar un git push utilizando git push -f <repo> <refspec>, pero tenga cuidado: este método puede hacer que las referencias se eliminen en el repositorio remoto.

16

Jarret Hardie es correcto. O bien, primero fusione sus cambios nuevamente en el maestro y luego pruebe el empuje. De forma predeterminada, git push empuja todas las ramas que tienen nombres que coinciden en el control remoto, y ninguna otra. Entonces esas son sus dos opciones: o bien especifíquelo explícitamente como dijo Jarret o fusione nuevamente a una rama común y luego presione.

Se ha hablado de esto en la lista de correos de Git y está claro que este comportamiento no va a cambiar pronto: muchos desarrolladores confían en este comportamiento en sus flujos de trabajo.

Editar/Aclaración

Asumiendo que su rama upstreammaster está listo para empujar entonces se podría hacer esto:

  1. de tracción en cualquier cambio de la corriente.

    $ git pull principal aguas arriba

  2. Cambiar a mi sucursal local master

    $ git checkout master

  3. combinar los cambios en de upstreammaster

    $ git fusionar upstreammaster

  4. Empujar mis cambios hacia arriba

    $ git push aguas arriba

Otra cosa que puede quiere hacer antes de empujar es rebase sus cambios contra aguas arriba/maestro para que sus confirmaciones están todos juntos. Puede hacer eso como un paso separado entre # 1 y # 2 arriba (git rebase upstream/master) o puede hacerlo como parte de su extracción (git pull --rebase upstream master)

+0

¿Qué quiere decir "fusionar de nuevo a una rama común y luego presionar"? ¿Cuál es la rama común en este caso? – drozzy

+0

Tuve el mismo problema después de verificar y trabajar en una sucursal, y promocionar cambios que incluían una actualización de un archivo que se había eliminado en la rama principal (que no había tocado). Otro desarrollador intentó algunos comandos de Git que no detecté, pero el problema persistió: 'git status' mostró que mi rama estaba limpia,' git pull' no hizo nada, pero el comando 'git push' todavía salió' error: falló al presionar algunos refs ... '. Finalmente solucioné el problema de esta manera: 1. 'git checkout master', 2.' git pull', y 3. 'git checkout the_branch_name'. –

+0

er ... bueno, ¿y qué pasa cuando haces el primer comando (git pull upstream master) y tienes un conflicto en el pull ??? Tienes que resolver el conflicto antes de continuar? –

3

¿Su depósito en "aguas arriba" es un depósito descubierto? Tengo el mismo error, pero cuando cambio a desnudo, ya no suceden.

+0

impresionante, esto es exactamente lo que estaba causando mi problema, ¡gracias por la respuesta! – adamc