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:
- Debido a que bifurcaron mi proyecto, nuestros repositorios comparten la misma ''historia''
- 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?
- Todavía no tengo una rama llamada "foo". No sé si necesito crear manualmente esto primero o qué.
- 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