Git extrae cierta rama de GitHub

631

Tengo un proyecto con múltiples sucursales. Los he estado empujando a GitHub , y ahora que alguien más está trabajando en el proyecto, necesito sacar sus ramas de GitHub. Funciona bien en master. Pero digamos que alguien creó una rama xyz. ¿Cómo puedo extraer una rama xyzde GitHub y fusionarla en una rama xyzen mi localhost?

De hecho, tengo mi respuesta aquí: empujar y tirar ramas en Git

Pero recibo un error "! [Rechazado]" y algo sobre "avance no rápido".

¿Alguna sugerencia?

tybro0103
fuente
3
¿Cuál es el comando real que estás ejecutando?
Alex N.
1
Es una búsqueda que puede fallar con el mensaje 'no avance rápido'. ¿Modificó la rama de seguimiento remoto (origen / xyz), o la rama se rebobinó / reescribió en el repositorio remoto? Puede que necesite usar " git fetch origin --force", pero lea la documentación antes de hacerlo.
Jakub Narębski

Respuestas:

758

Pero recibo un 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. Digamos que ha desprotegido la rama mastery desea fusionarse en la rama remota other-branch. Cuando haces esto:

$ git pull origin other-branch

Git básicamente está haciendo esto:

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

Es decir, a pulles solo un fetchseguido de a merge. Sin embargo, cuando se pullactiva, Git solo se fusionará other-branch si puede realizar una combinación de avance rápido . Una fusión de avance rápido es una fusión en la que la cabeza de la rama en la que está intentando fusionarse es un descendiente directo de la cabeza de la rama que desea fusionar. Por ejemplo, si tiene este árbol de historial, la fusión other-branchdaría como resultado una fusión de avance rápido:

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

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

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

Para resolver su problema, primero busque la rama remota:

$ git fetch origin other-branch

Luego combínelo en su rama actual (supongo que es así master), y arregle cualquier conflicto de fusión:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!
mipadi
fuente
No, el problema es con la obtención, no con el paso de fusión.
Jakub Narębski
3
Normalmente, los controles remotos se configuran de manera tal que las recuperaciones son forzadas, incluso si no resultan en 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 la recuperación o la fusión. ¿Qué te hace decir que el problema está definitivamente en buscar y no en combinar?
mipadi
Sigo estos pasos (buscar, fusionar). Git me dice que no hay nada que hacer. Cuando trato de comprometerme, cae sobre los gemidos sobre los avances rápidos.
Jean Jordaan
1
@mipadi Tuve el mismo problema que Jean y, aunque no puedo decir que el control remoto esté configurado de la manera no predeterminada que mencionaste, ¡puedo decir que git fetch -fhe solucionado mi problema! ¡Gracias!
cregox
1
Esto fusiona la rama remota xzyen la rama local master, que no es lo que implicaba la pregunta original; "¿Cómo puedo extraer la rama xyz de GitHub y fusionarla en la rama xyz en mi host local?"
user5359531
302

Simplemente git pullhaga un seguimiento explícito de sus ramas remotas y un simple hará lo que quiera:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Este último es una operación local.

O incluso más adecuado para la documentación de GitHub sobre bifurcación :

git branch -f new_local_branch_name upstream/remote_branch_name
innaM
fuente
40
Si obtiene 'No es un nombre de objeto válido:' origin / remote_branch_name ', primero haga' git fetch origin '.
Martin Konicek
131

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

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

git pull origin xyz:xyz

Cuando estás en la rama maestra, también puedes primero pagar una rama como:

git checkout -b xyz

Esto crea una nueva rama, "xyz", desde el maestro y la comprueba directamente.

Entonces haces:

git pull origin xyz

Esto tira de la nueva sucursal a su xyzsucursal local .

Robert Cabri
fuente
1
¡Perfecto! Simplemente no conocía esa sintaxis: git pull {repo} {remotebranchname}: {localbranchname}. Pregunta, si ese tirón no funciona (tal vez alguien ha actualizado la rama y habría conflictos de fusión) ¿cuáles son mis opciones?
Costa
77
Estoy rechazando esto 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 solicitó el OP. La respuesta de @mohit es la elección correcta.
Phrogz
1
Phrogz: parece que este comportamiento cambió en versiones recientes de Git. Usé esto antes y funcionó perfectamente bien.
Pawan
89

La mejor manera es:

git checkout -b <new_branch> <remote repo name>/<new_branch>
mohit
fuente
1
Después de crear una nueva rama "dev" en github e intentar lo anterior, recibí el siguiente mensaje de error: "fatal: origin / dev no es un commit y no se puede crear una rama 'dev' a partir de él" La solución fue "git buscar "según la solución de Bradley Flood a continuación, y luego volver a ejecutar la respuesta de mohit.
TomEberhard
46

git fetch tomará la última lista de sucursales.

Ahora usted puede git checkout MyNewBranch

Hecho :)


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

Bradley Flood
fuente
37

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

git pull origin BRANCH

Esto supone que su sucursal local se crea fuera del origen / SUCURSAL.

Alex N.
fuente
15

Esto me ayudó a obtener una rama remota antes de fusionarla en otra:

git fetch repo xyz:xyz
git checkout xyz
anatoly techtonik
fuente
8

En pocas palabras, si desea extraer de GitHub la rama the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want
Adrien Renaud
fuente
3
git pull <gitreponame> <branchname>

Por lo general, si solo ha asignado un repositorio a su código, el gitreponame sería el origen.

Si está trabajando en dos repositorios, como uno es local y otro para remoto, puede consultar la lista de repositorios desde git remote -v . Esto muestra cuántos repositorios se asignan a su código actual.

BranchName debe existir en gitreponame correspondiente.

puede usar los siguientes dos comandos para agregar o eliminar repositorios

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>
prathap
fuente
2

también puedes hacer

git pull -r origin master

arregle los conflictos de fusión si hay alguno

git rebase --continue

-r es para rebase. Esto te hará ramificar la estructura 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 una historia más limpia. Nota: En caso de que ya haya empujado su otra rama al origen (o cualquier otro control remoto), es posible que tenga que forzar a empujar su rama después del rebase.

git push -f origin other-branch
PKV
fuente
1

yo hice

git branch -f new_local_branch_name origin/remote_branch_name

En vez de

git branch -f new_local_branch_name upstream/remote_branch_name

Según lo sugerido por @innaM. Cuando utilicé la versión ascendente, decía 'fatal: No es un nombre de objeto válido:' upstream / remote_branch_name ''. No lo hice git fetch origincomo lo sugirió un comentario, sino que simplemente lo reemplacé upstreamcon origin. Supongo que son equivalentes.

Vicky
fuente
0

para sacar la rama de GitHub puedes usar

git checkout --track origin/the-branch-name

Asegúrese de que el nombre de la rama sea exactamente el mismo.

Código Fradely
fuente