├── image.png └── README.md /image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sashiyalala/n-remotes-42/HEAD/image.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # guía para manejar varios remotos en git 2 | 3 | ## ¿por qué esta guía? 4 | 5 | esto son unos apuntes para enseñar a usar git para trabajar cómodamente entre 6 | los ordenadores de 42 y tu casa (o cualquier otro ordenador, vamos): 7 | 8 | * sin tener que usar/conectar USBs/etc. 9 | * manteniendo el historial/logs de commits idéntico 10 | 11 | esto último viene muy bien para las reuniones *1to1*, después de haber 12 | experimentado ya una y confirmarlo con el staff, ya que puedan ver en qué 13 | fechas has estado trabajando aunque no estuvieras yendo a 42 en persona. ¿por 14 | qué? porque si copias algo (archivo/s, carpeta/s...) de, e.g., un USB y lo 15 | committeas todo de golpe, solo va a aparecer un commit de ese mismo momento y 16 | no se va a reflejar cómo has estado trabajando días/semanas/meses anteriores 17 | 18 | > me llamo Sasha, puedes usar cualquier pronombre conmigo y si tienes cualquier 19 | > duda/pregunta, no dudes en contactarme por el Slack de 42 - `@facosta` 20 | 21 | ## disclaimer 22 | 23 | me gustaría redactar algunas partes con más detalle/explicar correctamente. 24 | de nuevo, no dudes es escribirme a mí o preguntar a tus compas para aprender :) 25 | 26 | --- 27 | 28 | # varios remotos 29 | 30 | A efectos prácticos, un remoto no es más que una dirección en la web a donde 31 | vas a subir tus cambios para que otras personas puedan acceder a tu trabajo. Si 32 | te cuesta visualizarlo, piensa en ello como en una nube (*Google Drive*, *Sharepoint*, *Dropbox*...) con la que te comunicas mediante comandos (`git pull`, `git checkout -b `...) en lugar de con una página web bonita con tu ratón. 33 | 34 | La dirección de un repo en 42 tiene un aspecto parecido a esto: 35 | 36 | ```sh 37 | git@vogsphere-v2.42madrid.com:vogsphere/intra-uuid-37017c37-f279-43c5-86b7-f629581e8a9b-6259240-facosta 38 | ``` 39 | 40 | Mientras que uno de github tiene esta pinta: 41 | 42 | ```sh 43 | git@github.com:sashiyalala/n-remotes-42.git 44 | ``` 45 | 46 | Observa que comparten una estructura parecida 47 | 48 | ```sh 49 | git @ una-url.com : algo / otra-cosa 50 | ``` 51 | 52 | Puedes investigar lo que es cada cosa, pero vamos, vamos a configurar git para 53 | poder referirnos a repos de 42 y de GitHub de forma "sencilla" y evitando 54 | confusiones entre ambos. 55 | 56 | ## crea una clave SSH para GitHub 57 | 58 | Si recuerdas, en la piscina tuviste que configurar una **clave SSH** para 59 | poder siquiera usar git. Es decir, mediante el algoritmo SHA, generar una 60 | clave *pública* y otra *privada* que se guardan en archivos de tu 61 | ordenador en 42 y pegar la pública en alguna parte de la intra para que el git 62 | de 42 sepa que eres tú y darte permisos para subir cambios a tus propios 63 | repositorios. Por ejemplo, tu cuenta de banco es pública porque la compartes 64 | para enviarte dinero con otras personas pero el código de 3 números 65 | en la parte de atrás de tu tarjeta (privada) solo lo conoces tú para autorizar 66 | operaciones. 67 | 68 | Estos archivos por defecto se suelen guardar en las rutas: 69 | 70 | * `~/.ssh/id_rsa.pub` (la pública) 71 | * `~/.ssh/id_rsa` (la privada) 72 | 73 | Puede ser que al crearla les eligieras otro nombre. 74 | No pasa nada, solo apúntate el nombre correcto de los archivos, lo vamos a 75 | necesitar más adelante. 76 | 77 | Si no te acuerdas, no pasa nada, vamos a repetirlo, pero **SIN BORRAR LA CLAVE 78 | QUE YA TIENES EN 42**. 79 | 80 | Vas a seguir este tutorial: https://docs.github.com/es/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?platform=linux 81 | prestando atención a estos detalles: 82 | 83 | * Le vas a indicar tu correo **asociado a tu cuenta de GitHub** en este paso 84 | ```sh 85 | ssh-keygen -t ed25519 -C "your_email@example.com" 86 | ``` 87 | * En el paso en el que te pregunta por el archivo donde guardar la clave, 88 | asegúrate de que la ruta da un nombre de archivo diferente al de 42 que ya 89 | tienes. 90 | ```sh 91 | Enter a file in which to save the key (/home/YOU/.ssh/id_ALGORITHM):[Press enter] 92 | ``` 93 | Por ejemplo, `/home/.../.ssh/id_edXXXX` 94 | 95 | También apúntate este nombre, lo vamos a necesitar también. 96 | 97 | * recuerda que el *passphrase* es como una contraseña. Si confías en 42 hehe 98 | no hace falta que des ninguna, así más adelante no te preguntará por ella cuando 99 | uses el usuario de github... 100 | 101 | Sigue el tutorial y asegúrate! de que añades tu clave al `ssh-agent`: 102 | https://docs.github.com/es/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent?platform=linux#adding-your-ssh-key-to-the-ssh-agent 103 | 104 | Después de añadirlo al *agent*, sigue este tutorial para añadir tu clave a tu cuenta de GitHub siguiendo 105 | este tutorial: https://docs.github.com/es/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account 106 | 107 | y ya estaría! 108 | 109 | ## Añade configuración para tus remotos 110 | 111 | Como muchas otras cosas en UNIX, la configuración de cosas suele poder 112 | alterarse/customizarse con archivos en tu carpeta de usuario (i.e., `~`). 113 | 114 | Como vamos a querer usar claves para un usuario de git de 42 y otro de GitHub 115 | a la vez, vamos a escribir una configuración para evitarle confusiones al 116 | ordenador (y errores a nosotros) 117 | 118 | Esto se hace en el archivo `~/.ssh/config`. Si no existe, créalo y/o edítalo 119 | como prefieras: por terminal con *nano*, *vim*, con apps como *VSCode*... 120 | 121 | Y vas a añadirle esto: 122 | 123 | ```sh 124 | Host github.com 125 | HostName github.com 126 | User git 127 | IdentityFile ~/.ssh/ 128 | Host git.42 129 | HostName vogsphere-v2.42madrid.com 130 | User git 131 | IdentityFile ~/.ssh/ 132 | ``` 133 | 134 | En mi caso, lo tengo parecido a esto: 135 | 136 | ```sh 137 | Host github.com 138 | HostName github.com 139 | User git 140 | IdentityFile ~/.ssh/id_edXXXX 141 | Host git.42 142 | HostName vogsphere-v2.42madrid.com 143 | User git 144 | IdentityFile ~/.ssh/id_rsa 145 | ``` 146 | 147 | Se puede explicar con más detalle y te invito a investigar qué significa todo 148 | esto, pero básicamente le estamos diciendo al comando de UNIX `git`: 149 | 150 | > *oye, cuando me comunique con repos en github.com, tienes que usar la clave* 151 | > *de mi usuario que está en la ruta `~/.ssh/id_edXXXX`.* 152 | > *sin embargo, cuando el repo sea de `vogsphere-v2.42madrid.com`, tienes que* 153 | > *usar la clave que está en la ruta `~/.ssh/id_rsa`. Por cierto, la dirección de* 154 | > *`vogsphere-v2.42madrid.com` me parece muy larga, así que la abreviaré a* 155 | > *`git.42`* 156 | 157 | A fin de cuentas, el comando `git` no es omnisapiente, así que le tenemos que 158 | ayudar a no liarse entre varios repos y claves. 159 | 160 | Por si acaso, cierra y vuelve a abrir tu terminal antes de continuar para 161 | asegurar que la configuración cobra efecto. 162 | 163 | # flujo de trabajo con varios remotos 164 | 165 | algo importante antes de crear ningún repositorio en GitHub 166 | ## usar mismo nombre de rama principal 167 | 168 | hace unos años, en github decidieron que la rama por defecto se llamaría `main` 169 | en vez de `master`. 170 | 171 | sin embargo, en 42 la rama principal se sigue llamando `master` por defecto. 172 | yo prefiero y creo que es muy importante que lo primero que hagas es configurar 173 | tu GitHub para que la rama por defecto se llame siempre `master` porque osino 174 | creo que va a ser caótico cuando hagas `git push`. 175 | 176 | Para ello, sigue esta guía: https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-user-account-settings/managing-the-default-branch-name-for-your-repositories 177 | y elige el nombre "master". 178 | Ahora, todos tus repos nuevos en GitHub deberían usar el nombre `master` para la 179 | rama principal. 180 | 181 | ## guía de flujo de trabajo normal 182 | 183 | > otra vez, se puede detallar/explicar más en detalle por qué hago estas cosas 184 | > y/o lo que significa, pero voy a dejar unos apuntes a modo de cheatsheet para 185 | > que puedas trabajar cómodamente en tu repo de 42 186 | 187 | ### clonar repo de 42 188 | En tu máquina de 42, abre la terminal y elige dónde quieras clonar tu repo de un proyecto. 189 | Clónalo, pero cambiando `vogsphere-v2.42madrid.com` por `git.42`: 190 | 191 | ```sh 192 | git clone git@git.42:vogsphere/intra-uuid-37017c37-f279-43c5-86b7-f629581e8a9b-6259240-facosta mi_proyecto 193 | ``` 194 | 195 | ### revisa que solo tienes el remoto de 42 aún 196 | 197 | vete dentro de la carpeta y ejecuta el comando `git remote -v`, que te enseña todos los remotos disponibles que tienes, e.g.: 198 | 199 | ```sh 200 | ➜ mi_proyecto git:(master) git remote -v 201 | origin git@git.42:vogsphere/intra-uuid-37017c37-f279-43c5-86b7-f629581e8a9b-6259240-facosta (fetch) 202 | origin git@git.42:vogsphere/intra-uuid-37017c37-f279-43c5-86b7-f629581e8a9b-6259240-facosta (push) 203 | ``` 204 | 205 | Observa que sale la URL que le hemos pasado a git cuando hemos hecho el `clone`! 206 | ¿Pero sale en 2 elementos diferentes? 207 | Con `(fetch)` y `(push)` al final. 208 | Esto es normal. 209 | 210 | > te recomiendo que te revises la diferencia que hay entre las acciones `push` (subir tus cambios al remoto/a la "nube") vs `fetch` (actualizarte en tu máquina para ver si hay nuevos cambios disponibles en la nube, e.g. subidos por un compañero a otra rama) y ya de paso tbn vs. `pull` (traer a tu máquina los cambios que hay en la "nube"/el remoto) 211 | 212 | **OBSERVA** que al principio del resultado, sale la palabra `origin`. 213 | Igual que `master` o `main` es como se suele llamar a la rama principal por defecto, al remoto por defecto se le llama `origin`. 214 | 215 | A efectos prácticos es un apodo de tu "remoto" para no tener que escribir la URL del repo entero cada vez. 216 | 217 | y también, como suele haber solo un remoto, se omite. 218 | Por ejemplo `git push` es realmente `git push origin` donde `origin` está *implícito*. 219 | Significa: 220 | 221 | >*oye, los commits que aún no estén en el remoto, a.k.a `origin`, súbemelos al remoto, para que mi compañero o yo desde otra máquina, pueda verlos :)* 222 | 223 | > cuidado porque no siempre es lo mismo poner o no poner origin 224 | 225 | 226 | ### crea tu repositorio en GitHub 227 | 228 | vete a GitHub y con tu cuenta créate un repositorio. 229 | recuerda que puedes elegir hacerlo "privado" por si prefieres que sólo tú tengas acceso a ello, especialmente mientras trabajas en el proyecto. 230 | pero si lo pones en público, luego lo puedes usar de portfolio ;) (siempre se puede cambiar más adelante) 231 | 232 | eso sí, no clones este repo en tu máquina de 42. 233 | 234 | simplemente ponte a trabajar en el repo y recuerda ir haciendo commits de vez en cuando (al menos 1 al día recomiendo) para que haya un registro de lo que has estado trabajando. 235 | 236 | existen guías sobre cómo hacer commits, cómo escribir los mensajes...pero yo al menos creo que es prioritario usar git todo lo que puedas para que te acostumbres a usarlo, cojas experiencia, etc. 237 | 238 | de hecho, observa que en realidad no hace falta toda la configuración de 42 para ponerte a hacer tu repo de GitHub y trabajar en él. 239 | sólo acuérdate de configurar el nombre de la rama por defecto a `master` para evitar problemas más adelante 240 | 241 | ### añade el remoto de GitHub a tu repo de 42 242 | 243 | en tu máquina de 42, en cuanto tengas cosas de "casa" que quieras subir, vas a hacer esto: 244 | 245 | navega hasta tu carpeta del proyecto de 42 y copia la dirección para clonar tu repo de GitHub, e.g. `git@github.com:sashiyalala/n-remotes-42.git` 246 | 247 | pero no clones nada! 248 | 249 | vas a decirle a git que añada otro remoto con este comando 250 | 251 | ```sh 252 | ➜ mi_proyecto git:(master) git remote add git@github.com:sashiyalala/n-remotes-42.git 253 | ``` 254 | 255 | donde en `` vas a poner algo diferente a `origin` (para no liaros al ordenador ni a ti), pero *corto*, para que no sea costoso de escribir 256 | 257 | yo por ejemplo lo suelo llamar `shorigin` (por la "sh" de mi nombre, no tiene ninguna historia...) 258 | 259 | ### revisar remotos después de añadir el de GitHub 260 | 261 | si volvemos a preguntarle a `git` por los remotos disponibles, ahora deberían salir 4 resultados! 2 por la URL de 42 con nombre `origin` y 2 por la de GitHub, con el nombre que recién eligimos, e.g. `shorigin` 262 | ```sh 263 | ➜ mi_proyecto git:(master) git remote -v 264 | origin git@git.42:vogsphere/intra-uuid-37017c37-f279-43c5-86b7-f629581e8a9b-6259240-facosta (fetch) 265 | origin git@git.42:vogsphere/intra-uuid-37017c37-f279-43c5-86b7-f629581e8a9b-6259240-facosta (push) 266 | shorigin git@github.com:sashiyalala/n-remotes-42.git (fetch) 267 | shorigin git@github.com:sashiyalala/n-remotes-42.git (push) 268 | ``` 269 | 270 | Ahora, es muy importante que cada vez que hagas `git push/fetch/pull`, le indiques el remoto! 271 | 272 | > creo que en teoría si no lo indicas, asumirá que te refieres a origin, pero por si acaso prefiero ponerlo cada vez... 273 | 274 | ### subir tus cambios de GitHub a 42 por primera vez en el proyecto 275 | 276 | En el repo de 42 obviamente no va a haber nada (revisa con `git log` por ejemplo). 277 | En cuanto tengas cosas que subir de GitHub, vas a tener que seguir estos pasos: 278 | 279 | 1. Dile a git que mire en GitHub para ver los commits disponibles 280 | ```sh 281 | git fetch shorigin 282 | ``` 283 | 284 | 2. Tráete/actualiza tu máquina de 42 para que se traiga los commits de GitHub 285 | ```sh 286 | git pull shorigin master 287 | ``` 288 | 289 | 3. Actualiza el repo de 42/sube a 42 los commits que tienes ahora en tu local (por el paso 2.) para que cualquier persona que se clone tu repo de 42 tbn los vea: 290 | ```sh 291 | git push origin master 292 | ``` 293 | 294 | Si quieres, para revisar, vete a otra carpeta de tu terminal de 42 y clona el repo de 42 otra vez para ver que está todo subido :) 295 | 296 | 297 | ### y seguir 298 | 299 | Observa que en 300 | 301 | * máquina de 42 hay 2 remotos 302 | * tu ordenador de casa/laptop/etc. solo uno 303 | 304 | es decir, en tu ordenador externo, vas a seguir trabajando normal con un único remoto 305 | > IMPORTANTE: no hemos tocado nada de la config de tu ordenador externo, así que ahí solo hay un remoto y se llama `origin`, porque es el único que hay por defecto. Sin embargo desde tu máquina de 42 vas a referirte a GitHub como `shorigin` o como hayas elegido. 306 | 307 | 308 | Ahora, mientras trabajes en el repo del ordena de 42, vas a tener que hacer `git push` 2 veces: 309 | 310 | ```sh 311 | git push origin 312 | git push shorigin 313 | ``` 314 | 315 | y si tienes cambios en un remoto, vas a tener que hacer pull de ese remoto y luego push al otro para sincronizarlos. 316 | 317 | esto puede ser muy lioso(si aún no te parecía suficiente...heh) y es normal. yo llevo 6 años usando git profesionalmente y hasta mi piscina hace medio año no me atreví a montar todo esto. 318 | 319 | pero todo es ponerse, y si lo haces, que sea cuando tengas tiempo y no vayas con prisas. 320 | 321 | a fin de cuentas, lo del USB tbn sirve, aunque sea "menos elegante". es más importante subir tus proyectos que no subir nada por liarte con git. 322 | 323 | 324 | # bonus 325 | si quieres que quede todo aún más bonito en los logs: 326 | 327 | cuando hacemos un commit, git te suele pedir que hayas configurado el "*name*" y el "*email*". 328 | hasta donde yo sé es solo estético para que se vea quién ha hecho qué commit en los logs 329 | 330 | esto se configura en el archivo `~/.gitconfig`. 331 | 332 | es un archivo que puedes editar tbn a mano y tiene que tener esta pinta: 333 | 334 | ```sh 335 | ➜ ~ cat ~/.gitconfig 336 | [user] 337 | name = sasha (home) 338 | email = facosta@student.42madrid.com 339 | ``` 340 | 341 | este es mi archivo de `.gitconfig` en mi ordenador externo. 342 | Observa que en "name" he puesto "`sasha (home)`". 343 | 344 | Sin embargo, en la máquina de 42, tengo puesto esto: 345 | ```sh 346 | ➜ ~ cat ~/.gitconfig 347 | [user] 348 | name = sasha (42) 349 | email = facosta@student.42madrid.com 350 | ``` 351 | 352 | y así consigo que en el git log no solo aparezca mi nombre, sino tbn una ayuda de dónde he hecho cada commit :) 353 | por ejemplo, este es el aspecto de mis logs en el repo de GitHub de `libft` desde mi ordenador externo: 354 | 355 | ![alt text](image.png) 356 | 357 | > (info) esto es una captura de la extensión "Git Graph", gratuita en VSCode 358 | 359 | Y en la columna "*Date*" aparece cada momento en el que he hecho cada commit. 360 | 361 | Tengo que añadir una captura de lo que se ve desde mi máquina de 42, pero si lo hiciera, verías que el log, tendría los mismos commits con las mismas fechas y horas, que es justo lo que comentaba al principio que es útil para que pueda el staff ver que has estado trabajando en tu proyecto a pesar de no haberlo hecho en una máquina de 42. 362 | 363 | 364 | muchas gracias por leer hasta aquí y suerte!!!! 365 | --------------------------------------------------------------------------------