= Breve Tutorial de GIT = == Operaciones básicas == === Configurar el entorno de usuario === Hay que guardar el usuario y el email que vamos a usar: * git config --global --add user.name "Mi nombre" * git config --global --add user.email "!email@uco.es" === Descargar un proyecto === Con git se descarga del repositorio central el proyecto completo y no solo una rama como con svn * git clone URI * Ejemplos: * git clone !git@webapps.uco.es:ts-uco.git === Actualizar nuestra copia === Para traer los cambios que se hayan realizado en el repositorio central * git pull === Añadir un archivo === Esta operación marca un archivo para que forme parte del proyecto, pero hasta que no se confirmen los cambios (commit) no lo hace realmente. * git add [filepattern] ... Añade directorios de forma recursiva, comodines (*.c), etc... === Renombrar un archivo === Esta operación cambia el nombre de un archivo o directorio que ya formaba parte del proyecto * git mv old_name new_name === Borrar un archivo === Esta operación borra el archivo y lo marca también como borrado para el próximo commit * git rm [archivos-o-directorios] ... === Deshacer === Lo que hace esta operación es dejar el directorio o el archivo en el mismo estado en el que estaría en la versión del repositorio en la que estamos trabajando. Útil si hemos editado un archivo y queremos dejarlo como estaba, recuperar un archivo borrado o desmarcar un archivo marcado para añadir. Sólo se puede usar '''antes''' de hacer commit. Si no se especifica ningún archivo es sobre todo el repo. * git reset --hard [archivos-o-directorios] ... === Commit === Aquí viene la primera diferencia fundamental con svn: commit confirma los cambios en nuestra copia de trabajo, pero eso no significa que los vaya a enviar al repositorio central. Solo que el cambio está confirmado de modo local y se ha hecho una transacción. * git commit -a -m "Comentario" El parámetro -a sirve para añadir todos los archivos añadidos, cambiados o borrados. Si solo se quiere confirmar unos pocos y no todos, se quita el -a y se especifican los archivos o directorios a confirmar === Subir los cambios al repo central === Se pueden subir uno o más commit locales, así que no es necesario hacerlo tras cada commit. Localmente podemos ir confirmando lo que creamos necesario y cuando el sistema esté listo, se sube. * git push == Operaciones avanzadas == === Cambiar la versión de nuestro repo === Con la orden git log podemos ver todos las revisiones que se han hecho en nuestro repo, indicando el id del commit, el autor, la fecha y la descripción. * git log Si queremos volver a un estado anterior, tenemos que usar la orden checkout: * git checkout id [el id es el numero largo que viene después de commit en el log, no hace falta ponerlo entero, se pueden poner los últimos seis o siete números] También admite otras sintaxis: * git checkout master [vuelve al último estado de nuestra rama principal] * git checkout master~3 [vuelve al commit que está alejado 3 revisiones de la rama principal, o lo que es lo mismo, deshace los 3 últimos cambios] === Trabajar con ramas === Para ver las ramas que tenemos usamos la orden branch * git branch -r El parámetro -r nos muestra las ramas que están creadas en el servidor central, tiene el formato remote/nombre. Eso no significa que podamos trabajar con ellas directamente, debemos crearnos una rama que se llame igual y que sea copia de aquella. Veamos primero como se crear una rama. * git checkout -b nueva-rama Podríamos usar git branch para crear la rama, pero checkout nos ahorra un paso. El parámetro -b crea la rama, y checkout nos cambia a esa rama como entorno de trabajo. ¡Ya no estamos en master! Todos los commit se harán en esa nueva rama. Así que checkout nos permite cambiar entre revisiones y entre ramas. Para copiar una rama remota hacemos lo siguiente: * git checkout -b nombre-rama remote/nombre-rama Y ya podemos trabajar con ella y hacer push. Si hacemos push en una rama que no existe en el repo central, la crearemos y los demás la verán como una nueva rama remota. === Unir ramas === Ya hemos terminado de hacer la operación en nuestra rama (por ejemplo newfix), el sistema es estable y queremos unirlo con la rama master. Hacemos lo siguiente. {{{ bash$ git checkout master bash$ git pull (para asegurarnos de hacer el merge sobre los últimos cambios) bash$ git merge newfix bash$ git branch -d newfix }}} Recordemos que mientras no hagamos push en ninguna de las ramas no se subirán los cambios al repo principal. === Deshacer un cambio === Para deshacer un commit, se usa la orden revert: * git revert id-commit Deshace los cambios del commit indicado, independientemente del estado de la historia en el que nos encontremos. Pueden surgir conflictos dependiendo de los cambios. Revert supone un nuevo commit de manera automática. Ejemplo, imaginemos que hemos eliminado en la revisión 4f32ab un archivo que queremos recuperar. Podemos hacerlo de estas dos maneras: * git checkout 4f32ab fichero * git revert 4f32ab -m "Comentario" La diferencia entre uno y otro es que checkout solo trae el fichero, pero no lo añade (hay que hacer add). Revert anula el commit (si hubo más cambios también los deshace) y hace un commit (por lo que no hay que añadirlo). === Crear un tag === Creamos una etiqueta que marca el estado concreto del repositorio en una revisión determinada. * git tag nombre-tag rama-o-commit Para ir cuando queramos a ese tag en concreto usamos checkout. Tag, al contrario que branch, siempre se suben y bajan del repo central (no existe el concepto de tag remoto).