Mostra la pàginaRevisions anteriorsQuè hi enllaçaExporta a PDFTorna dalt Aquesta pàgina és només de lectura. Podeu veure'n el codi font, però no podeu canviar-la. Consulteu el vostre administrador si penseu que això és degut a algun error. = git (git-book) {{tag>devops cursos git}} ~~NOTOC~~ == info * [[https://git-scm.com/book/es/v2]] * puntero: [[https://git-scm.com/book/es/v2/Fundamentos-de-Git-Trabajar-con-Remotos]] * [[https://www.codecademy.com/learn/learn-git]] == metodología de trabajo en Git === áreas <image shape="thumbnail">{{ :development:git:pasted:20180606-133803.png }}</image> * Working directory: nuestro directorio de trabajo, que puede ser cualquiera de los diferentes **commits** que hemos ido realizando a lo largo del tiempo, aunque se suele trabajar con el **<HEAD>** * Staging area: es el índice de ficheros de los que se guardará una "copia" o "snapshot" en el próximo commit * Repository: es la carpeta donde residen los metadatos y los diferentes "snapshots" que tenemos de nuestro proyecto === estados en ficheros <image shape="thumbnail">{{ :development:git:pasted:20180607-140218.png }}</image> estados de un fichero: * sin seguimiento (//untracked//) * sin modificar (//unmodified//) * modificado (//modified//) * preparado (//staged//) --> //cached// como sinónimo == comandos === básicos * empezar repositorio local:<code bash>git init</code> * añadir ficheros/directorios a //stage area//(si modificamos el fichero después de haberlo añadido al //stage//, la versión que se guardará con el **commit** será la primera modificación. La segunda modificación quedará pendiente de ser añadida (add) y envíada (commit):<code bash>git add .</code> * añadir todos los ficheros: <code bash>git add -A</code> * consultar estado:<code bash>git status</code><code bash>git status -s // abreviado</code> * crear un commit (envío/paquete/snapshot):<code bash>git commit -m "Mensaje descriptivo"</code> * hacer un commit de los ficheros preparados-modificados sin tener que añadirlos explicitamente:<code bash>git commit -a -m "Mensaje descriptivo"</code> * forzar cambio de usuario en un commit en concreto: <code bash>git -c “user.name=matebcn” commit</code> * setup sincronización entre repositorio local con repositorio en la nube:<code bash>git remote add origin <dirección repositorio Git></code> * enviar commit a repositorio nube (**-u** setea el upstream de esta rama para futuros usos):<code bash>git push -u origin master</code> * clonar repositorio nube existente en local (se establece ORIGIN de manera automática):<code bash>git clone <dirección repositorio git></code> == con más detalle puede ser confuso saber que estás comparando dependiendo del estado del fichero (sin seguimiento - sin modificar - modificado - preparado) * mostrar los cambios con más detalle (en working tree): <code bash>git diff</code> * (en //stage area//): <code bash>git diff --staged</code> === con archivos * mover archivo dentro del working tree: <code bash>git mv <archivo> <nuevo_nombre_archivo></code> * -> es equivalente a eliminar y dar de alta, git detecta que es el mismo fichero en diferente ubicación:<code bash>mv <path>/<archivo> <pah2>/<archivo> git rm <path>/<archivo> git add <path2>/<archivo></code> * eliminar fichero: <code bash>rm <archivo> git rm <archivo></code> * eliminar del indice (pero no del //working tree//)?: <code bash>git rm --cached <archivo></code> === .gitignore para hacer que ciertos archivos (o patrones de archivos) no se registren, se puede crear un fichero ''.gitignore''<code txt .gitignore># ignora los archivos terminados en .a *.a # pero no lib.a, aun cuando había ignorado los archivos terminados en .a en la linea anterior !lib.a # ignora unicamente el archivo TODO de la raiz, no subdir/TODO /TODO # ignora todos los archivos del directorio build/ build/ # ignora doc/notes.txt, pero este no doc/server/arch.txt doc/*.txt # ignora todos los archivos .txt el directorio doc/ doc/**/*.txt </code> se puede crear un fichero para ignorar a nivel global (por la tesitura del equipo y los programas usados):<code bash>git config --global core.excludesFile ~/.gitignore</code> se puede ubicar en cualquier sitio, en este caso lo situan en el $HOME del usuario <callout type="info" title="+ info" icon="true">https://www.atlassian.com/git/tutorials/saving-changes/gitignore</callout> === restaurar ==== stage * ''git reset'' : elimina **stage** y lo pasa a **working** * ''git reset <file>'' <callout type="danger">''git reset --hard'': elimina todas las modificaciones del **stage** y **working** (menos untracked)</callout> ==== working area <callout type="danger">''git checkout -- %%<file%%>'': Elimina los cambios en el fichero del **working copy** </callout> <callout type="danger">''git checkout %%<folder%%>'': Elimina los cambios en el directorio del **working copy** </callout> <callout type="danger">''git checkout .'': Elimina los cambios en **TODO** el **working copy**</callout> ==== fichero untracked <callout type="danger">''git clean -f'': Elimina los ficheros **untracked**</callout> <callout type="danger">''git clean -fd'': Elimina los ficheros **untracked** de raiz y directorios</callout> <callout type="danger">''git clean -id'': clean interactivo</callout> === con remotos * listado de repositorios remotos:<code bash>git remote #por defecto se le asigna ORIGIN al servidor clonado</code> * ''-v'' ofrece información de la URL * añadir reposotorio remoto:<code bash>git remote add <nombre> <URL></code> * descargar los últimos cambios del repositorio:<code bash>git fetch <nombre></code> ==== traer y combinar remotos * al clonar un repositorio, se añade automáticamente con el nombre ORIGIN -> * ''git pull'': trae una rama remota y la combina con la actual * ''git clone'': trae la rama remota maestra ==== enviar a tus remotos * ''git push <nombre-remoto> <nombre-rama>'': enviar información a repositorio remoto * no será aceptado si alguien ha subido antes que tu y no lo tienes actualizado * ''git remote show <nombre-remoto>'' ==== eliminar y renombrar remotos * ''git remote rename <nombre-original> <nuevo-nombre>'': cambia el nombre de referencia de un remoto * esto también cambia el nombre de las ramas remotas * ''git remote rm <remoto>'': eliminar un remoto === Tags * etiquetas ligeras: alias a los commit, en lugar de su código * etiquetas anotadas: crean un nuevo //snapshot// guardando toda una serie de información: * nombre * correo electrónico * fecha * gpg checksum * ''git tag'': mostrar las etiquetas * ''-l <patrón>'' : patrón de filtrado * ''git tag -a vX.x'' : aplica el tag al HEAD ? * ''-a'' : etiqueta anotada * ''-m'': mensaje de la etiqueta (obligatorio en etiquetas anotadas) * ''git show <tag>'' : información adicional de las etiquetas anotadas * ''git tag vX.x-lw'': etiqueta ligera (no usar ni ''-a'', ''-s'', ''-m'') * si se hace ''git show <tag>'' no se mostrará información adicional * ''git tag -a vX.x <checksum>'': etiquetar a posteriori un commit, indicando los primeros caracteres * ''git push origin <etiqueta>'': las etiquetas no se envían a los servidores remotos, hay que especificarlo explicitamente * ''git push origin --tags'': envía varias etiquetas a la vez * ''git checkout -b <rama> <tag>'' : crear una rama a partir de un tag <callout type="primary" icon="true"> https://git-scm.com/book/es/v2/Fundamentos-de-Git-Alias-de-Git </callout> === reescribiendo la historia (rebase) * [[https://git-scm.com/book/es/v1/Las-herramientas-de-Git-Reescribiendo-la-historia]] * [[https://git-scm.com/book/es/v2/Ramificaciones-en-Git-Reorganizar-el-Trabajo-Realizado]] === viajes en el tiempo * deshace el ADD de un fichero - deja de estar preparado para commit -: <code bash>git reset HEAD <fichero></code> * deja el fichero como en el último commit - restaura el último, pierdes los cambios hechos- : <code bash>git checkout -- <fichero></code> * recuperar un snapshot determinado (el proyecto vuelve a ese momento en el tiempo): <code bash>git checkout <codigo_commit></code> * recuperar el último snapshot: <code bash>git checkout master</code> * permite agragar/fusionar el último commit (o modificar el mensaje que lo acompaña) en el caso que nos hayamos olvidado (o precipitado) a la hora de hacer un commit<code bash> $ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend # solo se mostraría un commit</code> === RESET <callout type="warning" icon="true">atención a estos comandos, podrías perderlo todo</callout> * no toca la working area: <code bash>git reset --soft</code> * borra staging area pero no working area: <code bash>git reset --mixed</code> * <label type="danger">CUIDADO!</label> lo borra todo: <code bash>git reset --hard</code> === log * consultar últimos cambios:<code bash>git log</code> * <code bash>git log --oneline</code> * otros parámetros: * ''-p'' : muestra diferencias entre los commits * ''-<n>'' : muestra los n últimos commits * ''--stat'' : estadísticas (archivos modificados, líneas modificadas, etc) * ''--shortstat'' * ''name-only'' * ''name-status'' * ''relative-date'' * ''--pretty=format:"<consulta_tabla>"'' * [[https://git-scm.com/book/es/v2/Fundamentos-de-Git-Ver-el-Historial-de-Confirmaciones#rpretty_format|tabla configuración formato]] * ''--short'' * ''--full'' * ''--fuller'' * ''--abbrev-commit'' : muestra primeros caracteres del sha (en vez de los 40) * parametros limitar salida: * ''--since:''/''--after'' : acepta fechas concretas (2018-06-18) o relativas (2 years, months, days, hours) * ''--until:''/'''' * ''-S<cadena>'' : busca en los cambios la cadena (buscar una función/clase/atributo/comentario) === alias * <code bash>git config --global alias.cm ‘-c “user.name=matebcn” commit’</code> /via: [[https://git-scm.com/book/en/v2/Git-Basics-Git-Aliases]] +info: [[https://github.com/GitAlias/gitalias]] == configuración * prioridad de los ficheros de configuración (más alta, más prioridad): - system: /etc/gitconfig - global: ~/.gitconfig - local: .git/config * establecer globalmente el usuario de trabajo: <code bash>git config [--global] user.name “mate”</code> * establecer globalmente el e-mail de trabajo:<code bash>git config [--global] user.email miemail@midominio.algo</code> * muestra la información almacenada y la ubicación del fichero: <code bash>git config --show-origin --get-all user.name</code> * comprobando la configuración: <code bash>git config --list</code> == PTE {{tag> pendiente wiki}} <callout type="info" icon="true">pendiente de colocar de una manera más legible</callout> <code> push repositorios remotos repositorio centralizado al hacer un clone se establece como remoto git remote add origin <direccion o directorio> → origin se suele usar en github para el repositorio git push origin master → enviamos a origin la master actualizando repositorios remotos git branch -all → muestra todas las ramas, incluidas las remotas git pull origin master → descarga los cambios de origin a master git pull --rebase → preserva tus cambios y que no sean machacados por el PULL </code> <code> ramas linea de desarrollo de commit uno detrás de otro ramas: trabajar en características diferentes git branch “caracteristica” → crea rama git branch → muestra las ramas git checkout “caracteristica” → moverte a la rama git checkout -g “caracteristica” → crea la rama y nos movemos a ella git branck -d “caracteristica” → elimina rama fusión de ramas: git log --oneline --decorate git checkout master git merge “caracteristica” bloqueo pesimista -> bloqueas el archivo bloqueo optimista -> se supone que hay trabajo repartido, no debería haber conflicto. si no se toca la misma línea, GIT puede llegar a resolver. si no, intervención manual </code> == eclipse + bitbucket * instalar nuevo software (repositorio) : ''http://download.eclipse.org/egit/updates'' * Seleccionar **Git Integration for Eclipse** y **Java implementation of Git** * para acceder, cambiar perspectiva a Git * también se puede importar un proyecto desde un repositorio GIT (desde Archivo - Import) * una vez configurado: * para importar a GIT, creamos un nuevo repositorio local a partir de nuestro proyecto y lo enviamos al repositorio creado /via: [[https://crunchify.com/how-to-configure-bitbucket-git-repository-in-you-eclipse/]] info/cursos/git.txt Darrera modificació: 08/08/2018 02:47per mate