Cómo extraer una rama remota del repositorio de otra persona

266

Tengo un proyecto alojado en GitHub que alguien ha bifurcado. En su bifurcación, crearon una nueva rama "foo" e hicieron algunos cambios. ¿Cómo llevo a su "foo" a una nueva sucursal también llamada "foo" en mi repositorio?

Entiendo que me pueden enviar una solicitud de extracción, pero me gustaría iniciar este proceso yo mismo.

Suponga lo siguiente:

  1. Debido a que bifurcaron mi proyecto, nuestros repositorios comparten la misma 'historia'
  2. Aunque GitHub muestra que su proyecto fue bifurcado del mío, mi repositorio local no tiene ninguna referencia al proyecto de esta persona. ¿Necesito agregar el suyo como control remoto?
  3. Todavía no tengo una rama llamada "foo". No sé si primero necesito crear esto manualmente.
  4. Definitivamente quiero que esto se arrastre a una rama separada y no a mi maestro.
Colin O'Dell
fuente

Respuestas:

349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

Esto configurará una sucursal local foo, rastreando la sucursal remota coworker/foo. Entonces, cuando su compañero de trabajo haya realizado algunos cambios, puede realizarlos fácilmente:

git checkout foo
git pull

Respuesta a comentarios:

Genial :) Y si quisiera hacer mis propios cambios en esa rama, ¿debería crear una segunda "barra" local de "foo" y trabajar allí en lugar de directamente en mi "foo"?

No necesita crear una nueva sucursal, aunque lo recomiendo. También podría comprometerse directamente fooy que su compañero de trabajo retire su rama. Pero esa rama ya existe y su rama foodebe configurarse como una rama ascendente:

git branch --set-upstream foo colin/foo

suponiendo colinque su repositorio (un repositorio remoto para sus compañeros de trabajo) se defina de manera similar:

git remote add colin git://path/to/colins/repo.git
ralphtheninja
fuente
3
Eso fue muy rápido :) Es posible que desee agregar que debe usar la git://URL de la página del repositorio GitHub de la otra persona en lugar de //path/to/coworkers/repo.git. (Describiendo que eso fue lo que hizo que mi respuesta fuera demasiado lenta;))
Mark Longair
Genial :) Y si quisiera hacer mis propios cambios en esa rama, ¿debería crear una segunda "barra" local de "foo" y trabajar allí en lugar de directamente en mi "foo"?
Colin O'Dell
¿O es seguro trabajar directamente en mi "foo" y sacar / fusionar sus cambios más adelante? ¿Cuál es la mejor práctica aquí?
Colin O'Dell
1
Perfecto, eso es exactamente lo que estaba buscando :) ¡Gracias por tu ayuda!
Colin O'Dell
1
Buena respuesta en 3 minutos!
Tieme
103

No, no necesita agregarlos como control remoto. Eso sería engorroso y difícil de hacer cada vez.

Agarrando sus compromisos:

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

Esto crea una rama local llamada ournameforbranchque es exactamente igual a lo que theirbranchera para ellos. Para el ejemplo de la pregunta, el último argumento sería foo:foo.

La :ournameforbranchparte de la nota puede dejarse de lado si es molesto pensar en un nombre que no entre en conflicto con una de sus propias ramas. En ese caso, una referencia llamada FETCH_HEADestá disponible. Puedes git log FETCH_HEADver sus commits y luego hacer cosas como cherry-pickedelegir sus commits.

Empujándolo de nuevo a ellos:

A menudo, quieres arreglar algo de ellos y empujarlo de vuelta. Eso también es posible:

git fetch [email protected]:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push [email protected]:theirusername/reponame.git HEAD:theirbranch

Si trabajar en estado separado te preocupa, crea una rama usando :ournameforbranchy reemplaza FETCH_HEADy más HEADarriba con ournameforbranch.

antak
fuente
2
Gracias por esto, la otra respuesta no funciona si tanto usted como la otra persona tienen ramas idénticas (como la masterrama predeterminada )
Job
2
Vale la pena mencionar que este método no funcionará si no tiene cosas como la clave SSH asociada con su cuenta de Github, consulte stackoverflow.com/questions/12940626
Przemek D
¿no tienes que ser agregado como colaborador para poder empujar a su repositorio?
Miel
@Honey Ciertamente! Empujar asume que tiene los permisos necesarios en el extremo remoto para empujar. La obtención del mismo modo supone que la ruta es accesible.
antak
Si ejecuta git branch -m newbranchmientras está en este estado separado, git perderá la cabeza y comenzará a decir que su repositorio ya no es válido. git initparece arreglarlo y volverlo a poner más o menos en el estado en que estaba antes, con la rama llamada "newbranch".
Ian Hickson el
14

Si la respuesta de antak:

git fetch [email protected]:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

te dio:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Luego (siguiendo los consejos de Przemek D) use

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>
Peter
fuente
6

La siguiente es una buena solución conveniente que funciona con GitHub para verificar la rama PR desde la bifurcación de otro usuario. Debe conocer el ID de la solicitud de extracción (que muestra GitHub junto con el título de relaciones públicas).

Ejemplo:

La fijación de su código inseguro # 8
Alice quiere fusionar 1 cometen en your_repo:masterdeher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

Sustituya su control remoto si es diferente de origin.
Sustituya 8con la ID de solicitud de extracción correcta.

Subfuzion
fuente
2
Esto necesita más votos a favor. funciona perfectamente y evitó el error "fatal: no se pudo encontrar la referencia remota" que recibí con la respuesta más votada. ¡Gracias!
Michael Romrell el
2 líneas de código fácil. ¡Gracias por compartir esto! Lo único más dulce que esto es fusionar las actualizaciones nuevamente en su solicitud de extracción de una manera fácil.
klewis
4

GitHub tiene una nueva opción en relación con las respuestas anteriores, solo copie / pegue las líneas de comando desde el PR:

  1. Desplácese hasta la parte inferior del PR para ver el botón MergeoSquash and merge
  2. Haga clic en el enlace a la derecha: view command line instructions
  3. Presione el ícono Copiar a la derecha del Paso 1
  4. Pega los comandos en tu terminal
Robert Monfera
fuente
2

Si el repositorio bifurcado está protegido, por lo que no puede empujarlo directamente, y su objetivo es hacer cambios en su foo, entonces debe hacer que su sucursal foo entre en su repositorio de la siguiente manera:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

Ahora tiene una copia local de foo sin upstream asociado. Puede confirmar los cambios (o no) y luego empujar a su foo a su propio repositorio remoto.

git push --set-upstream origin foo

Ahora foo está en tu repositorio en GitHub y tu foo local lo está rastreando. Si continúan haciendo cambios en foo, puedes buscar los suyos y unirte a tu foo.

git checkout foo 
git fetch protected_repo
git merge protected_repo/foo
J Smith
fuente