2009-11-10 18 views
404

Tengo un proyecto con varias ramas. Los he estado presionando al GitHub, y ahora que alguien más está trabajando en ellos, tengo que sacar algo de GitHub. Funciona bien en el maestro. Pero di que tengo rama xyz. ¿Cómo puedo extraer la rama xyz de GitHub y fusionarla en la rama xyz de mi servidor local?Git extrae una cierta rama de GitHub

realidad tengo mi respuesta aquí: Push and pull branches in Git

Pero me da un error y algo acerca de "hacia adelante no rápida" o "[rechazada]!".

¿Alguna sugerencia?

+3

¿cuál es el comando real que se está ejecutando repo? –

+1

Es fetch que puede fallar con el mensaje 'no avance rápido'. ¿Modificó la rama de rastreo remoto (origen/xyz) o la rama rebobinó/reescribió en el repositorio remoto? Puede que necesite usar "' git fetch origin --force' ", pero lea la documentación antes de hacerlo. –

Respuesta

466

pero me da una error "! [rechazado]" y algo sobre "avance no rápido"

Eso es porque Git no puede fusionar los cambios de las ramas en su maestro actual. Supongamos que ha comprobado la rama master y desea fusionar en la rama remota other-branch. Al hacer esto:

$ git pull origin other-branch 

Git es básicamente haciendo esto:

$ git fetch origin other-branch && git merge other-branch 

Es decir, un pull es sólo un fetch seguido de un merge. Sin embargo, cuando pull -ing, Git única fusionar other-branch si se puede realizar un avance rápido fusión .Una combinación de avance rápido es una combinación en la que el encabezado de la rama en la que intenta fusionarse es un descendiente directo del encabezado de la rama que desea fusionar. Por ejemplo, si usted tiene este árbol historia, entonces la fusión other-branch se traduciría en una combinación de avance rápido:

O-O-O-O-O-O 
^  ^
master other-branch 

Sin embargo, esto no ser una combinación de avance rápido:

v master 
O-O-O 
\ 
\-O-O-O-O 
     ^other-branch 

para resolver el problema, primero fetch la rama remota:

$ git fetch origin other-branch 

Entonces me rge en su rama actual (voy a suponer que eso es master), y corregir los conflictos de fusión:

$ git merge origin/other-branch 
# Fix merge conflicts, if they occur 
# Add merge conflict fixes 
$ git commit # And commit the merge! 
+0

No, el problema está en ir a buscar, no en el paso de fusión. –

+2

Normalmente, los controles remotos están configurados de forma tal que las recuperaciones son forzadas, incluso si no dan como resultado una confirmación de avance rápido, por lo que no debería ocurrir en la recuperación a menos que el OP haya cambiado algo con la configuración habitual. El problema de avance rápido puede ocurrir durante fetch * o * merge. ¿Qué te hace decir que el problema está definitivamente en la búsqueda y no en la fusión? – mipadi

+0

Sigo estos pasos (buscar, fusionar). Git me dice que no hay nada que hacer. Cuando intento comprometerme, se cae gimiendo sobre los adelantos rápidos. –

27

No estoy seguro de entender completamente el problema, pero tirando de una rama existente se hace así (al menos a mí me funciona :)

git pull origin BRANCH 

Esto es suponiendo que su rama local se crea fuera de el origen/SUCURSAL.

88

Puede tirar de una rama a una rama con los siguientes comandos.

git pull {repo} {remotebranchname}:{localbranchname} 

git pull origin xyz:xyz 

Cuando esté en la rama principal también se puede primer pago y envío como una rama:

git checkout -b xyz 

Esto crea una nueva rama, "XYZ", del maestro y comprueba directamente hacia fuera.

entonces usted:

git pull origin xyz 

Esta tira de la nueva rama a su xyz sucursal local.

+0

¡Perfecto! Simplemente no sabía esa sintaxis: git pull {repo} {remotebranchname}: {localbranchname}. Pregunta, si ese tirón no funciona (quizás alguien haya actualizado la sucursal y haya conflictos de fusión) ¿cuáles son mis opciones? – Costa

+6

Estoy bajando la votación porque intenta fusionar la rama remota en su rama actual (por ejemplo, maestra). Esto no es lo que la mayoría de la gente quiere hacer, y no es lo que pidió el OP. La respuesta por @mohit es la elección correcta. – Phrogz

+0

Phrogz: parece que este comportamiento ha cambiado en las versiones recientes de Git. Lo usé antes y funcionó perfectamente bien. – Pawan

241

Simplemente seguimiento de sus sucursales remotas de forma explícita y un simple git pull hará exactamente lo que quiere:

git branch -f remote_branch_name origin/remote_branch_name 
git checkout remote_branch_name 

O incluso más apropiado en el GitHub documentation on forking:

git branch -f new_local_branch_name upstream/remote_branch_name 
+0

cuando lo haces: ** git checkout remote_branch name **, ¿se trata de una operación local? – berto77

+28

Si obtiene 'No es un nombre de objeto válido:' origin/remote_branch_name ', primero haga' git fetch origin '. –

+0

@ berto77 sí, lo es. – dbliss

65

La mejor manera es:

git checkout -b <new_branch> <remote repo name>/<new_branch> 
25

git fetch se agarra la última lista de ramas.

Ahora puede git checkout MyNewBranch

Hecho :)


Para más información ver documentos: git fetch

5

Esto me ayudó a conseguir la rama remota antes de fusionarse en otra:

git fetch repo xyz:xyz 
git checkout xyz 
1

también puede hacer

git pull -r origin master 

arreglar los conflictos de fusión en su caso

git rebase --continue 

-r es para rebase. Esto le hará estructura de las ramas de

 v master  
o-o-o-o-o 
    \o-o-o 
     ^other branch 

a

 v master  
o-o-o-o-o-o-o-o 
      ^other branch 

Esto conducirá a un historial limpio. Nota: en caso de que ya haya empujado su otra rama al origen (o cualquier otro control remoto), es posible que tenga que forzar el envío de su bifurcación después de la rebase.

git push -f origin other-branch 
0
git pull <gitreponame> <branchname> 

Por lo general, si sólo han Repo asignado a su código a continuación, la gitreponame sería origen.

Si está trabajando en dos repositorios como uno es local y otro para control remoto como puede verificar la lista del repositorio desde git remote -v. esto muestra cuántos repo se asignan a su código actual.

BranchName debería existir en gitreponame correspondiente.

permite utilizar las siguientes dos comandos para agregar o quitar de

git remote add <gitreponame> <repourl> 
git remote remove <gitreponame>