Gitで修正する前のソースやドキュメントを取得する方法

Gitを使っていてある日修正する前のソースコードを見たくなったのですが、すぐには分からなかったので方法を整理しました。

修正する前のソースやドキュメントを取得

以下の流れで取得します。

1.現在の状態を確認(どこのHEADにいるのか確認)

$ git branch --contain

2.取得したいソースやドキュメントのコミットを確認

$ git log

3.対象のコミットの状態へ移動

「git log」で確認したコミットを指定して移動します。

$ git checkout [commit]

例えば、以下のコミットに移動するには、

commit 3dea81bbc44608712cb89cc3a1565b948b2d78b0
$ git checkout 3dea81bbc44608712cb89cc3a1565b948b2d78b0

で移動します。その際以下の警告メッセージが表示されます。

You are in 'detached HEAD' state. You can look around, make experimental
 changes and commit them, and you can discard any commits you make in this
 state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
 do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEADから外れたところにいるので、ここでの変更やコミットは他のブランチに影響されずに破棄されるといっています。

ここでのコミットを残したい場合はブランチを新たに作ることもできますといってます。

この状態で何か修正するのはややこしくなるので避けたほうがいいですね。

もし誤って修正しちゃった場合は、新しくブランチを作って元に戻った後にマージすればいいように思います。

例えば、以下のコマンドで修正してしまった内容を反映させれるように思います。ただ、これは試してないのであくまで予想ですw

$ git branch work

$ git checkout master

$ git merge work

4.その時のソースコードやドキュメントを取得

先程のチェックアウトで過去にコミットした状態へ移動しました。ソースやドキュメントを見るとその時の内容になっているかと思います。これらを別のところへコピーしておいて、元の状態へ戻ります。

5.元の状態(HEADの位置)へ戻る

再びチェックアウトして元のブランチもしくはmasterへ戻ります。

$ git checkout master

この流れでGitコマンドを実行すると過去のソースやドキュメントが取得できます。

おまけ

GitのHEAD

現在使用しているブランチの先頭をHEADといいます。masterかもしくは任意の名前のブランチの先頭のことで、ブランチを移動するということは、つまりHEADを移動することです。

GitのHEADから外れる

過去の修正する前のソースコードやドキュメントを取得するには、先頭(HEAD)にいる状態から修正する前の状態に移動して取得します。そのときはHEADから外れている状態になります。