Uso de Git para gestionar las versiones del código de los experimentos
Al finalizar este tema
Podrás registrar el historial de cambios del código de análisis con Git, volver a versiones anteriores y realizar copias de seguridad en GitHub.
¿Por qué es necesario Git?
¿Has visto alguna vez estos nombres de archivo en el laboratorio?
analysis_final.py
analysis_final_v2.py
analysis_final_v2_revisado_profesor.py
analysis_final_v2_revisado_profesor_ahora_si_final.pyGit guarda todo el historial de cambios en un solo archivo. No es necesario copiar el archivo.
Instalación y configuración inicial
Git ya está instalado en Google Colab. Solo hay que configurar el nombre y el correo electrónico.
git config --global user.name "Your Name"git config --global user.email "your@email.com"
# Comprueba la configuracióngit config --list --global | grep userCrear el primer repositorio
git init es como abrir un nuevo cuaderno de laboratorio en blanco.
# Crea un directorio de práctica e inicializa Gitmkdir -p /tmp/bio-analysis && cd /tmp/bio-analysisgit init
# Se crea la carpeta .git, donde Git guarda el historialls -la .git/Primer commit: tomar una instantánea
Un commit es como poner la fecha en un cuaderno de laboratorio y escribir "hecho hasta aquí".
cd /tmp/bio-analysis
# Crea el script de análisiscat > gc_analysis.py << 'SCRIPT'"""Script de análisis de contenido GC v1"""
def calculate_gc(sequence: str) -> float: seq = sequence.upper() gc = seq.count("G") + seq.count("C") return (gc / len(seq)) * 100
sequences = { "BRCA1": "ATGGATTTATCTGCTCTTCG", "TP53": "ATGGAGGAGCCGCAGTCAG",}
for name, seq in sequences.items(): print(f"{name}: GC={calculate_gc(seq):.1f}%")SCRIPT
# Tres etapas de Git: trabajo → staging → commitgit add gc_analysis.py # 1. Staging: selecciona los archivos de la instantáneagit status # Comprueba: verde = preparadogit commit -m "feat: versión inicial del script de contenido GC" # 2. Commit: instantánea
# Consulta el historialgit log --onelineSeguimiento de cambios: visualizar las diferencias con diff
Al igual que se utilizan lápices rojos para marcar los cambios durante la revisión de un documento, git diff muestra qué ha cambiado.
cd /tmp/bio-analysis
# Crea el archivo si todavía no existeif [ ! -f gc_analysis.py ]; then git init cat > gc_analysis.py << 'SCRIPT'"""Script de análisis de contenido GC v1"""
def calculate_gc(sequence: str) -> float: seq = sequence.upper() gc = seq.count("G") + seq.count("C") return (gc / len(seq)) * 100
sequences = { "BRCA1": "ATGGATTTATCTGCTCTTCG", "TP53": "ATGGAGGAGCCGCAGTCAG",}
for name, seq in sequences.items(): print(f"{name}: GC={calculate_gc(seq):.1f}%")SCRIPT git add gc_analysis.py git commit -m "feat: versión inicial del script de contenido GC"fi
# Modifica el script: añade el gen EGFRcat > gc_analysis.py << 'SCRIPT'"""Script de análisis de contenido GC v2: añade EGFR"""
def calculate_gc(sequence: str) -> float: seq = sequence.upper() gc = seq.count("G") + seq.count("C") return (gc / len(seq)) * 100
sequences = { "BRCA1": "ATGGATTTATCTGCTCTTCG", "TP53": "ATGGAGGAGCCGCAGTCAG", "EGFR": "ATGCGACCCTCCGGGACGGC",}
for name, seq in sequences.items(): gc = calculate_gc(seq) label = "HIGH" if gc > 60 else "NORMAL" print(f"{name}: GC={gc:.1f}% [{label}]")SCRIPT
# Comprueba los cambiosgit diff gc_analysis.py
# Commitgit add gc_analysis.pygit commit -m "feat: añade EGFR y etiqueta HIGH para GC >= 60 %"
git log --onelineDeshacer: Un viaje al pasado
Así como volvemos a un protocolo anterior cuando un experimento falla, Git nos permite regresar a cualquier punto en el tiempo.
cd /tmp/bio-analysis
# Crea el entorno si todavía no existeif [ ! -d .git ]; then git init git config user.name "Test" && git config user.email "test@test.com" echo "v1" > gc_analysis.py git add gc_analysis.py && git commit -m "v1" echo "v2" > gc_analysis.py git add gc_analysis.py && git commit -m "v2"fi
# Muestra el historialgit log --oneline
# Restaura solo un archivo al estado de un commit anteriorFIRST_COMMIT=$(git log --oneline | tail -1 | cut -d' ' -f1)echo "Primer commit: $FIRST_COMMIT"
# Comprueba el contenido actualecho "--- Actual ---"cat gc_analysis.py
# Consulta el contenido del primer commit antes de restaurarecho "--- Primer commit ---"git show $FIRST_COMMIT:gc_analysis.pyAdvertencia:
git checkout -- nombre_de_archivodeshace las modificaciones y se perderán los cambios no confirmados. Confirme primero los cambios importantes.
.gitignore: Exclusión del seguimiento
Al igual que en un experimento no se guardan los productos intermedios, en Git se excluyen los archivos de datos grandes o los archivos temporales.
cd /tmp/bio-analysis
# Crea .gitignore para un proyecto de biologíacat > .gitignore << 'EOF'# Datos grandes: no se incluyen en Git*.fastq*.fastq.gz*.bam*.sam
# Caché de Python__pycache__/*.pyc.ipynb_checkpoints/
# Configuración del entorno, que puede contener datos privados.env*.log
# Archivos del sistema operativo.DS_StoreThumbs.dbEOF
# Prueba que Git ignore un archivo grandeecho "fake fastq data" > sample.fastqgit status # Correcto si sample.fastq no aparece como UntrackedInténtelo usted mismo (Ejemplo atenuado)
Complete los espacios en blanco a continuación para completar el flujo de trabajo básico de Git.
# 1. Crear un repositorio nuevogit# 2. Agregar archivos al área de preparacióngit analysis.py# 3. Guardar una instantáneagit -m "first analysis script"
Errores comunes y soluciones
Q: fatal: not a git repository
El directorio actual no es un repositorio Git. Inicialícelo con git init o entre en la carpeta de un repositorio con cd.
Q: nothing to commit, working tree clean
No hay cambios. Modifique un archivo y ejecute git add. Si ya lo hizo, es posible que los cambios ya estén confirmados.
P: Confirmé por error un archivo FASTQ grande
Añada *.fastq a .gitignore y deje de seguir el archivo con git rm --cached sample.fastq; el archivo local no se eliminará.
P: Escribí mal el mensaje del commit
Puede corregir el último mensaje con git commit --amend -m "mensaje nuevo", pero solo si todavía no ha hecho push.
En el siguiente artículo aprenderemos a visualizar datos experimentales con Python.