2009-05-06 13 views
18

Lo que habría posiblemente causar un 'git push' para tratar de comprometerse con dos ramas? Tengo mi propia rama en la que estoy trabajando, que está en el repositorio compartido ... y en una rama principal. En este momento solo quería presionar a mi rama personal, que pasó bien, pero también trató de presionar para dominar y fue rechazado. Se veía algo como esto:¿Por qué git empuja a dos ramas en este git push?

foo$ git push 
Counting objects: 38, done. 
Delta compression using 2 threads. 
Compressing objects: 100% (19/19), done. 
Writing objects: 100% (21/21), 9.73 KiB, done. 
Total 21 (delta 14), reused 0 (delta 0) 
To ssh://example.com/project.git 
    8184634..86b621e mybranch -> mybranch 
! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to 'ssh://example.com/project.git' 

Mi configuración es la siguiente:

remote.origin.url=ssh://example.com/project.git 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 
branch.mybranch.remote=origin 
branch.mybranch.merge=refs/heads/mybranch 

Esko señala que está empujando a la vez porque están en mi config. ¿Qué pasa si quiero presionar a ambos, solo que no al mismo tiempo? Cuando revise mybranch y empiece a presionar, claramente pretendo impulsar mybranch y no dominar. Hay momentos en los que comprobo maestro, código de edición, y deseo confirmar/presionar eso también. ¿Hay alguna manera de que ambos coexistan?

Respuesta

26

Al utilizar git push sin ningún argumento, empujará todas las ramas locales que tienen una rama a distancia correspondiente con el mismo nombre. Desde su repositorio local tiene ramas master y mybranch, y también el repositorio remoto tiene ramas master y mybranch, a continuación, Git va a empujar los dos.

Si usted quiere empujar una sola rama, se puede decir a Git explícitamente que la rama usted quiere empujar: git push origin mybranch

Si usted quiere empujar maestra, puede corregir ese error, tirando primero de maestro. Git se queja de la fusión de ser hacia adelante no rápido, porque alguien más ha empujado una confirmación de dominar desde la última vez que te sacó de maestro.

+0

¿Qué pasa si quiero empujar los dos, pero no en el ¿Mismo tiempo?Hay momentos en los que querré empujar solo mybranch, y hay momentos en los que fusionaré mi rama en maestro y quiero empujar al maestro. ¿Qué hace uno en ese caso? – Coocoo4Cocoa

+0

Siempre puede nombrar explícitamente la rama que desea insertar, usando la forma "git push ". Consulte http://www.kernel.org/pub/software/scm/git/docs/git-push.html –

+0

Las versiones más nuevas de git le permiten especificar este comportamiento. – Dustin

3

Si usted quiere empujar única rama actual, puede utilizar "git push origin CABEZA", o quizás incluso "git push cabeza" (con git moderna).

El comportamiento por defecto si no hay refspec para empuje (refspec que ha definido para buscar a en su configuración, pero no para empuje) es presionar emparejan refs. De git-push(1):

git push [...] [<repositorio><refspec> ...]

<refspec> ...

El refspec especial: (o +: para permitir actualizaciones de avance no rápido) dirige git para empujar las ramas de "igualación": por cada rama que existe en el lado local, el lado remoto se actualiza si una rama de el mismo nombre ya existe en el lado remoto. Este es el modo por defecto operación si no se encuentra refspec explícita (que no es ni el la línea de comandos ni ...

+0

Cuando ejecuto "git push" con un nuevo (er) git (digamos 1.6.3.1), recibo una gran advertencia, diciendo que debo establecer push.default o que el repositorio debe configurar push refspecs. No puedo, por la vida de mí, descubrir cómo hacer lo segundo. Google no ha sido útil. (Me gustaría configurar el reositorio, porque los posibles impulsores a mis repositorios estarán confundidos/molestos con la gran advertencia, y no quiero que tengan que configurar nada después de "git clone ...") – asjo

+2

Configura (configura) remoto. .push, donde sería probablemente en su caso 'origen', y para usar para mirror sync push al depósito simple sería "+ refs/heads/*: refs/heads/*" (y lo mismo para las etiquetas) –