Slide 1

Slide 1 text

Control de Versiones Distribuido con GIT

Slide 2

Slide 2 text

Control de Versiones Distribuido con GIT Noviembre 2009 Sergio Gil GUL-UC3M

Slide 3

Slide 3 text

Control de Versiones Distribuido con GIT

Slide 4

Slide 4 text

Por qué control de versiones

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

UNDO

Slide 7

Slide 7 text

“Quien no conoce la Historia está condenado a repetirla”

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

Quién

Slide 11

Slide 11 text

Quién cambió

Slide 12

Slide 12 text

Quién cambió qué

Slide 13

Slide 13 text

Quién cambió cuándo

Slide 14

Slide 14 text

Quién cambió por qué

Slide 15

Slide 15 text

Quién por qué añadió

Slide 16

Slide 16 text

Quién por qué eliminó

Slide 17

Slide 17 text

Quién por qué movió

Slide 18

Slide 18 text

Identificar releases

Slide 19

Slide 19 text

Identificar releases Depurar código

Slide 20

Slide 20 text

Identificar releases Depurar código Colaborar

Slide 21

Slide 21 text

Algunos conceptos básicos

Slide 22

Slide 22 text

Algunos conceptos básicos •Repositorio

Slide 23

Slide 23 text

Algunos conceptos básicos •Repositorio •Copia de trabajo

Slide 24

Slide 24 text

Algunos conceptos básicos •Repositorio •Copia de trabajo •Commit

Slide 25

Slide 25 text

Control de Versiones Distribuido con GIT

Slide 26

Slide 26 text

Por qué GIT

Slide 27

Slide 27 text

¿Por qué no?

Slide 28

Slide 28 text

Branches

Slide 29

Slide 29 text

Todo es local

Slide 30

Slide 30 text

¡GIT es muy rápido!

Slide 31

Slide 31 text

Distribuido

Slide 32

Slide 32 text

Workflow-agnostic

Slide 33

Slide 33 text

Workflow-agnostic

Slide 34

Slide 34 text

Workflow-agnostic

Slide 35

Slide 35 text

Workflow-agnostic

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

GIT día a día

Slide 41

Slide 41 text

Instalación

Slide 42

Slide 42 text

Instalación $ sudo apt-get install git [git-svn]

Slide 43

Slide 43 text

Instalación $ sudo apt-get install git [git-svn] $ sudo port install git [+svn]

Slide 44

Slide 44 text

Configuración

Slide 45

Slide 45 text

Configuración $ git config --global user.name "Fulano Mengánez" $ git config --global user.email [email protected]

Slide 46

Slide 46 text

Configuración $ git config --global user.name "Fulano Mengánez" $ git config --global user.email [email protected] $ git config --global color.branch auto $ git config --global color.diff auto $ git config --global color.interactive auto $ git config --global color.status auto

Slide 47

Slide 47 text

Crear un repositorio

Slide 48

Slide 48 text

Crear un repositorio $ mkdir wadus

Slide 49

Slide 49 text

Crear un repositorio $ mkdir wadus $ cd wadus/

Slide 50

Slide 50 text

Crear un repositorio $ mkdir wadus $ cd wadus/ $ git init

Slide 51

Slide 51 text

Crear un repositorio $ mkdir wadus $ cd wadus/ $ git init Initialized empty Git repository in /Users/sergio/Code/wadus/.git/

Slide 52

Slide 52 text

El repositorio se almacena junto a la copia de trabajo (en .git/)

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

Añadir archivos

Slide 55

Slide 55 text

Añadir archivos $ git add .

Slide 56

Slide 56 text

Añadir archivos $ git add . $ git add wadus.rb

Slide 57

Slide 57 text

Añadir archivos $ git add . $ git add wadus.rb $ git add *.rb

Slide 58

Slide 58 text

Comitear

Slide 59

Slide 59 text

Comitear $ git commit -m "Initial commit"

Slide 60

Slide 60 text

Comitear $ git commit -m "Initial commit" [master (root-commit) 66ff7bd] Initial commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 wadus.rb

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

Ver diferencias

Slide 63

Slide 63 text

Ver diferencias $ git diff

Slide 64

Slide 64 text

Ver diferencias $ git diff diff --git a/wadus.rb b/wadus.rb index 94b29af..2a5c7b6 100644 --- a/wadus.rb +++ b/wadus.rb @@ -1 +1,2 @@ puts "this is wadus.rb" +puts "yeah, welcome to wadus.rb"

Slide 65

Slide 65 text

Comitear otra vez

Slide 66

Slide 66 text

Comitear otra vez $ git status

Slide 67

Slide 67 text

Comitear otra vez $ git status # On branch master # Changed but not updated: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working dire # # modified: wadus.rb # no changes added to commit (use "git add" and/or "git commit -a")

Slide 68

Slide 68 text

Comitear otra vez

Slide 69

Slide 69 text

Comitear otra vez $ git add wadus.rb

Slide 70

Slide 70 text

Comitear otra vez $ git add wadus.rb $ git commit -m "Added one more message"

Slide 71

Slide 71 text

Comitear otra vez $ git add wadus.rb $ git commit -m "Added one more message" [master 77517a3] Added one more message 1 files changed, 1 insertions(+), 0 deletions(-)

Slide 72

Slide 72 text

Es necesario añadir los cambios que queremos comitear aunque el archivo ya estuviera bajo control de versiones

Slide 73

Slide 73 text

Es necesario añadir los cambios que queremos comitear aunque el archivo ya estuviera bajo control de versiones O usar -a

Slide 74

Slide 74 text

Comitear otra vez

Slide 75

Slide 75 text

Comitear otra vez $ git commit -a -m "Added one more message"

Slide 76

Slide 76 text

Comitear otra vez $ git commit -a -m "Added one more message" [master d1326c7] Added one more message 1 files changed, 1 insertions(+), 0 deletions(-)

Slide 77

Slide 77 text

Etiquetar una revisión

Slide 78

Slide 78 text

Etiquetar una revisión $ git tag 1.0 -m "Tagged version 1.0"

Slide 79

Slide 79 text

Renombrar/mover archivos

Slide 80

Slide 80 text

Renombrar/mover archivos $ mkdir src

Slide 81

Slide 81 text

Renombrar/mover archivos $ mkdir src $ git mv wadus.rb src/

Slide 82

Slide 82 text

Renombrar/mover archivos $ mkdir src $ git mv wadus.rb src/ $ git commit -m "Moved code into src"

Slide 83

Slide 83 text

Renombrar/mover archivos $ mkdir src $ git mv wadus.rb src/ $ git commit -m "Moved code into src" [master d49c8e0] Moved code into src 1 files changed, 0 insertions(+), 0 deletions(-) rename wadus.rb => src/wadus.rb (100%)

Slide 84

Slide 84 text

Eliminar archivos

Slide 85

Slide 85 text

Eliminar archivos $ git rm

Slide 86

Slide 86 text

Eliminar archivos $ git rm $ git commit -m ""

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

Conocer el pasado

Slide 89

Slide 89 text

Consultar el log

Slide 90

Slide 90 text

$ git log Consultar el log

Slide 91

Slide 91 text

$ git log commit d1326c7c4d4130730f2e37783790926dec7115dc Author: Sergio Gil Date: Tue Nov 3 01:09:35 2009 +0100 Added one more message commit 84eaf2150285685e33e32e2595e1fd1beae59327 Author: Sergio Gil Date: Tue Nov 3 00:59:18 2009 +0100 Initial commit Consultar el log

Slide 92

Slide 92 text

git log

Slide 93

Slide 93 text

git log •multitud de opciones de formato

Slide 94

Slide 94 text

git log •multitud de opciones de formato •multitud de formas de especificar rangos de revisiones

Slide 95

Slide 95 text

git log •multitud de opciones de formato •multitud de formas de especificar rangos de revisiones •mola aprender algunas porque valen también para git diff

Slide 96

Slide 96 text

Especificar rangos de revisiones

Slide 97

Slide 97 text

Especificar rangos de revisiones $ git log 1.0

Slide 98

Slide 98 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7

Slide 99

Slide 99 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21

Slide 100

Slide 100 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21 $ git log d1326c7..HEAD

Slide 101

Slide 101 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21 $ git log d1326c7..HEAD $ git log --since="2 days"

Slide 102

Slide 102 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21 $ git log d1326c7..HEAD $ git log --since="2 days" $ git log HEAD~

Slide 103

Slide 103 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21 $ git log d1326c7..HEAD $ git log --since="2 days" $ git log HEAD~ $ git log HEAD^2

Slide 104

Slide 104 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21 $ git log d1326c7..HEAD $ git log --since="2 days" $ git log HEAD~ $ git log HEAD^2 $ git diff 1.0~..1.0

Slide 105

Slide 105 text

Especificar rangos de revisiones $ git log 1.0 $ git log d1326c7 $ git log d1326c7..84eaf21 $ git log d1326c7..HEAD $ git log --since="2 days" $ git log HEAD~ $ git log HEAD^2 $ git diff 1.0~..1.0 $ git diff HEAD@{24 hours ago}

Slide 106

Slide 106 text

Volver a una revisión

Slide 107

Slide 107 text

Volver a una revisión $ git checkout 1.0

Slide 108

Slide 108 text

Volver a una revisión $ git checkout 1.0 Note: moving to '1.0' which isn't a local branch If you want to create a new branch from this checkout, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b HEAD is now at d1326c7... Added one more message

Slide 109

Slide 109 text

Blame!!

Slide 110

Slide 110 text

Buscar culpables =;-)

Slide 111

Slide 111 text

$ git blame src/wadus.rb Buscar culpables =;-)

Slide 112

Slide 112 text

$ git blame src/wadus.rb ^84eaf21 wadus.rb (Sergio Gil 2009-11-03 00:59:18 +0100 1) puts "this is wadus.rb" d1326c7c wadus.rb (Sergio Gil 2009-11-03 01:09:35 +0100 2) puts "yeah, welcome to wadus.rb" Buscar culpables =;-)

Slide 113

Slide 113 text

Otro futuro es posible

Slide 114

Slide 114 text

Ramas

Slide 115

Slide 115 text

Crear una rama

Slide 116

Slide 116 text

$ git branch experimental Crear una rama

Slide 117

Slide 117 text

$ git branch experimental $ git branch Crear una rama

Slide 118

Slide 118 text

$ git branch experimental $ git branch experimental * master Crear una rama

Slide 119

Slide 119 text

Cambiar a una rama

Slide 120

Slide 120 text

$ git checkout experimental Cambiar a una rama

Slide 121

Slide 121 text

$ git checkout experimental $ git branch Cambiar a una rama

Slide 122

Slide 122 text

$ git checkout experimental $ git branch * experimental master Cambiar a una rama

Slide 123

Slide 123 text

Crear una rama y cambiar a ella (atajo)

Slide 124

Slide 124 text

$ git checkout -b experimental Crear una rama y cambiar a ella (atajo)

Slide 125

Slide 125 text

$ git checkout -b experimental Switched to a new branch 'experimental' Crear una rama y cambiar a ella (atajo)

Slide 126

Slide 126 text

$ git checkout -b experimental Switched to a new branch 'experimental' $ git branch Crear una rama y cambiar a ella (atajo)

Slide 127

Slide 127 text

$ git checkout -b experimental Switched to a new branch 'experimental' $ git branch * experimental master Crear una rama y cambiar a ella (atajo)

Slide 128

Slide 128 text

No content

Slide 129

Slide 129 text

No content

Slide 130

Slide 130 text

Mergear ramas

Slide 131

Slide 131 text

$ git merge experimental Mergear ramas

Slide 132

Slide 132 text

$ git merge experimental Updating d49c8e0..6dd50c5 Fast forward src/wadus.rb | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) Mergear ramas

Slide 133

Slide 133 text

No content

Slide 134

Slide 134 text

No content

Slide 135

Slide 135 text

No content

Slide 136

Slide 136 text

Mergear de nuevo

Slide 137

Slide 137 text

$ git merge experimental Mergear de nuevo

Slide 138

Slide 138 text

$ git merge experimental Auto-merging src/wadus.rb Merge made by recursive. src/wadus.rb | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) Mergear de nuevo

Slide 139

Slide 139 text

No content

Slide 140

Slide 140 text

Conflictos

Slide 141

Slide 141 text

$ git co experimental

Slide 142

Slide 142 text

$ git commit -m "hey, ho!"

Slide 143

Slide 143 text

$ git co master

Slide 144

Slide 144 text

$ git commit -m "hey, yeah!"

Slide 145

Slide 145 text

No content

Slide 146

Slide 146 text

Mergear de nuevo

Slide 147

Slide 147 text

$ git merge experimental Mergear de nuevo

Slide 148

Slide 148 text

$ git merge experimental Auto-merging src/wadus.rb CONFLICT (content): Merge conflict in src/wadus.rb Automatic merge failed; fix conflicts and then commit the result. Mergear de nuevo

Slide 149

Slide 149 text

No content

Slide 150

Slide 150 text

No content

Slide 151

Slide 151 text

Resolver un conflicto

Slide 152

Slide 152 text

$ git add src/wadus.rb Resolver un conflicto

Slide 153

Slide 153 text

$ git add src/wadus.rb $ git commit [master 8dc69ab] Merge branch 'experimental' Resolver un conflicto

Slide 154

Slide 154 text

No content

Slide 155

Slide 155 text

Eliminar una rama

Slide 156

Slide 156 text

$ git branch -d experimental Eliminar una rama

Slide 157

Slide 157 text

$ git branch -d experimental Deleted branch experimental (was d4ff9f7). Eliminar una rama

Slide 158

Slide 158 text

No content

Slide 159

Slide 159 text

Cambiar el pasado

Slide 160

Slide 160 text

Modificar el último commit

Slide 161

Slide 161 text

$ git commit --amend -m "" Modificar el último commit

Slide 162

Slide 162 text

Rebase

Slide 163

Slide 163 text

Rebase

Slide 164

Slide 164 text

Rebase

Slide 165

Slide 165 text

Rebase

Slide 166

Slide 166 text

Rebase

Slide 167

Slide 167 text

Rebase

Slide 168

Slide 168 text

Rebase

Slide 169

Slide 169 text

Rebase

Slide 170

Slide 170 text

No content

Slide 171

Slide 171 text

rebase + merge

Slide 172

Slide 172 text

$ git checkout feature1 rebase + merge

Slide 173

Slide 173 text

$ git checkout feature1 Switched to branch 'feature1' rebase + merge

Slide 174

Slide 174 text

$ git checkout feature1 Switched to branch 'feature1' $ git rebase master rebase + merge

Slide 175

Slide 175 text

$ git checkout feature1 Switched to branch 'feature1' $ git rebase master First, rewinding head to replay your work on top of it... Applying: New feature rebase + merge

Slide 176

Slide 176 text

No content

Slide 177

Slide 177 text

rebase + merge

Slide 178

Slide 178 text

$ git checkout master rebase + merge

Slide 179

Slide 179 text

$ git checkout master Switched to branch 'master' rebase + merge

Slide 180

Slide 180 text

$ git checkout master Switched to branch 'master' $ git merge feature1 rebase + merge

Slide 181

Slide 181 text

$ git checkout master Switched to branch 'master' $ git merge feature1 Updating b70bad0..e5a1424 Fast forward src/wadus.rb | 2 ++ 1 files changed, 2 insertions(+), 0 deletions(-) rebase + merge

Slide 182

Slide 182 text

No content

Slide 183

Slide 183 text

Ese es el ejemplo más básico, pero git rebase permite hacer todo tipo de cambios en la historia

Slide 184

Slide 184 text

Modificar commits

Slide 185

Slide 185 text

Modificar commits Eliminar commits

Slide 186

Slide 186 text

Modificar commits Eliminar commits Reordenar commits

Slide 187

Slide 187 text

Modificar commits Eliminar commits Reordenar commits Unir varios commits en uno solo

Slide 188

Slide 188 text

Modificar commits Eliminar commits Reordenar commits Unir varios commits en uno solo Separar un commit en varios

Slide 189

Slide 189 text

Control de Versiones Distribuido con GIT

Slide 190

Slide 190 text

Al ser todas las operaciones en local, todo lo que ya hemos hecho es control distribuido per se

Slide 191

Slide 191 text

Sólo necesitamos aprender a interactuar con otros repositorios (iguales que el nuestro)

Slide 192

Slide 192 text

Lo cual son 3 o 4 comandos

Slide 193

Slide 193 text

remote + clone

Slide 194

Slide 194 text

$ git remote remote + clone

Slide 195

Slide 195 text

$ git remote $ cd .. remote + clone

Slide 196

Slide 196 text

$ git remote $ cd .. $ git clone wadus/ wadus2 remote + clone

Slide 197

Slide 197 text

$ git remote $ cd .. $ git clone wadus/ wadus2 Initialized empty Git repository in /Users/sergio/Code/wadus2/.git/ remote + clone

Slide 198

Slide 198 text

$ git remote $ cd .. $ git clone wadus/ wadus2 Initialized empty Git repository in /Users/sergio/Code/wadus2/.git/ $ cd wadus2 remote + clone

Slide 199

Slide 199 text

$ git remote $ cd .. $ git clone wadus/ wadus2 Initialized empty Git repository in /Users/sergio/Code/wadus2/.git/ $ cd wadus2 $ git remote remote + clone

Slide 200

Slide 200 text

$ git remote $ cd .. $ git clone wadus/ wadus2 Initialized empty Git repository in /Users/sergio/Code/wadus2/.git/ $ cd wadus2 $ git remote origin remote + clone

Slide 201

Slide 201 text

Ramas remotas

Slide 202

Slide 202 text

$ git branch -a Ramas remotas

Slide 203

Slide 203 text

$ git branch -a * master remotes/origin/HEAD -> origin/master remotes/origin/feature1 remotes/origin/master Ramas remotas

Slide 204

Slide 204 text

No content

Slide 205

Slide 205 text

fetch

Slide 206

Slide 206 text

$ git fetch origin fetch

Slide 207

Slide 207 text

$ git fetch origin remote: Counting objects: 7, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. From /Users/sergio/Code/wadus e5a1424..13fab0a master -> origin/master [master d1326c7] Added one more message 1 files changed, 1 insertions(+), 0 deletions(-) fetch

Slide 208

Slide 208 text

No content

Slide 209

Slide 209 text

Mergear rama remota

Slide 210

Slide 210 text

$ git merge origin/master Mergear rama remota

Slide 211

Slide 211 text

$ git merge origin/master Updating e5a1424..13fab0a Fast forward src/wadus.rb | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) Mergear rama remota

Slide 212

Slide 212 text

No content

Slide 213

Slide 213 text

pull = fetch + merge

Slide 214

Slide 214 text

$ git pull origin master pull = fetch + merge

Slide 215

Slide 215 text

$ git pull origin master From ../wadus * branch master -> FETCH_HEAD Updating e5a1424..13fab0a Fast forward src/wadus.rb | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) pull = fetch + merge

Slide 216

Slide 216 text

Añadir repositorios remotos

Slide 217

Slide 217 text

$ cd ../wadus Añadir repositorios remotos

Slide 218

Slide 218 text

$ cd ../wadus $ git remote Añadir repositorios remotos

Slide 219

Slide 219 text

$ cd ../wadus $ git remote $ git remote add developer1 ../wadus2 Añadir repositorios remotos

Slide 220

Slide 220 text

$ cd ../wadus $ git remote $ git remote add developer1 ../wadus2 $ git checkout -b integration Añadir repositorios remotos

Slide 221

Slide 221 text

$ cd ../wadus $ git remote $ git remote add developer1 ../wadus2 $ git checkout -b integration Switched to a new branch 'integration' Añadir repositorios remotos

Slide 222

Slide 222 text

$ cd ../wadus $ git remote $ git remote add developer1 ../wadus2 $ git checkout -b integration Switched to a new branch 'integration' $ git pull developer1 master Añadir repositorios remotos

Slide 223

Slide 223 text

$ cd ../wadus $ git remote $ git remote add developer1 ../wadus2 $ git checkout -b integration Switched to a new branch 'integration' $ git pull developer1 master remote: Counting objects: 7, done. remote: Compressing objects: 100% (2/2), done. remote: Total 4 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. From ../wadus2 * branch master -> FETCH_HEAD Updating 13fab0a..f602261 Fast forward src/wadus.rb | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) Añadir repositorios remotos

Slide 224

Slide 224 text

No content

Slide 225

Slide 225 text

push

Slide 226

Slide 226 text

$ git push origin master push

Slide 227

Slide 227 text

$ git push origin master Counting objects: 7, done. Delta compression using up to 2 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (4/4), 339 bytes, done. Total 4 (delta 1), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. To ../wadus/ 13fab0a..f602261 master -> master push

Slide 228

Slide 228 text

No content

Slide 229

Slide 229 text

No content

Slide 230

Slide 230 text

Herramientas

Slide 231

Slide 231 text

gitk/gitx

Slide 232

Slide 232 text

gitk/gitx github.com

Slide 233

Slide 233 text

gitk/gitx github.com gitosis

Slide 234

Slide 234 text

gitk/gitx github.com gitosis git-svn

Slide 235

Slide 235 text

Algunos ejemplos interesantes (si da tiempo)

Slide 236

Slide 236 text

No content

Slide 237

Slide 237 text

Reescribir la historia con git rebase -i

Slide 238

Slide 238 text

Reescribir la historia con git rebase -i Ejemplo de workflow (resolver un bug)

Slide 239

Slide 239 text

Reescribir la historia con git rebase -i Ejemplo de workflow (resolver un bug) git add --patch

Slide 240

Slide 240 text

Reescribir la historia con git rebase -i Ejemplo de workflow (resolver un bug) git add --patch Búsqueda de bugs con git-bisect

Slide 241

Slide 241 text

Referencias

Slide 242

Slide 242 text

No content

Slide 243

Slide 243 text

http://help.github.com http://gitcasts.com/ http://peepcode.com/products/git http://git-scm.com/ http://whygitisbetterthanx.com/

Slide 244

Slide 244 text

http://progit.org/

Slide 245

Slide 245 text

Muchas Gracias :)

Slide 246

Slide 246 text

Créditos fotográficos http://www.flickr.com/photos/paulwoolrich/137061419/ http://www.flickr.com/photos/grantmac/2235164840/ http://www.flickr.com/photos/ride/1446398976/ http://www.flickr.com/photos/drewvigal/226816012/ http://www.flickr.com/photos/escalepade/2527644338/ http://picasaweb.google.com/cschlaeger/JapanLinuxSymposium#5395358413061926434 http://es.wikipedia.org/wiki/Archivo:Linus_Torvalds.jpeg

Slide 247

Slide 247 text

http://creativecommons.org/licenses/by/3.0/es/