Gastón Ramos

"La mayoría de las gaviotas no se molesta en aprender sino las normas de vuelo más elementales: como ir y volver entre playa y comida. Para la mayoría de las gaviotas, no es volar lo que importa, sino comer. Para esta gaviota, sin embargo, no era comer lo que le importaba, sino volar. Más que nada en el mundo, Juan Salvador Gaviota amaba volar".

Category: git

Git tip: Deshacer un “git add”

Siguiendo con la traducción del man de git-reset:

$ edit                                     (1)
$ git add frotz.c filfre.c
$ mailx                                    (2)
$ git reset                                (3)
$ git pull git://info.example.com/ nitfol  (4)

1. Estás felizmente trabajando en algo, y vez que los cambios en esos archivos están bien. No querés seguir viéndolos cuando hacés “git diff”, por que planeás trabajar en otros archivos y cambios mientras que estos archivos te distraen.

2. Alguien te pide que hagas “git pull” y los cambios son dignos de ser mergeados.

3. Sin emargo ya ensuciaste el índice (tu índice ya no apunta al HEAD commit). Y sabes que el pull no va a afectar a frotz.c o filfre.c, entonces reviertes el índice para estos dos archivos. Los cambios en el directorio de trabajao siguen ahí.

4. Entonces podés hacer pull y merge, dejando que los cambios de frotz.c y filfre.c sigan en el directorio de trabajo.

Nota del traductor:
La verdad excelente, no sabía esta forma de usar reset :).

Git tip: Deshacer un merge o pull

Lo que sigue es una traducción hecha por mí de una parte de “man git-reset”, es útil por ejemplo cuando estamos en una rama local
y hacemos git pull y tenemos un conflicto y en el caso de que nuestros cambios locales no nos interesen:

               $ git pull                         (1)
               Auto-merging nitfol
               CONFLICT (content): Merge conflict in nitfol
               Automatic merge failed; fix conflicts and then commit the result.
               $ git reset --hard                 (2)
               $ git pull . topic/branch          (3)
               Updating from 41223... to 13134...
               Fast-forward
               $ git reset --hard ORIG_HEAD       (4)

1. Intentar actualizar desde el upstream resultó en montón de conflictos; vos no estás listo para perder un montón de tiempo en mergear ahora, entonces decides hacer esto más tarde.

2. “pull” no ha hecho el merge commit, entonces “git reset –hard” que es sinónimo de: “git reset –hard HEAD” limpia el desorden desde el índice en el working tree.

3. Mergear el topic-branch en el branch actual resultó en un fast-fordward.

4. Pero decidiste que el topic- branch no está listo para abrirlo al público aún. “pull” o “merge” siempre dejan el tip original del branch actual en ORIG_HEAD, entonces haciendo reset hard hacia este va a dejar tu archivo de índice y el working tree de nuevo en ese estado, reseteando el tip del branch a ese commit.

Qué es el archivo índice de git?


fast-forward-git-merge

Herramientas del día a día

Durante mi jornada de trabajo de programador, uso varias herramientas, algunas las uso desde hace mucho otras no tanto, por ejemplo, para abrir y editar archivos uso emacs, que todavía no lo sé manejar como quisiera, pero es altamente poderoso.
Otra cosa que uso es screen para multiplexar sesiones de bash en una misma terminal.
Además de estas dos cosas uso mucho git, y en particular estoy aprendiendo a usar Magit que es un modo de emacs para git.
Acá dejo unos links útiles más que nada para tenerlos para mí, todos en un sólo lugar.

Emacs card reference:

http://www.gnu.org/software/emacs/refcards/pdf/refcard.pdf

Screen:

http://aperiodic.net/screen/quick_reference

Magit:

http://magit.github.io/documentation.html

Guard:

https://github.com/guard/guard

Feature branch a mi no me gusta

En la empresa dónde estoy trabajando actualmente se usa mucho la modalidad de trabajo Feature Branch con git, es decir que por cada nueva feature que hay que desarrollar se crea una nueva rama remota y se trabaja pusheando a esa rama, a mí no me gusta esta forma de trabajo por que le encuentro varias desventajas, nunca me gustó, entonces tratando de explicarles a mis compañeros por qué me parecía mal me encontré con un artículo de Martin Fowler donde lo explica con exactitud y con detalles del caso, traduje el artículo completo al español, no tiene desperdicio:

http://gastonramos.com.ar/translations/feature-branch/

Después de leer el artículo completo, ¿ud que opina?

PD: Lucas este no es un artículo de kayakismo :)

Como inicializar un repositorio git

Hace mucho que no escribía, en este caso el tema es como inicializar un repositorio en git, básicamente consta de 2 partes una del lado del servidor y otra en el cliente.

Paso 1: vamos al server y corremos el siguiente script:

./init-repo-server-side.sh proyecto-nuevo

el script va a crear un nuevo repositorio git en /srv/git/proyecto-nuevo.git
con permisos para el user git que vamos a tener que agregar
al server, este usuario sólamente tiene que tener permisos para correr el comando git y nada más.

Script para correr en el server:


#!/bin/sh -x
# init-repo-server-side.sh
PROJECT=$1

REPO=/srv/git/$PROJECT.git

echo Creando $REPO ...

mkdir -p $REPO
cd $REPO
git --bare init
chown -R git:git $REPO
chmod g+w $REPO -R
chmod a+x hooks/post-update
touch git-daemon-export-ok

Paso 2: Luego vamos a la máquina cliente y ejecutamos el siguiente script:

./init-git.sh proyecto-nuevo

Este nos va a crear una carpeta proyecto-nuevo.git que va a contener
una copia de nuestro proyecto, que ya podemos comenzar a utilizar.

Script para correr en el cliente:


#!/bin/sh -x
#./init-git.sh
PROJECT=$1.git

URL=ssh://git@nuestro-server.com/srv/git/$PROJECT

echo Creando $PROJECT

mkdir $PROJECT
cd $PROJECT

git init
touch .gitignore
git add .gitignore
git commit -m "just gitignore"
git remote add origin $URL
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
git push --all
git pull

Esto fue todo, espero que les sea útil.