私が機械学習研究をするときのコード・データ管理方法 - Qiitaがいい話で参考になった。 特に、データがどのプログラムから作成されたかをgitのコミットで管理するところが勉強になったのだけど、gitのコマンドをよく忘れてしまうので、ここに簡単な例を書いておいて、いつでも参照できるようにしておく。

1. プログラムを作成、コミットする。

プログラムcalc.pyを作成。

def calc(a, b):
    retunr a + b

print calc(1, 2)

作ったプログラムをコミットする。

git add -A
git commit -m "最初のコミット"

2. プログラムを修正、コミットする。

プログラムcalc.pyを修正。

def calc(a, b):
    retunr a + 2 * b

print calc(1, 2)

git add -A
git commit -m "計算方法を修正"
git log

git logの出力は以下の様な感じ。

commit bf852179b307e1e1f205a24b7b0cb2f9ccb9293b
...

    計算方法の修正

commit 5e63ade4258dbb7b94af2cd6597c84b1f0c21fd9
...

    最初のコミット

3. プログラムを指定したコミットIDの状態に戻す。

以下のようにプログラムの中身を確認して、

git show 5e63:calc.py ### 特定のファイルのみ見たい場合はcommit_id:/path/to/fileと指定

#!/usr/bin/python

def calc(a, b):
    return a + b

    print calc(1, 2)

あるいは、以下のように差分を確認して、

git diff HEAD:calc.py 5e63:calc.py
diff --git a/HEAD:calc.py b/5e63:calc.py
index e2c3e48..6ce682f 100644
--- a/HEAD:calc.py
+++ b/5e63:calc.py
@@ -1,6 +1,6 @@
 #!/usr/bin/python

  def calc(a, b):
  -    return a + 2 * b
  +    return a + b

   print calc(1, 2)

確かに自分が戻したいコミットであれば、以下のようにして戻す:

git checkout -b topic 5e63ade4258dbb7b94af2cd6597c84b1f0c21fd9 ### topicブランチを作成して、コミットIDが5e63...の状態に戻す。

ブランチを作らずにcheckoutで指定した状態に戻してプログラムを変更しても、どのブランチにもその変更が反映されない (実験的な変更を加えるのが目的なら問題ない)。 ブランチを作らずにcheckoutして、やっぱり変更をコミットしたいという場合は、一時的なブランチを作成して、masterへ移動後、マージする。

ブランチを作成せずに指定したコミットIDに戻した後に、加えた変更を反映したい場合

git checkout 5e63ade4258dbb7b94af2cd6597c84b1f0c21fd9 ### ブランチを作成せずに、5e63...の状態に戻る
git branch tmp ### 一時的なブランチtmpを作成して移動
git checkout master ### masterブランチへ移動
git merge tmp ### tmpをmasterへマージ
git branch -d tmp ### tmpを削除

参考: gitのHEADがブランチから外れてしまう現象とその直し方 - 西尾泰和のはてなダイアリー


最近の記事