Está en la página 1de 28

COMUNIDAD DE USUARIOS DE SOFTWARE Y HARDWARE LIBRE UES

FMOCC
INTRODUCCIN A GIT
FACEBOOK:
https://www.f!"#$$%.!$&/!sh'("s$!!
GOOGLE ):
https://p'(s.*$$*'".!$&/(/+/,+-.///+,0111+--,2-03
GITHUB:
https://*4th(#.!$&/!s'("s$!!
5OR CARLOS EDUARDO C6RCAMO MENDO7A
2+,3
Queda a disposicin de toda persona interesada en expandir el conocimiento con sus iguales.
Copiar, editar y distribuir esta permitido, siempre y cuando se respete los trminos de licencia
abajo mencionados.
Quien desee contribuir a este documento, esta en la libertad de hacerlo, por lo cual este
documento sera publicado en un repositorio publico en github en el siguiente enlace:
https://github.com/csluesocc/introduccionGit , desde donde podr ser editado y posteriormente
publicado. En el momento ue desees colaborar, por !a"or has un !or# del repositorio, has las
respecti"as obser"aciones y/o ediciones al documento y agrega tu nombre a la lista de
colaboradores a continuacin:
COLABORADORES:
Esta obra est licenciada bajo la $icencia Creati"e Commons %tribucin&'oComercial&Compartir
(gual ).* (nternacional. +uede copiar, distribuir y reali,ar obras deri"adas del texto original
siempre y cuando se haga re!erencia al autor y no se persiga una !inalidad comercial.
+ara "er una copia de esta licencia, "isita http://creati"ecommons.org/licenses/by&nc&sa/).*/.
SISTEMAS DE CONTROL DE 8ERSIONES
$os sistemas de control de "ersiones son auellos ue se encargan de registrar los cambios
reali,ados sobre un archi"o o un conjunto de archi"os a lo largo del tiempo, con el objeti"o de
mantener un control sistemtico permitiendo as- en un !uturo recuperar "ersiones especi!icas
del o los archi"os modi!icados.
Es muy com.n encontrarse con la situacin donde se crea un archi"o y luego se modi!ica
perdiendo los cambios hechos antes de la ultima actuali,acin/ hay una !orma de e"itar el
problema anterior y esta es haciendo una copia local, renombrarla y hacer los cambios en el
nue"o archi"o manteniendo la integridad del archi"o original, pero, 0ue pasa si se han hecho 1
cambios bastante signi!icati"os al archi"o2 3abr-a ue crear 1 copias di!erentes 0y si trabajo en
euipo y cada persona modi!ica una parte del archi"o2, esta situacin se "uel"e complicada y
poco e!iciente, la imagen a continuacin muestra esta situacin:

04 si no solo es un simple archi"o sino un proyecto grande con di!erentes mdulos y "arias
personas trabajando sobre este2
El problema de tener este tipo de control, poco e!iciente, radica en ue puede causar serios
con!lictos debido a ue cada usuario debe entregar sus modi!icaciones a los dems y "ice"ersa y
cada uno de estos debe ordenar sus archi"os, teniendo cuidado de no sobrescribir alg.n archi"o
o directorio, y 0ue pasa si por error mi disco duro colapsa y no tu"e tiempo de entregar mis
ultimas modi!icaciones2, tengo ue "ol"er a hacer los cambios5 o si uien lle"a control del
sistema pierde la in!ormacin... ue triste situacin, cuantas copias deber crear, cuanto tiempo
in"ertir copiando, pegando, renombrando, etc.
LOS SISTEMAS DE CONTROL DE 8ERSIONES AL RESCATE
$a penosa situacin anterior lle"o a la necesidad de crear un sistema capa, de reali,ar las tareas
anteriores de !orma ordenada, concisa y sobre todo e!iciente, pudiendo centrali,ar el trabajo en
un lugar especi!ico, un ser"idor, a este tipo de sistemas se les llama s4st"&s 9" !$:t;$' 9"
<";s4$:"s !":t;'4=9$s 6como apache sub"ersin 7 con esto se tiene un lugar donde mantener
las "ersiones, pero aun existe un problema, 04 si el ser"idor colapsa2 8e pierde todo5.
9ampoco suena muy e!iciente, entonces ue necesitamos2 $a respuesta es sencilla, necesitamos
(: s4st"& 9" !$:t;$' 9" <";s4$:"s 94st;4#(49$s.
En los sistemas de control de "ersiones distribuidos 6ejemplos: Git , :ercurial , entre otros7, los
clientes no slo descargan la .ltima "ersin de los archi"os, la replican completamente en sus
computadoras. %s-, si un ser"idor colapsa, cualuiera de los repositorios de los clientes puede
copiarse en el ser"idor para restaurarlo 6es lo mismo ue tener una copia de seguridad completa
de los datos7.
%hora en d-a con ser"icios como los de github , bitbuc#et , entre otros, mantener un proyecto es
mas !cil y nos ahorramos la necesidad de tener un ser"idor dedicado para mantener el proyecto
al alcance de todos, adems los usuarios pueden acceder a los repositorios desde cualuier lugar
con una conexin a internet.
$o anterior !ue una bre"e rese;a de lo ue son los sistemas de control de "ersiones y del porue
deber-amos usarlos.
% continuacin nos centraremos en utili,ar y poner en practica uno de los sistemas de control de
"ersionas 6 8<C por sus siglas en ingles7 ms utili,ados en el mundo, hablamos de *4t , creado por
$inus 9or"alds el mismo creador el =ernel $inux y por la comunidad ue trabaja en el mismo
#ernel.
En el a;o >**1 naci git como una necesidad de los desarrolladores del #ernel $inux de tener su
propio sistema de control de "ersiones, despus de "arios a;os usando ?it=eeper 6un @<C8
propietario7 el cual dejo de ser una opcin "iable para la comunidad de desarrolladores.
Git es distribuido bajo licencia GNU G5L <2 y esta disponible para m.ltiples sistemas operati"os
entre ellos, y sin duda alguna, G'A/$inux.
+ara ms in!ormacin sobre los sistemas de control de "ersiones y sobre git:
INTRODUCCIN A GIT
El presente tutorial no pretende ser un documento extenso sobre git, ms bien es una bre"e
introduccin al mismo y sus comandos ms usados, aunue con el tiempo pueda ue este
documento cre,ca, todo depende de uienes colaboren.
+ara ms in!ormacin sobre git "isitar la documentacin o!icial en http://git&scm.com/doc.
+ara poder seguir este tutorial, lo .nico ue necesitars sera una distro G'A/$inux, una terminal
para ejecutar un par de comandos y sobre todo muchas granas de aprender.
INSTALACIN DE GIT
$a !orma ms sencilla de instalar git en nuestra pc es utili,ado el gestor de pauetes de nuestra
distro !a"orita e instalar git desde sus repositorios, git seguramente esta en los repositorios de
las distros ms conocidas por lo ue "amos a proceder de la siguiente manera:
F"9$;> C":tOS ? 9";4<9$s:
# yum install git-core
o bien:
$ sudo yum install git-core
:$t: si Bgit&coreC no existe en los repositorios utili,ar BgitC en su lugar.
D"#4: ? 9";4<9$s:
# apt-get install git
o
$ sudo apt-get install git
A;!h '4:(@ ? 9";4<9$s:
# pacman -S git
o
$ sudo pacman -S git
8i tu distro no esta entre las mencionadas, "isita la documentacin de tu distro, seguramente
encontraras los pasos necesarios para instalar git en tu sistema !a"orito.
$a opcin alternati"a a usar el gestor de pauetes es compilar el cdigo !uente nosotros mismos.
8i uieres compilar el cdigo !uente puedes buscar ac los pasos: http://git&
scm.com/boo#/en/Getting&8tarted&(nstalling&Git.
CONFIGURAR GIT 5OR 5RIMERA 8E7
$o primero ue debemos hacer luego de instalar git es con!igurar nuestro nombre y usuario con
el ue git nos identi!icar cada "e, ue trabajemos sobre nuestros proyectos.
Git permite con!igurar "arias opciones y solo es necesario hacerlo una "e,, por el momento nos
centraremos en lo bsico, como siempre, recomendamos indagar un poco en la documentacin
o!icial para ms detalles.
El comando ue usaremos para con!igurar nuestro entorno git sera: *4t !$:f4*> ue nos
permiten de!inir "ariables de con!iguracin.
Comencemos por decir a git uienes somos y cual es nuestro email, esto git y dems usuarios
sabrn uien ha hecho cambios 6commits7.
$ git config --global user.name "Mr. Floyd"
$ git config --global user.email mr.floyd@ues.edu.sv
con AA*'$#' estas diciendo a git ue use esta in!ormacin en todo lo ue hagas en el sistema.
+uedes "er tu con!iguracin actual ejecutando:
$ git config --list
user.name= Mr. Floyd
user.email=mr.floyd@ues.edu.sv
puedes adems preguntar a git por parmetros espec-!icos de!inidos en tu con!iguracin:
$ git config user.email
mr.floyd@ues.edu.sv
8i necesitas una lista completa de los comandos usados en git puedes ejecutar en tu terminal:
$ git help
o bien consultar por un comando especi!ico con git help DcomandoE:
$ git help config
o como usualmente lo hacemos en G'A/$inux usando FmanF
$ man git-config
GIT B6SICO
4a hemos con!igurado nuestro entorno git, ahora es hora de comen,ar a trabajar con el.
<amos a comen,ar creando un directorio en el lugar ue ueramos y le diremos a git ue tome
el control de todo lo ue en el hagamos:
$ mkdir practica-git && cd practica-git
$ git init
Initialized empty Git repository in ~/practica-git/.git/
*4t 4:4t crear un subdirectorio llamado .*4t donde se encuentran los archi"os necesarios para
lle"ar el control de tu directorio actual.
$ ls -a
$ ls .git/
branches config description HEAD hooks info objects refs
Comencemos un comando ue usaremos mucho a lo largo de este tutorial:
$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
*4t stt(s 'os da in!ormacin sobre nuestro repositorio actual, nos dice si algo cambio, si hay
con!licto, etc. Creemos un archi"o sencillo dentro de nuestro directorio actual y "eamos ue nos
dice git status:
$ touch script.py
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# script.py
nothing added to commit but untracked files present (use "git add" to track)
'os damos cuenta ue git ha detectado ue hemos hecho cambios en nuestro directorio, en este
caso hemos agregado un archi"o nue"o y git nos pide ue usemos Bgit addC para poder lle"ar
control de este archi"o, procedamos entonces:
$ git add script.py
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: script.py
3emos incluido nuestro archi"o, pero !alta un paso aun y es con!irmar 6commit7 los cambios:
$ git commit -m script inicial
[master (root-commit) 3ccd2e0] script inicial
0 files changed
create mode 100644 script.py
$ git status
# On branch master
nothing to commit (working directory clean)
git status nos dice ue tenemos un directorio de trabajo limpio, esto uiere decir ya tenemos un
repositorio git con un archi"o en seguimiento y una con!irmacin inicial. Git adems nos dice en
ue rama estamos trabajando, en nuestro caso BmasterC ue es la creada por de!ault 6ms
adelante crearemos y usaremos ramas7.
Como hemos "isto el proceso de agregar un archi"o para ue git lle"e su control consta de dos
pasos, agregar 6add7 y con!irmar 6commit7. El comando *4t 99 B;!h4<$C puede resultar tedioso
si tenemos "arios archi"os y ueremos agregarlos todos pues tendr-amos ue agregar archi"o
por archi"o, pero git nos o!rece otro comando .til: *4t 99 . 6el punto despus del add indica a
git ue "amos a agregar al repositorio todos los archi"os dentro de nuestro directorio, luego
bastar-a con hacer un commit para con!irmar los cambios7.
Git nos permite "er los commits ue se han hecho en nuestro repositorio, para ello usaremos el
comando log as-:
$ git log
commit 3ccd2e06ed65ce95f7af3df9ca28c0dfb5af5fed
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
Date: Fri Jul 18 23:39:18 2014 -0600

script inicial
+odemos notar ue el commit tiene una serie de n.meros y letras, eso es el identi!icador .nico
6(@7 ue git asigno a nuestro commit, git utili,a el hash shaG para identi!icar cada commit como
.nico dentro de nuestro repositorio, por lo ue podemos hacer algo como:
$ git show 3ccd2e06ed65ce95f7af3df9ca28c0dfb5af5fed
commit 3ccd2e06ed65ce95f7af3df9ca28c0dfb5af5fed
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
Date: Fri Jul 18 23:39:18 2014 -0600
script inicial
diff --git a/script.py b/script.py
new file mode 100644
index 0000000..e69de29
con esto, decimos a git ue nos muestre con detalle el commit con (@
Hccd>e*IedI1ceJ1!Ka!Hd!Jca>Lc*d!b1a!1!ed, podemos usar el comando sh$w sin especi!icar
un id y git nos dar detalle del commit ms reciente.
$ git show
<amos ahora a modi!icar el script ue hemos creado y "er como reacciona git ante los cambios
ue hagamos, para el ejemplo agregaremos un par de lineas:
N$t: con !t mostramos las lineas ue hemos agregado a nuestro script.py, puedes agregar
las lineas ue desees, al !in y al cabo solo nos interesa lo ue nos muestre git.
$ cat script
#! /usr/bin/env python
print "hola mundo, somos la CSHL"
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: script.py
#
no changes added to commit (use "git add" and/or "git commit -a")
Git nos in!orma ue el archi"o ue creamos ha sido modi!icado y pide ue con!irmemos sus
modi!icaciones, nos sugiere dos comandos, Bgit addC o Bgit commit &aC, el primero ya lo hemos
utili,ado y sabemos ue consta de dos pasos, agregar 6add7 y con!irmar 6commit7, el segundo
comando ue nos sugiere puede e!ectuar los dos pasos anteriores de una sola "e,, por
con"eniencia usaremos el segundo pero agregaremos una opcin ms, as-:
$ git commit -am Hola mundo estilo CSHL
[master 79ba623] Hola mundo estilo CSHL
1 file changed, 3 insertions(+)
mode change 100644 => 100755 script.py
<eamos ahora ue in!ormacin podemos obtener sobre los .ltimos cambios hechos:
$ git status
# On branch master
nothing to commit (working directory clean)
$ git log graph
* commit 79ba623acf7741e21cc1b6ccb3435301405ec0d3
| Author: Mr. Floyd <mr.floyd@ues.edu.sv>
| Date: Sat Jul 19 00:36:48 2014 -0600
|
| Hola mundo estilo CSHL
|
* commit 3ccd2e06ed65ce95f7af3df9ca28c0dfb5af5fed
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
Date: Fri Jul 18 23:39:18 2014 -0600

script inicial
<emos como stt(s nos muestra ue no hay ms cambios en nuestro archi"os, el comando '$*
AA*;ph nos muestra una peue;a gr!ica en a modo consola de los commits ue hemos hecho.
+odemos tambin decirle a git ue ignore ciertos archi"os y estos no sern rastreados por git y
no sern parte del repositorio aunue estos estn en nuestro directorio actual, esto es necesario
muchas "eces porue a"eces los editores ue usamos para trabajar, crean archi"os temporales
en el directorio actual, archi"os como Ds!;4pt.p? ue realmente no ueremos ue sean parte de
nuestro proyecto, para eso git tiene un archi"o especial llamado .*4t4*:$;" ue debemos crearlo
y hacerle un commit en nuestra repo.
El archi"o .*4t4*:$;" es un simple archi"o con texto ue indica ue tipo archi"os ueremos ue
git ignore, creemos nuestro .gitignore:
$ touch .gitignore
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# .gitignore
nothing added to commit but untracked files present (use "git add" to track
git nos dice ue hay un nue"o archi"o, en el "amos a agregar lo siguiente:
$ cat .gitignore
# ignorar los archivos que coincidan con los siguientes patrones
~*
*.so
*.log
%greguemos el archi"o anterior a nuestro repositorio
$ git add .gitignore
$ git commit -am "ignorar archivos"
[master 8597e52] ignorar archivos
1 file changed, 6 insertions(+)
create mode 100644 .gitignore
E *4t stt(s
# On branch master
nothing to commit (working directory clean)
%hora podemos probar agregando un archi"o ue cumpla con los patrones ue se especi!icaron
en .gitignore, probemos si !unciona:
$ touch ~temp
$ git status
# On branch master
nothing to commit (working directory clean)
e!ecti"amente git ha ignorado ese archi"o, puedes agregar los patrones ue consideres
necesarios para ue git ignore los archi"os ue coincidan con lo ue has de!inido.
Ana lista extensa de ejemplos de .gitignore para di!erentes tipos de proyectos puede ser
encontrada en: https://github.com/github/gitignore . :s in!ormacin de gitignore: http://git&
scm.com/docs/gitignore.
+ara continuar con el tutorial "amos a crear un par de archi"os ms en nuestro repositorio
actual.
$ touch script2.py README
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README
# script2.py
nothing added to commit but untracked files present (use "git add" to track)
E!ecti"amente git sabe ue hemos hecho cambios en nuestro repositorio y espera a ue
agreguemos los nue"os archi"os y ue con!irmemos su seguimiento, procedamos entonces:
$ git add .
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: README
# new file: script2.py
git nos solicita ue con!irmemos cambios, tambin nos da la opcin de re"ertir la accin anterior
con ;"s"t HEAD , "eamos ue sucede entonces:
$ git reset HEAD
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# README
# script2.py
nothing added to commit but untracked files present (use "git add" to track)
3emos re"ertido la accin anterior y "ol"emos a tener dos archi"os nue"os sin agregar en
nuestro repositorio, los agregaremos de nue"o para continuar con el tutorial.
$ git add .
$ git commit -am segundo script y README
[master fc59723] segundo script y README
0 files changed
create mode 100644 README
create mode 100644 script2.py
$ git status
# On branch master
nothing to commit (working directory clean)
$ git log --pretty=short
commit fc597238a5147ea8ece42ca6817f932a366b6069
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
segundo script y README
commit 79ba623acf7741e21cc1b6ccb3435301405ec0d3
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
Hola mundo estilo CSHL
commit 3ccd2e06ed65ce95f7af3df9ca28c0dfb5af5fed
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
script inicial
El comando log tiene "arias opciones .tiles 6ms in!ormacin en la documentacin o!icial7 ue
nos dan detalle de lo ue hemos estado haciendo en nuestro repositorio, el comando anterior
muestra el detalle de manera bastante amigable y sencilla al usuario.
<amos a editar un archi"o ms para mostrar otras opciones .tiles de git:
$ cat README
Comunidad de software y hardware libre UES FMOcc
Introduccin a git
$ git diff
diff --git a/README b/README
index e69de29..d603bef 100644
--- a/README
+++ b/README
@@ -0,0 +1,3 @@
+Comunidad de software y hardware libre UES FMOcc
+
+Introduccin a git
El comando *4t 94ff compara lo ue hay actualmente en nuestro directorio con lo ue se tenia
pre"iamente con!irmado, indica los cambios hechos ue aun no han sido con!irmados.
$ git commit -am "README"
%cabamos de con!irmar los cambios en ME%@:E.
0Que sucede si nos eui"ocamos en algo al editar el archi"o o si la descripcin del commit no nos
gusta del todo y ueremos re"ertir la con!irmacin2 +ues sencillo hagamos un ;"s"t al ultimo
commit ue hemos hecho:
$ git log -1 --pretty=short
commit 592577537bf0587cc4bf80b57b74357081787690
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
README
<eamos cual !ue el .ltimo commit hecho, ahora pasemos a re"ertir el commit
$ git reset --soft HEAD^
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
$ cat README
Comunidad de software y hardware libre UES FMOcc
Introduccin a git
3emos utili,ado *4t ;"s"t AAs$ft HEADF ue re"ierte el ultimo commit reali,ado manteniendo
los cambios ue se hicieron en el archi"o o archi"os modi!icados, al usar git status "emos ue
e!ecti"amente regresamos al estado anterior del commit, ahora podemos, si lo ueremos, editar
de nue"o el archi"o y hacer un nue"o commit.
<amos a hacer commit de nue"o para continuar:
$ git commit -am "README actualizado"
[master e12b294] README actualizado
1 file changed, 3 insertions(+)
8i por casualidad ueremos eliminar permanentemente un commit o "arios, podemos usar el
comando ;"s"t con la opcin AAh;9 y el (@ del commit:
sintaxis: E *4t ;"s"t AAh;9 B!$&&4t sh,C
Es importante mencionar ue este comando es peligroso, ya ue con esto estar-amos borrando
los commit ue se han hecho posteriormente al commit ue hemos especi!icado, no habr
!orma de re"ertir los cambios 0o ui,s si2
tendramos que googlear un poco, de paso aprendemos algo nuevo y lo compartimos
ac...
8i ahora ueremos eliminar archi"os de nuestro repositorio, git o!rece otro comando .til llamado
*4t ;& muy similar al comando rm unix.
3ablemos un poco sobre lo ue hace este comando *4t ;&> este elimina el archi"o de nuestro
repositorio y pide una con!irmacin para mantener el registro, el problema con este comando es
ue elimina el archi"o del repositorio y del directorio en el ue estamos trabajando, es como
hacer rm Darchi"oE en una terminal G'A/$inux 6pero si !ormo parte del histrico de git, es
posible recuperarlo7, git es bondadoso y o!rece la opcin de eliminar el archi"o del repositorio
pero dejando el archi"o intacto en nuestro directorio. 8i hemos hecho commit a un archi"o por
accidente, podemos usar *4t ;& AA!h"9 B;!h4<$C git lo dejara tal y como estaba antes de
hacer el commit, "eamos esto con un ejemplo sencillo:
<amos a crear un archi"o y lo incluiremos BaccidentalmenteC a nuestro repositorio.
$ echo Oops! > oops
$ git rm oops
fatal: pathspec 'oops' did not match any files
$a operacin no !unciona porue el archi"o aun no es parte de nuestro repositorio.
$ git add oops
$ git commit -am commit accidental
[master 8127794] commit accidental
1 file changed, 1 insertion(+)
create mode 100644 oops
$ git log -1 --pretty=short
commit 812779449b6fb39450d1426899a39945b340fb19
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
commit accidental
3emos agregado el archi"o BaccidentalmenteC a nuestro repositorio. Como no lo uer-amos
agregar, pero si ueremos mantenerlo en nuestro directorio procedamos a uitarlo del
repositorio:
$ git rm --cached oops
rm 'oops'
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: oops
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# oops
$ ls
oops README script2.py script.py
$ git commit -am oops elimiado del repositorio
[master 22592c0] oops elimiado del repositorio
1 file changed, 1 deletion(-)
delete mode 100644 oops
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# oops
Git ha hecho bien su trabajo, ha borrado del repositorio el archi"o pero lo mantiene intacto en
nuestro directorio. %gregaremos de nue"o el archi"o y esta "e, lo borraremos con *4t ;&.
$ git add oops
$ git commit -am "commit accidental"
[master 43af71f] commit accidental
1 file changed, 1 insertion(+)
create mode 100644 oops
$ git rm oops
rm 'oops
$ ls
README script2.py script.py
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: oops
#
$ git commit -am oops borrado correctamente
[master 0f6d43a] oops borrado correctamente
1 file changed, 1 deletion(-)
delete mode 100644 oops
@etengmonos un poco y "eamos los .ltimos 1 commits ue hemos hecho:
$ git log -5 --pretty=short
commit 0f6d43a9c0687fa70ca95700aae45d75b782bb43
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
oops borrado correctamente
commit 43af71fcd7a71e468ebfa57d059f51bd5a9cacee
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
commit accidental
commit 22592c0f14990764a21437d792c07fadca50d24a
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
oops elimiado del repositorio
commit 812779449b6fb39450d1426899a39945b340fb19
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
commit accidental
commit e12b294a508bee8602943644c3e12a4c2f81583b
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
README actualizado
Cono,camos ahora otro .til comando git m", es el anlogo a m" en unix para mo"er y renombrar
archi"os y directorios. 8eg.n la documentacin o!icial: B Git no hace un seguimiento explicito del
mo"imiento de archi"os. 8i renombras un archi"o, en Git no se almacena ning.n metadato ue
indiue ue lo has renombrado...C.

quedan dudas sobre eso, si sabes algo ms no dudes en compartirlo ac...
Menombremos uno de nuestros archi"os:
$ git mv script.py holaMundo.py
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: script.py -> holaMundo.py
$ git commit -am "script.py renombrado a holaMundo.py"
[master f3e2083] script.py renombrado a holaMundo.py
1 file changed, 0 insertions(+), 0 deletions(-)
rename script.py => holaMundo.py (100%)
RAMIFICACIONES EN GIT
$a rami!icacin es uno de los mecanismos ms interesantes y usados en los sistemas de control
de "ersiones modernos, al hablar de rami!icaciones, hablamos ue hemos tomado la rama
principal de desarrollo 6master7 y a partir de ella hemos continuado trabajando sin seguir la rama
principal de desarrollo, es decir en una rama di!erente.
An ejemplo de esto podr-a ser el desarrollo del sistema operati"o uni"ersal G'A/debian, el
euipo de debian mantiene siempre tres "ersiones de su sistema, el estable, en pruebas y en
desarrollo G!t('&":t" "sts ;&s s$: wh""=?> H"ss4" ? s49I . L ;& "st#'" es donde
los pauetes han sido probados y estn listos para salir al mundo con un minino o nulos bugs, en
' ;& ": p;("#s sin embargo es donde se mantienen los pauetes ms actuali,ados pero
ue aun no ha superado la !ase de pruebas para salir al mundo e integrarse a la rama estable,
mientras ue ' ;& ": 9"s;;$''$ estn los pauetes, mdulos del sistema, etc. ue aun no
estn listos para produccin y ue estn cambiando constantemente y ue pueden terminar
agregndose o ser eliminados en cualuier momento.
+rocedamos entonces a crear nuestra primera rami!icacin, actualmente ya estamos trabajando
bajo una rama y es la rama &st"; ue por de!ecto git nos crea y ue es donde hemos estado
reali,ando los cambios, as- ue crearemos una rama nue"a, cabe mencionar ue al crear una
rama a partir de otra, la nue"a rama contiene, inicialmente, los mismos archi"os y commits ue
la rama base, hasta ue modi!iuemos o agreguemos nue"os archi"os y directorios.
$ git branch testing
$ git status
# On branch master
nothing to commit (working directory clean)
%l parecer no hemos hecho nada, pero hemos creado una rama nue"a llamada testing, para "er
ue esto es cierto ejecutemos:
$ git branch
* master
testing
El FNF dos dice en ue rama estamos actualmente, cambiemos de rama entonces con *4t
!h"!%$(t:
$ git checkout testing
Switched to branch 'testing'
$ git status
# On branch testing
nothing to commit (working directory clean)
<amos a agregar un par de lineas de cdigo a un archi"o
$ cat script2.py
#! /usr/bin/env python
for a in [1, 2]:
for b in ["a", "b"]:
print a, b
$ git status
# On branch testing
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: script2.py
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git add .
$ git commit -am "combinaciones en python"
[testing d3dbf28] combinaciones en python
1 file changed, 5 insertions(+)
mode change 100644 => 100755 script2.py
%;adamos un nue"o archi"o para luego unir las ramas testing y master en una sola:
$ touch script3.py
$ git add .
$ git commit -am "3er script"
[testing 0294943] 3er script
0 files changed
create mode 100644 script3.py
$ git status
# On branch testing
nothing to commit (working directory clean)
hagamos un simple log de los H .ltimos commits hechos en la rama testing:
$ git log -3 --pretty=short
commit 0294943eb590210846c2875a07b5a24b08360c52
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
3er script
commit d3dbf28039a7fede95eafea4c0f5378c144c34d6
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
combinaciones en python
commit f3e208303b789e5d944f11a6565f1514714f4132
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
script.py renombrado a holaMundo.py
Megresemos al la rama master y hagamos tambin un log:
$ git checkout master
Switched to branch 'master'
$ git log -3 --pretty=short
commit f3e208303b789e5d944f11a6565f1514714f4132
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
script.py renombrado a holaMundo.py
commit 0f6d43a9c0687fa70ca95700aae45d75b782bb43
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
oops borrado correctamente
commit 43af71fcd7a71e468ebfa57d059f51bd5a9cacee
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
commit accidental
en nuestra rama master no estn los .ltimos commits ue hicimos en la rama testing, tenemos
ue unir las ramas para ue los cambios en testing se apliuen a la rama master, para eso
usaremos el comando *4t &";*" as-:
$ git merge testing
Updating f3e2083..0294943
Fast-forward
script2.py | 5 +++++
1 file changed, 5 insertions(+)
mode change 100644 => 100755 script2.py
create mode 100644 script3.py
$ git status
# On branch master
nothing to commit (working directory clean)
$ ls
holaMundo.py README script2.py script3.py
$ cat script2.py
#! /usr/bin/env python
for a in [1, 2]:
for b in ["a", "b"]:
print a, b
<emos ue tenemos los archi"os actuali,ados seg.n como los ten-amos en la rama testing,
hagamos un peue;o log para "er ue ha pasado:
$ git log -4 --pretty=short
commit 0294943eb590210846c2875a07b5a24b08360c52
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
3er script
commit d3dbf28039a7fede95eafea4c0f5378c144c34d6
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
combinaciones en python
commit f3e208303b789e5d944f11a6565f1514714f4132
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
script.py renombrado a holaMundo.py
commit 0f6d43a9c0687fa70ca95700aae45d75b782bb43
Author: Mr. Floyd <mr.floyd@ues.edu.sv>
oops borrado correctamente
9enemos todo actuali,ado.
U: p; 9" $#s";<!4$:"s: si editamos/agregamos/borramos algo en un a rama y no hacemos
los respecti"os adds, commits y nos cambiamos a otra rama distinta, esta accin pueda ue nos
genere problemas en la rama a la ue nos mo"imos pues esos cambios tambin estarn en esta
ultima a pesar ue no hayamos trabajado en ella. +or lo anterior se recomienda hacer los
respecti"os commit en la rama actual 6dejando limpio el repositorio7 antes de mo"erse a otra
rama distinta.
Si crees que falta algo que aclarar o aadir en esta parte, por favor aydanos a
improvisarla..
Como ya hemos unidos nuestros cambios de la rama t"st4:* en la rama &st";> hagamos de
cuenta ue ya no necesitamos la rama testing y ueremos borrarla. +ara borrar una rama
usamos *4t #;:!h con la opcin A9 como en el siguiente ejemplo:
$ git branch -d testing
Deleted branch testing (was 060ac2d).
$ git branch
* master
% groso modo esto es la base de las rami!icaciones en git, puedes "isitar la documentacin o!icial
para ms in!o y algunas buenas practicas, tambin este enlace puede ser .til
http://n"ie.com/posts/a&success!ul&git&branching&model/ en el encontraras un par de consejos
para crear un modelo de ramas exitoso para tu trabajo en git en euipo o bien proyectos
personales.
Si crees conveniente y deseas ampliar esta seccin no dudes en hacerlo, toda ayuda es
bienvenida :)
RE5OSITORIOS REMOTOS
Como se menciono al principio de este tutorial, existen "arios sitios en internet ue o!recen
ser"icios de alojamiento de cdigo y ue permiten utili,ar git para lle"ar control de nuestros
proyectos, en este apartado usaremos uno de los sitios ms !amosos en el mundo para alojar
cdigo, hablamos de github.com , github nos o!rece alojamiento gratuito de cdigo entre muchas
otras interesantes opciones, tambin o!rece ser"icio pri"ado para empresas o indi"iduales ue
uieran mantener sus repositorios en pri"ado, nosotros, como debe ser, tenemos una cuenta en
github donde publicamos cdigo open source ue puede ser clonado, pueden hacer un !or#
contribuir directamente, etc.
<eamos como luce entonces la inter!a, de github 6inter!a, para organi,aciones en nuestro caso7:
'ota: para continuar con este tutorial debers crear una cuenta en github 6es gratis5557 con la ue
crearemos un repositorio publico y trabajaremos con el.
CREANDO UN RE5OSITORIO EN GITHUB
<amos a comen,ar por crear un repositorio en github con el cual trabajaremos a lo largo de este
tutorial, a continuacin te mostramos los pasos necesarios:
En el men. superior derecho luego de tu nombre de usuario encontraras una serie de opciones
como muestra la imagen siguiente:
@amos clic# a la opcin crear nue"o repositorio y nos aparece una pantalla similar a la siguiente:
+rocedamos entonces a crear nuestro primer repositorio en github, llenamos el !ormulario con
los datos ue ueramos y damos clic# al botn Bcreate repositoryC, nos mostrara una pantalla
con una serie de opciones para el manejo de nuestros repositorios, es buena idea na"egar un
poco esta inter!a, y "er ue opciones nos o!rece github.
$a imagen anterior nos muestra la in!ormacin de nuestro recin creado repositorio, pongamos
atencin al rea marcada con a,ul FC399+8 clone AM$C, esa rea nos da el "inculo directo a
nuestro repositorio con el cual podemos clonarlo a nuestra pc y poder entonces trabajar sobre el
en"iando cambios 6push7 y obteniendo las actuali,aciones ms recientes del repositorio 6pull7.
Comencemos entonces con la practica, copiemos el "inculo Bclone urlC y abramos una terminal y
ejecutemos el comando !'$:":
$ git clone https://github.com/carloscarcamo/practica-git.git
Cloning into 'practica-git'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
$ cd practica-git
$ ls
LICENSE README.md
3emos clonado exitosamente nuestro repositorio a nuestra computadora, luego entramos al
directorio y listamos los archi"os ue tenemos dentro, e!ecti"amente podemos obser"ar ue
tenemos dos archi"os $(CE'8E y ME%@:E ue son los ue se a;adieron al momento de crear
nuestro repositorio en github.
+odemos "er a ue url apunta nuestro repositorio remoto usando *4t ;"&$t" A<, as-:
$ git remote -v
originhttps://github.com/carloscarcamo/practica-git.git (fetch)
originhttps://github.com/carloscarcamo/practica-git.git (push)
Git nos in!orma de la url a la ue nuestro repositorio har los respecti"os push y !etch.
%hora estamos listos para agregar y modi!icar nue"os archi"os dentro de este repositorio y
en"iar los cambios a github, procedamos entonces agregando un par de archi"os y directorios:
$ mkdir css js
$ touch index.html
3emos a;adido dos directorios y un archi"o nue"os, "eamos ue ha detectado git dentro de
nuestro repositorio:
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# index.html
nothing added to commit but untracked files present (use "git add" to track)
% pesar de ue hemos agregado dos directorios nue"os, git no detecta esos cambios, eso es
debido a ue git no lle"a control de los directorios sino de archi"os, al momento en ue
agreguemos un archi"o en cualuiera de esos directorios podremos "er ue git nos in!ormar de
ello, creemos un archi"o entonces dentro de uno de esos directorios:
$ touch js/app.js
$ git status
# On branch master
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# index.html
# js/
nothing added to commit but untracked files present (use "git add" to track)
9odo bien, ahora agreguemos los archi"os y hagamos un commit:
$ git add .
$ git commit -am Inicio de proyecto
[master 19118ae] inicio de proyecto
0 files changed
create mode 100644 index.html
create mode 100644 js/app.js
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
<eamos ahora la salida del comando git status, BYour branch is ahead of 'origin/master' by 1
commit. C nos indica ue tenemos cambios en nuestro repositorio local ue no han sido
en"iados al repositorio remoto. +odemos comprobar si tenemos di!erencias entre nuestra repo
local y la repo remota haciendo un di!! as-:
$ git diff origin/master master
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..e69de29
diff --git a/js/app.js b/js/app.js
new file mode 100644
index 0000000..e69de29
En"iemos nuestros cambios a github:
$ git push origin master
Username for 'https://github.com':
Password for 'https://carloscarcamo@github.com':
To https://github.com/carloscarcamo/practica-git.git
7369319..19118ae master -> master
$ git status
# On branch master
nothing to commit (working directory clean)
Git nos pide nuestro usuario y contrase;a para poder en"iar los cambios, luego podemos "er ue
git status nos muestra ue tenemos nuestro repositorio local y remoto actuali,ados. +odemos
"er tambin en github ue los cambios han sido e!ectuados correctamente:
3emos hecho nuestro primer commit a un repositorio remoto, ahora ue pasa si el repositorio
ha cambiado como puedo obtener los cambios mas recientes2, eso es !cil, simplemente
hacemos un p('' a repositorio de origen. +ara este ejemplo "amos a editar los archi"os en
internet desde github. las imgenes a continuacin muestran el proceso de edicin de un archi"o
desde github:
3acemos clic# al boton BeditC el cual nos mostrara una pantalla donde podemos editar nuestros
archi"os.
Github nos o!rece una inter!a, muy sencilla para editar y hacer commit en linea. El resultado
!inal lo podemos "er en la siguiente imagen:
3aremos lo mismo para editar el script en Bjs/app.jsC, el resultado sera:
+odemos "er en github los commit ue hemos hecho hasta ahora:
+ara saber si necesitamos hacer un pull al repositorio remoto, "amos a ejecutar el comando:
$ git remote update
Fetching origin
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (7/7), done.
From https://github.com/carloscarcamo/practica-git
19118ae..2a6236c master -> origin/master
$ git status
# On branch master
# Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)
Con *4t ;"&$t" (p9t" actuali,amos todas las re!erencias de los objetos, ramas y dems ue
tengamos de nuestro repositorio remoto en nuestro repositorio local, luego ejecutamos *4t
stt(s y este nos dice ue nuestra rama actual esta desactuali,ada respeto a la rama remota.
<amos a sol"entar esto haciendo un p('' de la siguiente manera:
$ git pull origin
From https://github.com/carloscarcamo/practica-git
* branch master -> FETCH_HEAD
Updating 19118ae..2a6236c
Fast-forward
index.html | 14 ++++++++++++++
js/app.js | 26 ++++++++++++++++++++++++++
2 files changed, 40 insertions(+)
$ git status
# On branch master
nothing to commit (working directory clean)
3emos actuali,ado nuestro repositorio local con los cambios hechos en github, utili,amos *4t
p('' B;"&$t"C en donde especi!icamos la rama remota,.
Ejecuta los comandos siguientes y "eri!ica su salida, "eras ue en e!ecto tienes los archi"os
actuali,ados.
$ cat index.html
$ cat js/app.js
El proceso de trabajo con repositorios remotos es siempre similar al ue hemos hecho en este
tutorial usando github, 0y esto es todo2 +ues no, este tutorial es solamente una peue;a
introduccin, ahora ueda a criterio del lector indagar ms en la documentacin, practicar, y
trabajar con git en sus !uturos proyectos.
Si deseas extender este tutorial, no dudes en hacerlo, solo asegrate de compartirlo
con los dems.
BIBLIOGRAFJA
Oon $oeliger P :attheQ :cCullough, <ersion control Qith git. 6>nd Ed.7, RFrrelly.
REFERENCIAS WEB
Git documentacin o!icial, http://git&scm.com/doc
Github help, https://help.github.com/articles/set&up&git
% success!ul Git branching model, http://n"ie.com/posts/a&success!ul&git&branching&
model/.
% collection o! use!ul .gitignore templates, https://github.com/github/gitignore.

También podría gustarte