minimize

事業拡大のため、新しい仲間を募集しています。
→詳しくはこちら

ログとタグ

ログはSVNと同じです。

$ git log
$ git log file1

タグ付けは、以下のようにします。

$ git tag -a v2.5 -m "tag commit comment"

-a オプションを付けると、タグにコメントを付けることができます。
Git も常に付けることを推奨しているので、そうしましょう。
付けたタグ名はあらゆる場面で(オプション無で)使えます。

$ git diff v2.5 HEAD
$ git branch stable v2.5

これは便利ですが、以下のような点に気を付けましょう。

$ git diff v2.5

これは「v2.5タグと比較」なのか「v2.5 ファイルを比較」なのか、どちらでしょう。

Git はこれを、状況に応じて解決します。
つまり v2.5 というファイルがあればそれを比較しますし、v2.5 というタグが定義されていればそれで比較します。
両方が成り立つ場合、Git は「曖昧な表現」というエラーを出します。

こういった事を避けるために、タグ名はなるべく
ファイル名やディレクトリ名、リポジトリパス名と衝突しないような名称にしましょう。
特定の Prefix を付けるのが良いでしょう。

reset

git reset は非常に複雑なコマンドなので、ここでは一番簡単な使い方のみ紹介します。
「ファイルをステージから降ろす」ときに使います。

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   file1
#       modified:   file2
#       modified:   file4

いくつかのファイルは変更され、ステージに上がっている状態です。
ここで、reset コマンドを実行します。

$ git reset HEAD -- file4
Unstaged changes after reset:
M       file4

結果はどうなったでしょうか。

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   file1
#       modified:   file2
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   file4

このように、reset で指定したファイルがステージから降ろされました。

-- という記法ですが、これは「ここから先は(タグ名やIDではなく)ファイル名だよ」ということをコマンドに教えています。
上で少し説明したように、git のコマンド群はファイルを受け付ける場所でタグも受け付けることができます。
それらの曖昧さを無くすために、確実に -- と入力してファイルの始まりを明示することは
習慣として身に付けておくと良い、とのことです。

実は git reset にはオプション(--soft, --hard)があるのですが
これらの動作は非常にわかりにくいため、ここでは紹介しません。

前回コミット時の状態まで戻す

ちなみに、ファイルを「前回コミット時の状態」まで戻す(force update)には以下のようにします。

$ git checkout -- file4

これは「file4 を前回コミット時の状態に戻し」ます。それまで変更していた内容は全て失われます。
ただし、ステージに上げられているファイルは戻せません。(そのとき警告も出ないので注意)
一度ステージから下げてから、戻す必要があります。

余談ですが、git checkout はブランチを変更するときにも使うコマンドだということを覚えていたでしょうか。
これと戻すときのコマンドは非常に似ていて紛らわしいです。
誤動作させないためにも、-- は必ず付けましょう。