Mostrando entradas con la etiqueta git. Mostrar todas las entradas
Mostrando entradas con la etiqueta git. Mostrar todas las entradas

trabajando con Git - Parte 3 - Tips

COMANDOS GIT

  • git help <command>
  • git clone <uri> namedir # clona usando como nombre de directorio namedir.
  • git add <dir> # añade recursivamente todos los archivos del dir.
  • git diff --staged #compares staged changes with last commit
  • git commit -v # muestra el diff en el editor
  • git commit -a -m ” #automatically stage tracked files. No hace falta git add
  • git rm --cached <file or regexp> #Git no realiza un seguimiento del archivo, pero los deja en el directorio de trabajo. Útil cuando se olvida añadir archivos al .gitignore y ya hemos agregado dichos archivos al repositorio.
  • git rm <file> #borrarlos con git siempre.
  • git rm -f <file> # si ya está modificado y en el index.
  • git mv <file> <renamed_file>
  • gitk # tcl/tk. Herramienta gráfica para git
  • git commit --amend #Modificar el mensaje del último commit
  • git reset HEAD <file> # to unstage
  • git checkout -- <file> # Descartar cambios en el directorio de trabajo.

AÑADIR ARCHIVOS

  • git add -i #interactive staggin
  • git add -p #crea patch

STASH

  • git stash #guarda el estado en una pila y limpia el directorio para poder cambiar de rama
  • git stash list #muestra la pila
  • git stash apply # vuelve al estado original del dir. Stash{n} especifica uno concreto Y --index reaplica los cambios stagged
  • git stash pop # elimina el primero en la pila. O drop

LOGS

  • git log -p -2 # Muestra 2 últimos commits con diff
  • git log --stat
  • git log --pretty
  • git log --pretty=format:”%h - %an, %ar : %s”
  • git log --pretty=format;”%h %s” --graph
  • git log --since=2.weeks
  • git log <branch> --not master #Muestra commit de <branch> sin incluir los de master
  • git log --abbrev-commit --pretty=oneline
  • git diff master…contrib #Muestra solo el trabajo que la rama contrib actual ha introducido desde su antecesor común con master
  • git log <branch1>..<branch2> #Commits de branch2 que no están en branch1
  • git log origin/master..master #Muestra qué commits se van a enviar al servidor
  • git log origin/master.. #Igual que el anterior. Se asume master o HEAD
  • git log refA refB --not refC # commits en refA y refB que no están en refC
  • git log master…experiment #commits de master o experiment, pero sin ser comunes. Con --left-right indica a qué rama pertenece cada uno

REMOTES # REPOS EN INTERNET

  • git remote -v # lista los repos remotos
  • git remote add [shortname] [url] # crea nuevo remote, es posible descargar el contenido de ese repo con git fetch [shortname]. Master branch en [shortcode]/master
  • git fetch <remote> # descarga trabajo nuevo a máquina local, no sobreescribe nada tuyo. ( git pull sí hace merge automaticamente si se esta realizando un seguimiento de esa branch)
  • git push [remote-name] [branch-name] # sii nadie ha hecho push antes
  • git remote show [remote-name] # inspecciona remote.
  • git remote rename <old-name> <new-name> # también renombra branches: quedaría <new-name>/master
  • git remote rm <remote-name> # p.e si el contribuidor ya no contribuye más

AÑADIR VARIOS REPOSITORIOS REMOTOS

  • git remote add bitbucket git@bitbucket.org:algui91/grado_informatica_tsi_practicas.git # Añadir un nuevo repositorio remoto con el nombre deseado. Por ejemplo si ya tenemos uno en github y queremos añadir otro para bitbucket
  • git push -u bitbucket –all # Subir el proyecto a bitbucket. A partir de ahora se puede seleccionar a qué repo publicar con git push nombre_repo_remoto

TAGGING

# marcan puntos importantes en la histtoria del repo ( releases )
  • git tag # muestra las etiquetas actuales
  • git tag -l ‘v1.4.2.*’ # acepta regex
  • Dos tipos de tag:
    • Lightweight : puntero a commit ( branch que no cambia )
    • Annotated : se almacenan como objetos en la db, con checksum, nombre del creador, email, fecha, mensaje, posibilidad de firmarla conGPG. ( recomendada )
  • git tag -a <tagname> -m ‘mensaje’ # annotated tag
  • git show <tag-name> # muestra información asociada.
  • git tag -s <tag-name> -m ‘message’ # la firma con gpg
  • git tag <tag-name> # lightweight tag
  • git tag -v <tag-name> # verifica tags firmadas
  • git tag -a <tag-name> [commit-chksum] # crea tag para commit con dicho chksum
  • Por defecto no se transfieren los tags, para subirlos al servidor:
    • git push origin [tag-name] # una sola
    • git push origin --tags # Enviar todas
  • Para usar GPG y firmar tags, hay que subir la clave pública al repositorio:
    • gpg --list-keys #Coges la id pública
    • gpg -a --export <id> | git hash-object -w --stdin #Copia el SHA-1 devuelto
    • git tag -a maintainer-gpg-pub <SHA-1>
    • git push --tags #Comparte la clave con todos los usuarios
    • git show maintainer-gpg-pub | gpg --import #Cada usuario importa la clave así
    • git show <tag> #Devuelve más información sobre la etiqueta
    • git tag -d nombre_tag # eliminar la etiqueta
    • git push origin :refs/tags/nombre_tag # Eliminar la etiqueta del repositorio remoto.

    BRANCH

    # las ramas simplememte son punteros a distintos snapshots
    • git branch <nombre-rama> #crea rama. Puntero al commit actual
    • git checkout <nombre-rama> #cambiar a la rama especificada.
    • git checkout -b <nombre-rama> #crea y cambia de rama
    • git merge <rama> # Mezcla la rama actual con <rama>
    • git branch -d <rama> #elimina la rama
    • git push origin --delete <branchName> # Elimina una rama del servidor
    • git mergetool #Herramienta gráfica para resolver conflictos
    • git branch # lista ramas
    • git branch -v # lista ramas mostrando último commit
    • git branch --merged #lista ramas que han sido mezcladas con la actual. Si no tienen un *, pueden borrarse, ya que significa que se han incorporado los cambios en la rama actual.
    • git branch --no-merged #lista ramas que no han sido incorporadas a la actual.

    REMOTE BRANCHES

    • git fetch origin # Descarga el contenido del servidor
    • git push <remote> <branch> #Las ramas no se suben por defecto, has de subirlas explícitamente
    • git push <remote> <branch>:<nuevoNombre> #Igual que la de arriba, pero en el servidor se llama a la rama con nuevoNombre en lugar de branch
    • # Cuando se hace un git fetch que trae consigo nuevas ramas remotas, no se disponen de ellas localmente, solo se dispone de un puntero a la rama remota que no es editable. Para poder trabajar sobre esa rama, es necesario crearla Por ejemplo:
      • git fetch origin # Tras ejecutarlo, notamos que se ha creado una rama nueva (rama_nueva)
      • git checkout -b rama_nueva origin/rama_nueva # Crea una rama local a partir de la remota
      • git merge origin/nueva_rama # Equivalente a la de arriba, pero sin establecer el tracking a la rama
    • git push [remotename] :[branch] # elimina una rama remota
    • git push [remotename] [localbranch]:[remotebranch] #La rama en el servidor tiene distinto nombre a la local

    TRACKING BRANCHES

    • git checkout --track origin/rama #Equivalente a -b rama_nueva origin/rama_nueva
    • git chekout -b <nuevo_nombre> origin/<rama> # Establece un nombre distinto para la rama local

    REBASE

    # Rebase y merge se diferencian en que merge mezcla dos puntos finales de dos snapshots y rebase aplica cada uno de los cambios a la rama en la que se hace el rebase. No lo uses en repos publicos con mas colaboradores, porque todos los demas tendrán que hacer re-merges
    • git checkout <una rama>
    • git rebase master # aplica todos los cambios de <una rama> a master
    • git merge master #hay que hacer un merge de tipo fast forward
    • # Tenemos 3 ramas, master, client y server, en server y client tenemos varios commit y queremos mezclar client en master pero dejar server intacta:
      • git rebase --onto master server client # adivina los patches del antecesor común de las ramas server y client y aplica los cambios a master.
      • git checkout master
      • git merge client # fast-forward. Client y master en el mismo snapshot
      • # Si se quiere aplicar también los cambios de server, basta con:
      • git rebase master server
      • git checkout master
      • git merge server
    • git rebase [basebranch] [topicbranch] # sintaxis de rebase
    • git rebase -i # Rebase interactivo

    SERVIDOR

    • git instawew # Muestra una interfaz web con los commits

    GENERAR UN NÚMERO DE COMPILACIÓN (BUILD NUMBER)

    • git describe master #Solo funciona para tags creadas con -s ó -a

    PREPARAR UNA RELEASE

    • git archive master -- prefix=”project/’ | gzip > `git describe master`.tar.gz
    • git archive master -- prefix=”project/’ --format=zip | `git describe master`.zip
    • test/ export-ignore #Al crear el tarball no incluye el directorio test/

    GENERAR UN CHANGELOG

    • git shortlog --no-merges master --not <tag> #Recopila todos los commits desde <tag> y los agrupa por autor

    RECOMENDACIONES

    • Siempre hay que hacer pull antes de push en caso de que alguien haya subido cambios al servidor. Ejemplo:
      • User1 clona el repo y hace cambios, realiza un commit
      • User2 clona el repo, hace cambios, hace commit y sube los cambios con push
      • User1 intenta hacer push, pero será rechazado con: ! [rejected] master -> master (non-fast forward). No puede subir los cambios hasta que no mezcle el trabajo que ha subido User2. Así que debe hacer lo siguiente:
        • git fetch origin
        • git merge origin/master
        • git push origin master
      • Mientras User1 hacía estas operaciones, User2 ha creado una rama issue54 y realizado 3 commits, sin haber descargado los cambios de User1. Para sincronizar el trabajo, User2 debe hacer:
        • git fetch origin
        • git log --no-merges origin/master ^issue54 #Observa qué cambios ha hecho User1
        • git checkout master
        • git merge issue54 && git merge origin/master
        • git push origin master
    • git diff --check #Antes de hacer commit, ejecutar esto para ver si hemos añadido demasiados espacios que puedan causar problemas a los demás.
    • Commits pequeños que se centren en resolver un problema, no commits con grandes cambios.
    • git add --patch #En caso de hacer varios cambios en el mismo archivo
    • El mensaje del commit debe tener la estructura siguiente: Una linea de no más de 50 caracteres, seguida de otra línea en blanco seguida de una descripción completa del commit.

    PASOS A SEGUIR PARA CONTRIBUIR A PROYECYOS AJENOS, MEDIANTE FORK

    • git clone <url>
    • git checkout -b featureA
    • git commit
    • git remote add myFork <url>
    • git push myFork featureA
    • git request-pull origin/master myFork #enviar la salida por mail al propietario del proyecto, o hacer click en pull request.
    • Buena practica tener siempre una rama master que apunte a origin/master, para estar siempre actualizado con los ultimos cambios en el proyecto original.
    • #Separar cada trabajo realizado en topic branch, que trackeen a origin/master
      • git checkout -b featureB origin/master
      • (Hacer cambios)
      • git commit
      • git push myFork featureB
      • (Contactar con el propietario del proyecto)
      • git fetch origin
    • #Otro ejemplo, el propietario del proyecto quiere aceptar un pull tuyo, pero quiere que hagas algunos cambios, aprovechas la oportunidad y mueves tu trabajo para basarlo en el contenido actual de la rama origin/master, aplastas los cambios en featureB, resuelves conflictos, y haces push:
      • git checkout -b featureBv2 origin/master
      • git merge --no-commit --squash featureB
      • (cambiar la implementacion)
      • git commit
      • git push myFork featureBv2
      • #--squash coge todo el trabajo de la rama mezclada y la aplasta en un no-merge commit encima de la rama en la que estas. --no-commit no registra el commit automaticamente. Así puedes realizar todos los cambios necesarios y luego hacer el commit

    REFLOG

    En segundo plano, git crea un log de a donde han estado referenciando HEAD y el resto de ramas en los últimos meses.
    • git reflog
    • git show HEAD@{n} #Muestra información sobre el reflog número n
    • git log -g master #Muestra el log formateado como la salida de reflog
    • git show master@{yesterday} #Muestra los commits de ayer.

    UTILIDADES

    • git show <short-SHA-1> #Es posible ver un commit pasando la versión abreviada del SHA-1
    • git rev-parse <branch> #A qué SHA-1 apunta una rama
    • git show HEAD^ # Muestra commit padre
    • git show HEAD^2 #Muestra segundo padre
    • git show HEAD~2 # El primer padre del primer padre
    • git filter-branch --tree-filter ‘rm -f <file>’ HEAD #elimina el archivo de todos los commits

    DEPURACIÓN

    • File anotation
      • git blame -L 12,22 <archivo> # muestra cuando y por quién se modificaron de la linea 12 a la 22
      • git blame -C -L 141,153 <file> # cuando renombras un archivo o lo refactorizas en varios, muestra de donde vino originalmente.
    • Búsqueda Binaria: Cuando hay un bug que no puedes localizar, usas bisect para dererminar en qué commit empezó a producirse el bug.
      • git bisect start
      • git bisect bad # marcas el commit actual como roto
      • git bisect good [commit bueno] # último commit conocido que funcionaba
      • Ahora irá preguntando hasta que encuentres el commit culpable. Si esta bien indicas git bisect good. De lo contrario git bisect bad. Al terminar hay que resetear.
      • git bisect reset

    SUBMODULOS

    • git submodule add <url> # crea un directorio que contiene el comtenido de otro proyecto.
    • Clonar un repo con submodulos
    • git clone url
    • git submodule init
    • git submodule update

    CONFIGURATION

    • git config --global <opcion> <valor> #global para usuario, system todos y sin nada, especifico para el repo.
    • git config {key} # muestra el valor de key
    • git config --global core.editor <editor> #cambia el editor por defecto
    • git config --global commit.template $HOME/.gitmessage.txt #plantilla para commits
    • git config --global core.pager ‘more|less’ #paginador por defecto, puedes usar cualquiera
    • git config --global user.signingkey <gpg-key-id> # clave gpg para firmar tags
    • git config --global core.excludesfile <file> #como gitignore
    • git config --global help.autocorrect 1 # autocorrige cuando se escribe un comando incorrecto. Solo en git >= 1.6.1
    • git config --global color.ui true # colorea la salida de git. Valores: true|false|always
    • git config --global core.autocrlf input #para que usuarios linux no tengan problemas con los retornos de carro de windows
    • git config --global core.autocrlf true #para usuarios de windows
    • git config --global core.whitespace trailing-space, space-before-tab, indent-with-non-tab, cr-at-eol # respectivamente: busca espacios al final de línea, busca espacios al inicio de tabulación, busca líneas con 8 o más espacios en lugar de tabulaciones, acepta retornos de carro
    • git apply --whitespace=warn <patch> # advierte de errores de espacios antes de aplicar el patch. Con --whitespace=fix intenta arreglarlos

    GIT ATTRIBUTES

    Archivo en .gitattributes en el directorio de trabajo o en .git/info/attributes para no committearlo
    Identificando archivos binarios
    Muchos archivos son para uso local y no aportan información al repositorio. Para decirle a git qué archivos son binarios hacer añadir al archivo atributes:
    <nombre archivo o regexp> -crlf -diff # git no intentará corregir problemas de crlf ni mostrará los cambios con diff. En versiones >= 1.6 se pueden sustituir estos dos valores por la macro binary
    Diffing binary files
    En ocasiones es útil mostrar diffs de archivos binarios, como una archivo de word:
    *.doc diff=word
    #tras esto hay que definir el filtro word para que git convierta archivos word a texto:
    git config diff.word.textconv strings
    Es posible hacer lo mismo para imágenes jpeg, es necesario instalar exiftool para extraer los metadatos y luego hacer:
    echo ‘*.jpeg diff=exif’ >> .gitattributes
    git config diff.exif.textconv exiftool
    Procesar archivos antes de hacer commit y antes de hacer checkout: Es posible crear tus propios filtros para hacer sustitución. Estos filtros se llaman smudge y clean. Los puedes configurar para distintos directorios y luego escribir un script que procesará cada archivo antes de que sea checkeado (smudge) y commiteado (clean). Para ello,escribe en el .gitattributes: (En caso que quieras procesar código C)
    *.c filter=indent Luego:
    git config --global filter.indent.clean indent
    git config --global filter.indent.smudge cat
    Otro ejemplo interesante es la expansión de la palabra clave $Date$. Para ello hay que escribir un script en ruby que recibe un archivo, encuentra la fecha de su último commit e inserta dicha fecha en el archivo:
    #! /usr/bin/env ruby
    data = STDIN.read
    last_date = `git log &#45;&#45;pretty=format:"%ad" &#45;1`
    puts data.gsub('$Date$', '$Date: ' + last_date.to_s + '$')
    Puedes nombrar este script como expand_date. Crea un filtro en git, llamado dater y dile que use el script anterior:
    git config filter.dater.smudge expand_date
    git config filter.dater.clean ‘perl -pe “s/\\\$Date[^\\\$]*\\\$/\\\$Date\\\$/”‘
    Para usar el filtro, simplemente escribe la palabra clave en los archivos que desees:
    echo ‘# $Date$’ > date_test.txt
    echo ‘date*.txt filter=dater’ >> .gitattributes
    git add date_test.txt .gitattributes
    git commit -m “Testing date expansion in Git”
    rm date_test.txt
    git checkout date_test.txt
    cat date_test.txt
    $Date: Tue Apr 21 07:26:52 2009 -0700$

    GIT HOOKS

    Hay dos tipos, de lado cliente y servidor, se guardan en el directorio .git/hooks. Para activarlos basta con que sean ejecutables.

    CONCEPTOS

    Fast forward: cuando se hace un merge y el commit de la rama a mezclar esta justo un commit adelantado, simplemente se hace apuntar la rama en la que se iba a mezclar al commit del merge.

    GITIGNORE:

    # a comment - this is ignored
    *.a # no .a files
    !lib.a # but do track lib.a, even though you’re ignoring .a files above
    /TODO # only ignore the root TODO file, not subdir/TODO
    build/ # ignore all files in the build/ directory
    doc/*.txt # ignore doc/notes.txt, but not doc/server/arch.txt

trabajando con Git - parte 1 (init, status,add,commit,log,reset)

Te recomiendo darle una mirada a estos dos post anteriores :

Instalando Git (Mac, Windows o Linux)

Qué es GIT y cuales son sun diferencias entre Git y Github


Ya lo hiciste?, entonces sigamos












Repository = lugar en la nube donde guardamos todos nuestros cambios.
Stagin area = lugar momentaneo, donde estan todos los archivos listos para pasar al repositorio. Llegan aqui despues de ejercutar add y salen al repositorio al hacer  commit
Workin area = el lugar donde trabajamos con nuestra IDE ej: Sublime Text, Netbean, Eclipse, etc.
git help


muestra los principales comandos que git usa.



para saber mas de un comando :


ejemplo : git help push , nos da mas detalle de cada comando.


*** para salir, precionar la tecla “q” de quit.







git init


le decimos a GIT que empiece a guardar y rastrear cambios  (genera un archivo .git)




git status


que archivos estan por subir, en local y repositorio.



git add -A


permite agregar todos los archivos modificados




si le hacemos status para ver los cambios

git commit -m “MI MENSAJE”


es el momento donde guardamos los archivos en el repositorio





git log


nos cuenta como está el repositorio a nivel de commit, quien lo hizo, cuando y con que comentario.


Hasta aqui ya hemos guardado en el repositorio nuestros avances.


MAS TIPS


si modificamos un archivo y queremos subirlo:


primero vemos los cambios con un git status


nos dice que solo se modificó index.html, entonces le hacemos git add -A, o pasamos el nombre del archivo :

simplemente concluimos con un  git commit -m “agregue cajas de texto”

CONCEPTOS PARA IR AL PASADO

guardar todos los commits en un archivo de texto :


git  log > commits.txt


esto genera una carpeta en la raiz del proyecto con todos los commits hechos para el proyecto.




1: copiar el id del commit al que queremos viajar


git checkout CODIGO_DEL_COMMIT




PARA VOLVER AL ULTIMO COMMIT GUARDADO


podemos digitar


git checkout master


conclución
el checkout nos permite volver en el tiempo, siempre y cuando no hagamos commit, solo vamos a volver en forma de observadores, (si hacemos commit es como crear un proyecto en paralelo desde el punto a donde regresamos, a esto se le llama hacer un branch )


git reset


es la unica sentencia que te retorna al inicia del proyecto, pero eliminando todos los commit, es decir, te puede arruinar el avance del proyecto.


existen tres tipos :


git reset --soft


Con esta sentencia solo elimina los cambios hechos en el repositorio, pero no los que están en nuestro working area (es decir nuestra PC)


ej: yo quiero hacer un reset -volver- al commit penultimo (quiero eliminar mi ulticom commit) entonces la sentencia es :


git reset --soft 4oo45o456o567867o8o4ofgorgo56o575o6
git log


al hacer git log veremos que se borró el ultimo cambio en el repositorio, pero en mi pc todo sigue igual


git reset --mixed
En este caso, se elimina la data del stagin area, esta sentencia casi no se usa.


git reset --hard
elimina  TODO.  lo del repositorio y tu PC. no recomendable
backup : para poder recuperar el avance, asi hayas hecho git reset --hard, se puede si has guardado los id de los commits, porque hard tambien permite ir hacia adelante. entonces basta con hacer git resert --hard 34546vgrhrtu7400004560456


mas data




Que es GIT, diferencias entre GIT y GitHub

Antes de comenzar, me gustaría aclarar una diferencia de conceptos.
GIT y GitHub son totalmente diferentes.

( Instala git en tu pc Mac, Windows o Linux con este tutorial )


GIT es el software que rastrea. El sistema de control de versiones. La herramienta que utilizaremos en la terminal.


GitHub es la plataforma de "hosting" de los proyectos. Una comunidad llena de personas que desarrollan y comparten, usando GIT.


Se complementan, pero son personajes independientes.




¿Qué es GIT?


Es un software rastreador. Le da seguimiento a todos los cambios que se ejecutan sobre un archivo o carpeta. Cada cambio que hagas en un directorio, GIT se da cuenta y lo registra. Así de simple.

Imaginemos un archivo que se modifica constantemente:


Index.html

Hacemos un 1° cambio: Le agregamos una etiqueta <doctype>
* git está atento y lo registra *


2° cambio: Agregamos etiquetas <head> y <body>
* git lo registra nuevamente. Tenemos 2 cambios. *


3° cambio: Agregamos contenido dentro de las etiquetas.
* git siempre lo registra. Tenemos 3 cambios. *




Cada vez que haces un cambio en tu código, GIT registra los cambios y los guarda.


¿Cómo sabe en qué momento guardar los cambios? Tú le avisas.


Es como cuando haces un “Save Game” en un videojuego. Sabes que ya ocurrieron varios cambios porque avanzaste, conseguiste nuevas armas, venciste jefes y necesitas salvar. Las veces que quieras y sean necesarias.




Ahora bien, ¿que pasaría si te dijera que el juego te permitiera ver todos tus momentos salvados del juego? Podrías ubicarte en cualquier momento que gustes de la historia.


Lo mismo ocurre con tus proyectos.


Irás avanzando, generando cambios (la forma en como “salvas” tus avances) y posteriormente, podrás revisar todo tu proyecto.


A este conjunto de cambios (que a partir de este momento les llamaremos “commits”) se le conoce como repositorio.




¿Cómo es el proceso técnico? ¿Si hago 10 cambios, GIT guarda 10 veces todos mis archivos? ¿No estaría generando miles de archivos?


Este concepto y pregunta es muy normal. GIT guarda los cambios que haces, no hace copias de los archivos.


GIT no clona 10 veces tu proyecto cada vez que salvas, sino que registra cuáles fueron las líneas que modificaste, las encapsula en el registro llamado “commit” y con esto, te permite disfrutar de un historial de avances de tu proyecto.


Al final, se podría considerar que es un registro de cambios.

Características de GIT


a) Es un sistema de control de versiones distribuido.


Con esto, nos referimos a que GIT clona los proyectos para que cada persona ó miembro de un equipo tenga una copia exacta y completa de todo el código, historial y las personas que estuvieron involucradas.


El registro encapsulado de todos los cambios de estos elementos se le conoce como repositorio, mencionado anteriormente.


Si se llegase a perder el repositorio original, no habría mucho drama porque es probable que existan personas que tienen un clón. De ahí, se puede partir sin problema.




Básicamente, cada persona (o grupo de personas) mantienen y trabajan sus propios repositorios, derivados del principal, el cual, con toda la flexibilidad, se pueden fusionar y compartir avances.


Cada repositorio es independiente. Y aunque al final buscan establecer un repositorio principal para tener orden, ellos tienen sus repositorios totalmente libres para trabajarlos. Si quieren sincronizar, muy bien, si no, no hay lío.

Repositorios independientes.



Visualicemos un ejemplo de repositorios y sus clones:



Observamos el repositorio original:

Repo Original: a, b, c, d

Cada letra (a,b,c...) se refiere a un cambio del proyecto (un estilo, una línea HTML, alguna función de JS, etc.). Vemos como hay 4 cambios: a,b,c,d.


El proyecto está hospedado en GitHub y ahí es donde se centraliza la versión principal.


Debajo, vemos que hay 2 repositorios más. Leonidas y Harvey.


Leonidas y Harvey hicieron un clon cada uno en su computadora del proyecto.


Como podemos observar, todos los repositorios tienen el commit A igual. Significa que ese conjunto de cambios todo mundo lo tiene.


Después del commit A, cada uno empezó a trabajar el proyecto de diferente manera. Leonidas se fue directo al Frontend a atacar con JS. Harvey se fue al Backend a ponerle Django y en el repositorio original (en GitHub) se observa que sigue avanzando con otros cambios generados por otro equipo de personas.


¿Qué sucede?


Cada repositorio es independiente. Esto significa que no importa si no se sincronizan, ellos pueden avanzar el proyecto a su antojo y necesidades.


Claro está, la idea de esto es colaborar.


Ellos pueden sincronizarse con el repositorio original y compartir todos los cambios y diferencias que han hecho con el proyecto. Pero la idea principal es que esto abre puertas a la colaboración y a la libertad de propuesta.


Todos los clones derivados del repositorio original contienen el mismo registro de cambios, archivos e historial en el commit A. De ahí, cada uno puede seguir sincronizando su proyecto con el original ó avanzar su propio proyecto con sus respectivos cambios.


Si llegan a aparecer más repositorios clones, también pueden colaborar entre ellos sin depender del repositorio principal.


A esto nos referimos con un sistema de control de versiones "distribuido".

b) Es Open Source.


GIT es gratuito, puedes instalarlo en cualquier ordenador o servidor.

c) Puedes utilizarlo offline

Si vas en un avión, puedes seguir trabajando en tu proyecto, en local, para posteriormente cuando te conectes a Internet, puedas subirlo al repositorio principal.

CommentFB