GIT

General resources

GIT

Comandos basicos

Crear un repositorio nuevo:

# Crear carpeta e ir a ella
mkdir repositorio
cd repositorio 

# Crear y subir repositorio
git init
touch README.md
git add . # añade todo, tambien git add * o -A
git commit -m "Nombre del commit"
git push -u origin master

Clonar un repositorio: git clone /path/repo.git

Información básica:

Explicacion basica de Git

Tenemos tres zonas locales y una remota:

https://rogerdudler.github.io/git-guide

ADD & COMMIT

Para hacer commit: git commit -m "Nombre"

Para editar un commit (pero que se guarden los cambios dentro del mismo): git commit --amend -m "Fix"

REPOSITORIO REMOTO

Configurar repositorio remoto (si no está ya configurado):
git remote add origin <server>
git remote remove origin <server>

Ver repositorios remotos: git remote -v

Para enviar los cambios: git push origin <rama>
(Generalmente usaremos git push origin master)

Ramas

https://rogerdudler.github.io/git-guide

Master es la rama estable por defecto.

Modificar ramas:

git checkout -b rama1 # crear
git branch -d rama1 # eliminar rama local
git push origin --delete rama-remota # eliminar rama remota

Recuerda que al crear una rama se crea a partir del commit donde estamos ahora.

Enviar una rama al repositorio remoto: git push origin <rama>

Fusionar ramas

Se crea un nuevo commit con la fusión de las dos ramas. Para ello:

  1. Cambiamos a la rama que queremos como base git checkout master
  2. Fusionamos con la rama destino git merge rama-secundaria

Hay dos tipos de fusión:

Sincronizacion

Podemos hacerlo de dos formas:

git pull solo funciona si no hay confictos (‘auto-merge’). Sino, habrá que hacer manual-merge (ver punto anterior).

Git te crea un archivo intermedio con los cambios de los dos para que tu lo edites. Además podemos ver las diferencias entre archivos:
git diff <source-branch> <target-branch>

TIPS: Para actualizar todos los subdirectorios git de una carpeta comun, podemos ejecutar en bash: for d in ./*/ ; do (cd "$d" && git pull origin master); done.

Fork

Un fork es un clon de un repositorio. Cuando hacemos un fork (lo haremos en github):

Por tanto a la hora de hacer git fetch tenemos que tener en cuenta si hacer:

Si no tenemos acceso a la organización, podemos hacer un pull-request (dentro del repositorio forkeado, y aparece automáticamente en el proyecto base).

Tagging

Sirve sobre todo para añadir nombres de versión a los commits (ej: v1.2).

Añadir versión al ultimo commit: git tag 1.0.0

Añadir versión a un commit concreto:

git log # para ver la id del commit
git tag 1.0.0 <idcommit>

Eliminar una etiqueta: git tag -d v2

Annotated vs lightweight:

git tag -a v1.4 # lightweight
git tag -a v1.4 -m "my version 1.4" # annotated

Segun buenas prácticas:

Solo se pueden subir a github tags ANOTADAS. Se suben explicitamente con git push origin <tag>.

Tambien se pueden subir todas con git push --follow-tags. Ver aqui la discusión.

Para poner este comportamiento por defecto: git config --global push.followTags true.

NOTA: antes se subían todas con git push --tagspero se desaconseja hacerlo.

Log

Comandos avanzados del log:

Cambios (diff)

Podemos verlo de forma bonita con git diff --color-words.

Lo más util es para ver cambios en ultimo commit: git diff.

Otros usos:

Restaurar cambios

Explicación corta:


Explicación larga:

Por todo lo anterior, git reset se considera INSEGURO y se recomienda no usarlo por el riesgo de pérdida de información.

git cleanes otra forma de limpiar. No se usarla y no se si me hace falta.

Avanzado: detach HEAD state

Podemos ‘revisar’ estados antiguos con git checkout; por ejemplo podemos ver un commit antiguo (poniendo el sha del commit) o un tag antiguo (poniendo la versión). Al hacer esto, entramos en un estado de ‘detach head state’, en que HEAD no apunta a master sino a ese punto temporal que le hemos marcado.

Así podemos ver los archivos que había en ese momento, recuperarlos, etc. Cuando hayamos terminado, nada se guardará, y volvemos a nuestro estado ‘normal’ con git checkout master.

NOTA: NO guardar commits ni nada en ese estado ya que se eliminará.

Configuracion avanzadda

Comandos avanzados

Git usa vicomo editor principal (se puede cambiar a vim o nano)

Gitignore

En .gitignore añadimos archivos que no quedamos sincronizar:

Si queremos eliminar un archivo remoto al que ya hemos hecho push antes de añadirlo a .gitignore: git rm -r --cached <carpeta>

Para ver patrones de exclusión, aquí.

Git hooks

Son scripts que se pueden ejecutar cuando hacemos algo. Ej.: cuando hacemos un commit, podemos programarlo para hacerlo algo.

Para ello, entrar en .git/hooks y crear un archivo (ej: touch post-commit), y ese archivo que sea un script.

Otros

Github

Bibliografia

Github Pages

Conceptos basicos

Sirve para alojar web directamente en github.

Lo primero es crear un repo que será <nombreusuario>.github.io. Ese será el principal.

Cada repo podrá ser una carpeta a la que se accederá con *.github.io/repo. Para ello hay tres formas de habilitarlo en Settings:

Tambien podemos cambiar el tema directamente con la web de Github.

Uso de jekyll

Para crear páginas de github-pages está integrado jekyll que es un creador de páginas estáticas a partir de elementos dinámicos (MD o html, con estilos css etc). No soporta php.

Orden de preferencia de archivos: index.html > index.md > README.md

Archivos que hay que crear: about.md

Recuerda el ‘header block’ en el inicio de los archivos (md, html…)

---
Header block (al inicio)
---

Jekyll sin integrar en GH-pages

gem install jekyll bundle
jekyll new <blogname>
cd <blogname>
jekyll serve

Tambien podemos ejecutarlo para que se vean los cambios en tiempo real: bundle exec jekyll serve --livereload

Cosas que podemos cambiar en _config.yml:

Si es para usarlo con github-pages, hemos de cambiar en Gemfile la parte que pone gem jekyll por gem github-pages. Si algo no funciona: bundle update

Otras apps Github

Github classroom

https://classroom.github.com/

Sirve para hacer clase y enseñanza

Github packages

Sirve para hacer paquetes que se instalan con npm

Github projects

Sirve para crear proyectos y hacer listas de tareas dentro del repositorio.

Bibliografía