Gitを触ってみるよ その1「Gitのイメージと初めてのコミット」

一応、Git環境は整ったものの、ありきたりなテストファイルを使った操作をしていても感覚として身に付かないので、実際にRailsのWebアプリケーションを使って、メモを残しつつGit操作を試してみようかと思います。

少しずつじっくりやっていきたいので、何回かに分けて記事を書いていこうと思います。でも、アジェンダを作って回を分けたりしている訳ではないので、きちんとした連載みたいなものにはならないと思うので、ご了解の程を…。

今回、予備知識として"git"をキーワードに色々ググっていて、非常に参考にさせて頂いたサイトがあるので、ご紹介しておこうと思います。
アリスとボブになりきってgitをちゃんと理解したい! - ザリガニが見ていた...。
実際に試してみた結果+所感で綴られているので、非常に分かり易いですね。「Gitをインストールはしてみたけど、どうすればいいの?」という方には(自分も含めて…)、ぜひオススメです。

という訳で始めていく訳ですが、まず自分の頭を整理する為に、リモートのリポジトリとのやり取りの事は一切置いておいて、一旦ターゲットをローカルリポジトリに絞りたいと思います。これをやっておかないと、今、自分がどこに対して更新を掛けようとしているのか分からなくなったりしそうなので…。(^^;ゞ

ローカルリポジトリの自分なりのイメージ

Gitではローカルリポジトリを作った時点で、大きく3つの状態を持つようになります。Junioさんの資料から抜粋すると、"HEAD commit"/"Index"/"Work Tree"の3つですね。それぞれ以下のような区別になります。

  • Work Tree
  • Index
    • キャッシュ領域。
  • HEAD commit
    • commitされたIndexのスナップショット。

これで十分わかる訳ですが、もっと現実のモノで例えて見た方が理解し易いかな…という事で、今の時点の自分の知識で、無理矢理現実のモノに例えてみると、こんなイメージです。

  • Work Tree
    • 鉛筆とか消しゴムを使って自由に描く事ができる紙。
  • Index
    • Work Treeで描いたモノをコピー機でコピーした紙。
  • HEAD commit
    • Indexの紙に付箋でコメントを付けて、どんどん入れていける箱。

"git add"が、Work Tree→Indexの操作なので、この例えで言うと、"Work Treeの絵をコピーする"という事に当たりますね。そして、"git commit"が、Index→HEAD commitの操作なので、この例えで言うと、"Indexの紙に付箋を付けて、箱に放り込む"という事に当たります。絵で描いてみるとこんな感じかな…。

Gitを使う場合は、常にこの3つの状態を頭に思い描いておくと、混乱が少なくて済みそうです。

何はともあれ初commitしてみよう

何となくGitのイメージが掴めた(ような気がする)ところで、早速、Gitを使った開発の第一歩、"編集→commit"の流れをやってみましょう。

まず、ローカルリポジトリを準備する訳ですが、これは前回の環境構築編でできているはず…ですが、念の為、もう一度作り直すところからやってみましょう。

C:\git>git clone ssh://git@server/home/git/public/project.git project
Initialized empty Git repository in C:/git/project/.git/
remote: Counting objects: 101, done.
remote: Compressing objects: 100% (93/93), done.
remote: Total 101 (delta 20), reused 0 (delta 0)
Receiving objects: 100% (101/101), 102.62 KiB, done.
Resolving deltas: 100% (20/20), done.

OKですね。それでは、早速ファイルを編集してみます。何か、編集のサンプルとしてちょうどいいのが無いかなと探してみると、謀ったかのように"app\models\dummy.rb"なんていうファイルが…。別に今回の記事の為に作ったファイルではなく、以前、Railsで試行錯誤していた時の名残です。(^^;ゞ これはもう要らないので消しちゃいます。

ただ、注意しなくてはいけないのは、先に述べた3つの状態の全てにこのファイルが存在しているので、単純にWork Treeからこのファイルを削除しただけではダメだという事ですね。どうするのが正解なのか分からないけど、どうせ後で何とでもできるので、とりあえず、Work Treeのファイルを消してしまって、"git add"をしてcommitとやってみます。

C:\git>cd project
C:\git\project>rm app\models\dummy.rb
C:\git\project>git add .
C:\git\project>git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#
#       deleted:    app/models/dummy.rb
#
no changes added to commit (use "git add" and/or "git commit -a")

ふむ…Work Treeから削除された事は認識されたみたいですが、Index上のdummy.rbはまだ残っているようですね。こちらも消してからcommitしましょう。*1

C:\git\project>git rm --cached app/models/dummy.rb
C:\git\project>git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       deleted:    app/models/dummy.rb
#
C:\git\project>git commit
error: Terminal is dumb but no VISUAL nor EDITOR defined.
Please supply the message using either -m or -F option.
C:\git\project>git commit -m 'Deleted app/models/dummy.rb'
error: pathspec 'app/models/dummy.rb'' did not match any file(s) known to git.

Subversionでもそうですが、commitする時に、"-m 'comment'"と付けるとコメント付きでcommitできますが、付けなかった場合はエディタが自動的に立ち上がってコメントを編集できるようになっています。

Windows版の場合、エディタとして何が立ち上がるんだろう?」と疑問に思って試してみましたが、ちゃんと環境変数設定しろと怒られましたね。(^^; Windowsで外部エディタが使えるのかどうかはまた調べてみたいと思います。

そして、メッセージを付けてcommitした時にエラーが出てcommitできてないですね。…ちょっと考えて、シングルクォーテーションじゃダメな事に気が付きました…。Windowsコマンドプロンプトでやっているので、ダブルクォーテーションじゃないとダメですね…。再挑戦…。

C:\git\project>git commit -m "Deleted app/models/dummy.rb"
Created commit 947b2da: Deleted app/models/dummy.rb
 1 files changed, 0 insertions(+), 5 deletions(-)
 delete mode 100644 app/models/dummy.rb

今度はOKですね。

という事で、最も基本的なローカルリポジトリに対する操作について実際に試してみる事ができました。…ただ、これじゃあ、よくあるテストファイルに対する編集操作の例と全く変わらないので(^^;、次回は、もっと具体的にソースコードを使っての操作演習をやってみようかなと思います。

*1:後で調べてみたら、"git rm app\models\dummy.rb"→commitで良かったみたいですね。というか、そっちが普通なのかも…。