gitで指定したコミットIDの状態に戻す
私が機械学習研究をするときのコード・データ管理方法 - 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がブランチから外れてしまう現象とその直し方 - 西尾泰和のはてなダイアリー