Branching ( ramificar) en GIT

Logo GIT.

Se en algo destaca git no seu sistema de desenrolo é que pode ramificar facer branch dos repositorios que manexa permitindo a colaboración nos mesmos, neste artigo explico cómo facer ramificacións “branchs” , cómo usalas, e cómo unilas a outras ramificacións como a que soe ser a principal “master”.

Introducción

A “rama” (ou branch) que se crea por defecto e na que traballamos chámase “master” , mais non se diferencia doustros branchs salvo por ser o primeiro creado e estar seleccionado por defecto.

A partir del os demáis branchs son comits que apuntan ao branch inicial, de estos poden sair outros que apunten a estos, que a súa vez apuntan ao master.

Para máis información é recomendable consultar a documentación oficial: git-branch.

Cómo sabe git en qué branch estás

Git ten un punteiro especial gardado no ficheiro “.git/HEAD”.

En dito ficheiro gárdase o punteiro cara o branch local no que estás, se non creaches outros branchs estarías no que se chama master (no me por defecto que lle dan ao primer branch cando se crea un proxecto novo).

Se accedemos ao directorio .git e facemos un cat do ficheiro HEAD:
cat HEAD
ref: refs/heads/master

Xestión de branchs

Unha vez feitas ás introduccións vamos coa parte práctica.

Boa práctica: Sempre que vaias a introducir unha nova funcionalidade é unha boa practica crear un branch para ir comiteando os pequenos cambios sen afectar a rama principal. A cal por boa práctica debería de funcionar sempre, inda que esto é preferencia de quen ou quenes xestionen o proxecto.

Crear un novo branch (rama)

Para crear un novo branch basta con usar “git branch”:
git branch <nome_branch>

Creación dun branch e consulta do log

Un exemplo rápido para velo en acción.

Creando o branch:
git branch outra_rama
Amosando o log do branch:
git log --oneline --decorate
829d6ea (HEAD -> master, outra_rama) engadidos arquivos de probas.

Vemos como no último commit, ten un novo branch e este está ao nivel de cambios que o branch “master” xa que non contén ningún cambio.

Mudar de branch

Seguindo co exemplo anterior, nos mudamos para seguinte rama do proxecto “outra_rama”.

Mudando de branch:
git checkout outra_rama
Switched to branch 'outra_rama'

Esto muda o punteiro de HEAD a rama “outra_rama” (ao branch “outra_rama”).

Amosando HEAD:
$ cat .git/HEAD 
ref: refs/heads/outra_rama

Se engadimos un ficheiro e realizamos commit, esta mudanza se aplicaría sobre o branch “outra_rama” que a súa vez apunta ao hash do último commit que había en master.

Agora mudamos ao branch orixinal “master”:
$ git checkout master

Con isto HEAD apuntará a master, polo que traballariamos sobre o último commit de master, e as mudanzas que fixeramos en “outra_rama” non serían amosadas no proxecto, só nos amosaría a rama master mais a “snapshoot” realizada en ámbalas ramas quedaría rexistrada en git, e cada unha pode ir traballando por separado.

O importante é ver que git mudará o directorio de traballo a cómo estaba na imaxen que se tomou cando realizache o último commit do branch ao que vas.

Se por algún motivo git non pode restituilos ficheiros ao estado no que estaban no commit do branch indicado non mudará os ficheiros nen o branch, xa que habría inconsistencias que darían como resultado incompatibilidades.

Ver o log de tódalas ramas do proxecto

Para velo estado xeral do proxecto, ver tódolos seus branch e as súas interrelacións.

Anécdota do setor: Hai un meme “famoso” para lembrarse de como consultar os logs, que sería lembrarse da frase mnemotécnica “A dog”.

Podemos usar git log da seguinte maneira (o coñecido como “A dog”):
git log --all --decorate --oneline --graph

$ git log --all --decorate --oneline --graph
* 4a7cdba (HEAD -> master) commit en master, post cambio
| * 4bdc408 (outra_rama) un comit en outra_rama
|/  
* 829d6ea engadidos arquivos de probas.
* 73aff8e (tag: etiqueta_olvidada) engadidas probas
* 4dbfc91 (tag: Engadidos_directorios_romanos) Engadido directorios romanos
* 832b534 (tag: v0000.0000, tag: v0.02, tag: v0.01) Creado directorios e agregado arquivos de proba.

Crear unha nova rama do proxecto e mover tódolos commits a dita rama con git checkout

Recomendación de boa práctica: Mellor realizar moitos commits “pequenos” que un enorme.

Cando comezamos a facer cambios pero que todavía non son estables, útiles ou peor todavía non funcionan e rompen o fluxo de execución. O recomendable é sempre crear unha rama un branch para básicamente non ir perdendo os cambios inestables que estamos a desenvolver, despois duns cantos commits cando xa sexa un código funcional se pode “mergear” a rama noutra na que vaiamos rexistrando ás cousas funcionáis ou estables, en proxectos pequenos soe ser a de por defecto “master”.

Con git checkout creamos un novo branch e o activamos como o branch actual no que traballar:
git checkout -b <nome_novo_branch>

Onde mudará o directorio actual prao novo branch que sería o indicado, ao poñer “-b <nome_branch>” fai un switch (cambio) ao branch, se non existe crea un novo.

Unir un branch a outro con git merge

Dase o caso de que nun dos branch temos creada unha parte do proxecto que xa funciona ou simplemente a queremos meter no brach chamado “master” (ou outro), o caso é que nos fai falla usar “merge” que ven sendo “engadir”.

Para elo realizamos commit das mudanzas feitas no proxecto nese branch, e logo mudamos ao branch master, finalmente unímolas mudanzas do outro branch ao master con “merge”.

Exemplo de git merge:
git checkout branch_segundo
vi novo-arquivo.txt
git commit -a -m "engadido novo-arquivo.txt a branch_segundo"
git checkout master
git merge branch_segundo

Realizamos “push” (enviar), para enviar o noso branch aos repositorios remotos

Cando teñas o proxecto no punto de que queiras compartilo, tes que realizar “push” ao repositorio que o distribuirá.

Usariamos git push así:
git push <nome_do_repo_remoto> <rama(branch)_que_queremos_enviarlle>.

Se por exemplo queremos enviar o noso branch local “master” ao noso repositorio local “origin” (nome por defecto, se non se definiu outro).

Se usaría (“Enviar a origin a ramificación master”):
git push origin master

Agora algo “máis rebuscado” temos un branch chamado “plugin_contador” e o queremnos enviar ao repo que agregamos co alias “proxecto_wordpress_colegas”.

Pois fariamos:
git push proyecto_wordpress_colegas plugin_contador

Para que funcione push, deberá ser usado con un branch que traballe sobre un repositorio clonado do cal teñas permisos de escritura, e ao que nadie fixera push mentras o fas ti.

Se ti e alguén máis enviades os cambios ao mesmo tempo ou sobre o mesmo código sen haber feito un fetch para obter os cambios do outro. O teu aporte será “rechazado” por que habrá mudado a versión “HEAD” do “branch” do repositorio, entonces precisarás de baixalo seu aporte primeiro, incorporalo ao teu antes de que se che permita facer un aporte ao repositorio “push”.

Insepeccionar un repositorio remoto con git remote show

Para vela información acerca dun “remote”, podes usar:
git remote show <nome_branch>

Eliminar un repositorio remoto do noso git

Para eliminar un repositorio remoto sería:
git remote rm <alias_branch>

E con isto conclue o artigo, xa tes o básico para usares git nun equipo de traballo.