Gitで実験コードのバージョン管理をする
このトピックを終えたら
Gitで分析コードの変更履歴を記録し、過去のバージョンに戻し、GitHubにバックアップできるようになります。
Gitが必要な理由
研究室でこんなファイル名を見たことはありませんか?
analysis_final.py
analysis_final_v2.py
analysis_final_v2_先生修正.py
analysis_final_v2_先生修正_本当の最終版.pyGitは1つのファイルにすべての変更履歴を保存します。ファイルをコピーする必要はありません。
インストールと初期設定
Google ColabにはGitがすでにインストールされています。名前とメールアドレスを設定するだけです。
git config --global user.name "Your Name"git config --global user.email "your@email.com"
# 設定を確認git config --list --global | grep user最初のリポジトリを作る
git initは空の実験ノートを新しく開くのと同じです。
# 練習用ディレクトリを作成 + Git初期化mkdir -p /tmp/bio-analysis && cd /tmp/bio-analysisgit init
# .gitフォルダが作成される(Gitが履歴を保存する場所)ls -la .git/最初のコミット:スナップショットを撮る
コミット(commit)は実験ノートに日付を書いて「ここまで完了」と記すことです。
cd /tmp/bio-analysis
# 分析スクリプトを作成cat > gc_analysis.py << 'SCRIPT'"""GC Content分析スクリプト 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の3ステップ:作業 → ステージング → コミットgit add gc_analysis.py # 1. ステージング(スナップショットに含めるファイルを選択)git status # 確認:緑色 = ステージング済みgit commit -m "feat: GC content分析スクリプト初期バージョン" # 2. コミット(スナップショット!)
# 履歴を確認git log --oneline変更を追跡する:diffで差分を見る
論文の校正で変更箇所を赤ペンでマークするように、git diffは何が変わったかを表示します。
cd /tmp/bio-analysis
# 既存環境がなければ作成if [ ! -f gc_analysis.py ]; then git init cat > gc_analysis.py << 'SCRIPT'"""GC Content分析スクリプト 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: GC content分析スクリプト初期バージョン"fi
# スクリプトを修正:EGFR遺伝子を追加cat > gc_analysis.py << 'SCRIPT'"""GC Content分析スクリプト v2 — 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
# 変更内容を確認git diff gc_analysis.py
# コミットgit add gc_analysis.pygit commit -m "feat: EGFR追加 + GC 60%以上にHIGHラベル"
git log --oneline元に戻す:過去への旅
実験が失敗した時に以前のプロトコルに戻るように、Gitはどの時点にでも戻ることができます。
cd /tmp/bio-analysis
# 既存環境がなければ作成if [ ! -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
# 履歴を見るgit log --oneline
# 特定のファイルだけを以前のコミット状態に戻すFIRST_COMMIT=$(git log --oneline | tail -1 | cut -d' ' -f1)echo "最初のコミット: $FIRST_COMMIT"
# 現在の内容を確認echo "--- 現在 ---"cat gc_analysis.py
# 最初のコミットの内容を確認(戻す前のプレビュー)echo "--- 最初のコミット ---"git show $FIRST_COMMIT:gc_analysis.py注意:
git checkout -- ファイル名は修正内容を元に戻します(コミットしていない変更が消えます)。重要な変更は先にコミットしてください。
.gitignore: 追跡から除外する
実験で中間生成物は保管しないように、Gitでも大きなデータファイルや一時ファイルは除外します。
cd /tmp/bio-analysis
# .gitignoreを作成 — バイオプロジェクト用cat > .gitignore << 'EOF'# 大容量データ(Gitに入れない)*.fastq*.fastq.gz*.bam*.sam
# Pythonキャッシュ__pycache__/*.pyc.ipynb_checkpoints/
# 環境設定(個人情報を含む可能性あり).env*.log
# OSファイル.DS_StoreThumbs.dbEOF
# テスト:大きなファイルを作ってもGitが無視するか確認echo "fake fastq data" > sample.fastqgit status # sample.fastqがUntrackedに出なければ成功やってみよう(Faded Example)
空欄を埋めて、Gitの基本ワークフローを完成させてください。
# 1. 新しいリポジトリを作るgit# 2. ファイルをステージングエリアに追加git analysis.py# 3. スナップショットを保存git -m "first analysis script"
よくあるエラーと解決法
Q: fatal: not a git repository
現在のディレクトリがGitリポジトリではありません。git initで初期化するか、cdでGitリポジトリのフォルダに移動してください。
Q: nothing to commit, working tree clean
変更がありません。ファイルを修正した後にgit addしてください。すでにgit addした後なら、すでにコミット済みです。
Q: 誤って大きなFASTQファイルをコミットしました
.gitignoreに*.fastqを追加した後、git rm --cached sample.fastqで追跡を解除してください(ファイル自体は削除されません)。
Q: コミットメッセージを間違えました
git commit --amend -m "新しいメッセージ"で最後のコミットメッセージを修正できます(まだpushしていない場合のみ)。
次の記事では、Pythonで実験データを可視化する方法を学びます。