repositorio remota rama origin example eliminar crear clonar cambiar git github git-branch git-pull git-remote

remota - git push example



Cómo sacar una rama remota del repositorio de otra persona (5)

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

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

Supongamos 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 los suyos como un control remoto?
  3. Todavía no tengo una rama llamada "foo". No sé si necesito crear manualmente esto primero o qué.
  4. Definitivamente quiero que esto sea arrastrado a una rama separada y no a mi maestro.

Espero que tenga algún sentido.


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

Ejemplo:

Arreglando tu código inseguro # 8
alice quiere fusionar 1 commit en your_repo:master from her_repo:branch

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

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


Si el repositorio bifurcado está protegido para que no puedas empujarlo directamente hacia él, y tu objetivo es hacer cambios en su foo, entonces necesitas que su rama foo entre en tu repo así:

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

Ahora tienes una copia local de foo sin flujo ascendente asociado. Puede cometer cambios en él (o no) y luego empujar a su foo a su propio repositorio remoto.

git push --set-upstream origin foo

Ahora foo está en tu repo en GitHub y tu foo local lo está rastreando. Si continúan realizando cambios en foo, puedes obtener los suyos y fusionarlos con tu foo.

git checkout foo git fetch protected_repo git merge protected_repo/foo


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>


No, no es necesario agregarlos como control remoto. Sería engorroso y un dolor hacer cada vez.

Agarrando sus compromisos:

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

Esto crea una sucursal local llamada ournameforbranch que es exactamente igual a la que theirbranch ellos para ellos. Para el ejemplo de la pregunta, el último argumento sería foo:foo .

Nota :ournameforbranch parte de :ournameforbranch se puede dejar más lejos si inventar un nombre que no entre en conflicto con una de sus propias sucursales es molesto. En ese caso, una referencia llamada FETCH_HEAD está disponible. Puede obtener el git log FETCH_HEAD para ver sus compromisos y luego hacer cosas como cherry-picked pick para seleccionar sus compromisos.

Empujando de nuevo a ellos:

A menudo, usted desea arreglar algo de ellos y empujarlo hacia atrás. Eso es posible también:

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 le preocupa trabajar en estado separado , cree una rama utilizando :ournameforbranch y reemplace FETCH_HEAD y HEAD arriba con ournameforbranch .


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

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

git checkout foo git pull

Respuesta a los comentarios:

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

No es necesario crear una nueva rama, aunque lo recomiendo. También podría comprometerse directamente con foo y hacer que su compañero de trabajo saque su sucursal. Pero esa rama ya existe y su rama foo debe configurarse como una rama hacia arriba:

git branch --set-upstream foo colin/foo

asumiendo que colin es su repositorio (un remoto para su repositorio de colaboradores) definido de manera similar:

git remote add colin git://path/to/colins/repo.git