はじめに
こんにちは川崎です。最近はじめてgitを使う機会がありましたので復習してみます。
このエントリーは私がgitを使い始めたばかりのログを元にして、まとめた内容にしています。
gitをインストール、コマンドを使う準備
gitを使うにはgitのインストールが必要です。使っている環境に合わせてgitをインストールします。
私の環境はmacなのでportsでインストールしました。
$ sudo port -d selfupdate
$ sudo port install git-core +gitweb +svn
インストールが完了したかどうかはgit --versionコマンドで確認できます。
$ git --version
git version 1.7.3
gitのversionが表示されたのでインストールされているようです。準備完了です。
はじめてgitを使うときは
gitを使うために最初にリポジトリを作りました。リポジトリを作ると、gitコマンドでファイルの変更を把握追跡できるようになります。
git init リポジトリをつくる
バージョン管理をしたいディレクトリでgit initコマンドを実行するとリポジトリが作成されます。exampleというディレクトリをつくり、そこにリポジトリをつくりました。
$ mkdir example
$ cd example
$ git init
Initialized empty Git repository in example/.git/
リポジトリが作成されました。
ls -al を実行してみると.gitというディレクトリが作られています。
変更をリポジトリに記録をするには
ファイルの変更をgitのリポジトリに登録する手続きは2つあります。
- 差分をaddコマンドで記録する
- 変更をcommitする
図にしてみました。変更をaddすると記録され、記録されてからcommitする手順です。
これを実際にやってみます。
まずtest.txtという名前のファイルを作ります。
$ touch test.txt
test.txtが作られるという変更があったので、以前の状態からの差分が発生しました。
$ git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add ..." to include in what will be committed)
#
# test.txt
nothing added to commit but untracked files present (use "git add" to track)
git statusコマンドを使用するとまだcommitをしていない全ての変更が確認できます。
addコマンドで変更を記録する
それでは作ったtest.txtというファイルをaddします。
$ git add test.txt
addしたのでgit statusを実行します。
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached ..." to unstage)
#
# new file: test.txt
#
git statusの表示が変わりました。表示がUntracked filesからChanges to be committedになりました。Changes to be committedと表示されていればcommitの準備ができているという意味のようです。
commitする
準備ができたのでcommitします。commitするコマンドはgit commit -m ‘コメント’という形式です。
$ git commit -m 'test用ファイル作成'
[master d3effb5] test用ファイル作成
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.txt
commitしました。再びgit statusで確認してみます。
$ git status
# On branch master
nothing to commit (working directory clean)
こんどはcommitするものは何も無いと表示されます。
gitの流れを確認
まずリポジトリを作り、新しいファイルtest.txtを作りました。そしてtest.txtファイルをaddコマンドで記録しcommitしました。以上でgitの基本的な流れを確認できたことになっています。
gitのコマンドを使う前に
先ほど登場したリポジトリやaddコマンドによる記録、commitするという内容を振り返りながらコマンドを使っていきます。ここでgitの概念について説明したいのですが、正直なところ私がgitについて十分に理解していませんので、これらについてあまり詳しく書く自信がありません。
gitの概念に関する説明はPro Git(http://progit.org/book/ja/)にあるGitの基本(http://progit.org/book/ja/ch1-3.html)が参考になるので、こちらを見ていただければと思います。
以下のコマンドの記録にはワークツリーやインデックス、HEADという言葉が登場します。ワークツリーは作業領域、インデックスはワークツリーの変更を記録したファイル、HEADはリポジトリの最新commitを指すものとします。
gitのコマンドを使う
それではgitのコマンドをつかってみます。各コマンドには実行のイメージを画像にしてみました。画像は私が抱いているイメージなのでちょっと違うかもしれませんがご了承ください。
まずは先ほど作ったtest.txtという名前のファイルに変更を加えます。
$ echo aaa > test.txt
test.txtにaaaという文字を加える変更をおこないました。
git diff ワークツリーにあるファイルの差分を表示する
ワークツリーにあるファイルを変更したのでgit diffコマンドを使用します。
$ git diff
diff --git a/test.txt b/test.txt
index e69de29..72943a1 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+aaa
aaaという文字が加えられたと表示されました。git diffはインデックスとワークツリーの差分を知ることができます。
git diffを実行したときのイメージ図です。インデックスとワークツリー間に差がある場合のみ出力があります。
git add 変更をインデックスに記録する
ワークツリーの変更をインデックスに伝えます。git addコマンドを使います。
$ git add test.txt
なにも表示されないので、git diffコマンドで確認してみます。すると先ほどとは異なりgit diffコマンドを実行しても何も表示されません。git addコマンドによってワークツリーとインデックスの差がなくなったためです。
ワークツリーからインデックスに変更を記録するイメージです。
git diff --cached インデックスとHEADの差分を表示する
ここでcommitする前にgit diff --cachedコマンドを使います。
$ git diff --cached
diff --git a/test.txt b/test.txt
index e69de29..72943a1 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+aaa
git diff --cachedはインデックスとHEADとの差分を見ます。git addコマンドでワークツリーからインデックスにtest.txtファイルの変更が記録されたので、インデックスとHEADで差が生じています。
git diff --cachedのイメージです。インデックスとHEADに差があると出力があります。
git diff HEAD ワークツリーとHEADとの差分を表示する
さらにcommitする前にgit diff HEADコマンドを使用します。
$ git diff HEAD
diff --git a/test.txt b/test.txt
index e69de29..72943a1 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+aaa
git diff HEADコマンドはリポジトリの最新commitとワークツリーの差分を知ることができます。現在はワークツリーとインデックスが等しく、HEADと異なっているため、git diff HEADではgit diff --cachedと同じ結果を得られます。
こちらはインデックスではなく、HEADとワークツリーの差分を見られるイメージです。
git commit コミットする
それではインデックスとHEADを等しくします。git commitコマンドを使います。
$ git commit -m '文字の追加'
[master c65671a] 文字の追加
1 files changed, 1 insertions(+), 0 deletions(-)
commitされました。先ほどのgit diff --cachedやgit diff HEADを試してみます。今度はワークツリーとインデックスとHEADの差分がなくなったため何も表示されないです。
コミットされるとインデックスから最新のHEADが書き換えられるイメージです。
変更を取り消す
addコマンドやcommitコマンドを覚え、ホイホイaddやcommitをしていると、実行したコマンドを戻したくなることがあります。そんな変更を取り消すコマンドをみてみます。
git reset --soft HEAD^ 最新のcommitを捨てる
commitを取り消すにはgit reset --soft HEAD^です。
$ git reset --soft HEAD^
git reset --soft HEAD^を実行するとHEADの最新commit結果だけが取り消されました。git diffとgit diff --cachedをを実行するとcommit前の状態にもどっていることを確認できます。
コミットを捨てるイメージです。
HEADやHEAD^とありますが、HEADが現在の状態で、HEAD^はHEADの親を指すみたいです。
git reset HEAD インデックスから外す
つぎはaddコマンドによるインデックスへの記録を取り消します。
$ git reset HEAD test.txt
Unstaged changes after reset:
M test.txt
インデックスへのtest.txtファイルの記録を取り消しました。commit予定のファイルをインデックスから外したともいえるかもしれないです。
ここでgit diffを実行するとワークツリーとインデックスが異なっている状態を見ることができました。
インデックスからaddされた差分を外すイメージです。
git checkout HEAD ワークツリーにリポジトリの最新commitを反映する
こんどは最初に行った変更、test.txtファイルへの文字の書き込みを消します。
$ git checkout HEAD test.txt
git checkout HEADはHEADにある内容をワークツリーに反映するコマンドみたいです。現在リポジトリに登録されているtest.txtの中身は空なので、リポジトリで上書きされたワークツリーのtest.txtの中身も空になります。cat test.txtを実行すると中身が空のtest.txtを確認できました。
HEADの内容をワークツリーに反映するイメージです。
git checkout ワークツリーにインデックスの状態を反映する
ワークツリーを変更したものの、addする前にワークツリーの変更を捨てたい場合は、インデックスの状態をワークツリーに反映させることもできます。この場合はgit checkoutコマンドを使います。
$ git checkout ファイル名
checkoutコマンドにHEADをつけない場合はワークツリーがインデックスと同じ状態に戻ります。
おわりに
このエントリーではgitでリポジトリを作り、ファイルを変更して変更をインデックスに反映してcommitをしました。そしてHEADとインデックスとワークツリーの関係を見ながらファイルをもとの状態に戻すという作業をコマンドごとに振り返ってみました。
このエントリーを書く前は、コマンドごとに画像をつけてあげればgitコマンドがわかりやすくなるかもしれないと考えたのですが、冴えたイメージになりませんでした。もっとgitをちゃんと理解してくると良いイメージが作れるようになるのかもしれません。
最後に参考にした本などをご紹介します。このエントリーでは曖昧な点や触れていない点がありますので、ぜひこちらのサイトや書籍などをみていただければと思います。
参考
Pro Git(http://progit.org/book/ja/)
入門Git(http://www.amazon.co.jp/dp/4798023809/?tag=kray07-22)
WEB+DB PRESS Vol.50(http://www.amazon.co.jp/gp/product/477413838X/?tag=kray07-22)
このエントリーに対するコメント
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
-
- git導入まとめ | のぶろぐ2011/02/08, 10:57 PM
[…] Git コマンドメモ – それはBlog https://kray.jp/blog/review-git-commands/ かWiki – […]
-
- アインシュタインの電話番号☎2011/02/09, 9:15 AM
[ruby]Herokuを使って1日1回名言をツイートするTwitter Botの作り方
ここ最近、Google App EngineやHerokuを使ってTwitter Botを作ろうと、いろいろ実験していた。以下はその関連記事。 Google App EngineのJRubyでSinatraを使ってHello worldする RubyでTwitterのOAuth認証に必要な…
-
- 【GitHub初心者用備忘録】最低限知っておくべきコマンド2016/10/09, 4:54 PM
[…] KRAY Inc はじめてgitをつかったのでコマンドを復習しますhttps://kray.jp/blog/review-git-commands/こんにちは川崎です。最近はじめてgitを使う機会がありましたので復習してみます。 gi […]
「いいね!」で応援よろしくお願いします!