= 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
git init
* 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):git add .
* añadir todos los ficheros: git add -A
* consultar estado:git status
git status -s // abreviado
* crear un commit (envío/paquete/snapshot):git commit -m "Mensaje descriptivo"
* hacer un commit de los ficheros preparados-modificados sin tener que añadirlos explicitamente:git commit -a -m "Mensaje descriptivo"
* forzar cambio de usuario en un commit en concreto: git -c “user.name=matebcn” commit
* setup sincronización entre repositorio local con repositorio en la nube:git remote add origin
* enviar commit a repositorio nube (**-u** setea el upstream de esta rama para futuros usos):git push -u origin master
* clonar repositorio nube existente en local (se establece ORIGIN de manera automática):git clone
== 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): git diff
* (en //stage area//): git diff --staged
=== con archivos
* mover archivo dentro del working tree: git mv
* -> es equivalente a eliminar y dar de alta, git detecta que es el mismo fichero en diferente ubicación:mv / /
git rm /
git add /
* eliminar fichero: rm
git rm
* eliminar del indice (pero no del //working tree//)?: git rm --cached
=== .gitignore
para hacer que ciertos archivos (o patrones de archivos) no se registren, se puede crear un fichero ''.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
se puede crear un fichero para ignorar a nivel global (por la tesitura del equipo y los programas usados):git config --global core.excludesFile ~/.gitignore
se puede ubicar en cualquier sitio, en este caso lo situan en el $HOME del usuario
git remote
#por defecto se le asigna ORIGIN al servidor clonado
* ''-v'' ofrece información de la URL
* añadir reposotorio remoto:git remote add
* descargar los últimos cambios del repositorio:git fetch
==== 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 git reset HEAD
* deja el fichero como en el último commit - restaura el último, pierdes los cambios hechos- : git checkout --
* recuperar un snapshot determinado (el proyecto vuelve a ese momento en el tiempo): git checkout
* recuperar el último snapshot: git checkout master
* 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
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
# solo se mostraría un commit
=== RESET
git reset --soft
* borra staging area pero no working area: git reset --mixed
* lo borra todo: git reset --hard
=== log
* consultar últimos cambios:git log
* git log --oneline
* otros parámetros:
* ''-p'' : muestra diferencias entre los commits
* ''-git config --global alias.cm ‘-c “user.name=matebcn” commit’
/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: git config [--global] user.name “mate”
* establecer globalmente el e-mail de trabajo:git config [--global] user.email miemail@midominio.algo
* muestra la información almacenada y la ubicación del fichero: git config --show-origin --get-all user.name
* comprobando la configuración: git config --list
== PTE
{{tag> pendiente wiki}}
push repositorios remotos
repositorio centralizado
al hacer un clone se establece como remoto
git remote add origin → 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
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
== 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/]]