第43回 覚えておきたいGitのコマンド

覚えておきたいGitのコマンド

自分がやりたいことができるコマンドを必死に探したので、ここに示す。

前提

今回の記事の前提を、以下のようにします
「1人でローカルな環境でのみ使う。ブランチは切らない」

コマンドを試す前の下準備

コマンドを試す前に、gitで管理するプロジェクトを作ろう。

$ mkdir training
$ cd training/

リポジトリの作成と1stコミット

trainingというディレクトリを作って移動したところで、
リポジトリを作ろう。 a.txt n.txt という2つのファイルを作って、コミットまでやります。

$ git init
$ vi a.txt
$ vi n.txt

それぞれの内容は以下の通り、

$ cat a.txt 
AAAAA
$ cat n.txt 
11111

単に、AAAAAと11111という1行が書かれただけのファイルです。


コミットします。

$ git add a.txt 
$ git add n.txt
$ git commit -m "1st commit"

ファイルに変更を行なって2ndコミット

次に2回目のコミットを行なうために、a.txtを書き換えコミットします。

$ vi a.txt 
$ git add a.txt 
$ git commit -m "2nd commit"

あっと、a.txtの内容は BBBBB と Aが5つだったところをBを5つに変えました。

さらにファイルに変更を行って3rdコミット

今度はn.txtの内容を変えて、

$ vi n.txt 
$ git add n.txt 
$ git commit -m "3rd commit"

あっと b.txtの内容は 2222222222 と 1が5だったところを2を10個に変えました。

git log でログの表示

ここでgit logでログを表示してみましょう。

$ git log
commit efe1f74d0c211bf854d8e08257f5a3d24a949c3c
Author: bi_na <email address>
Date:   Mon Sep 13 22:34:03 2010 +0900

    3rd commit

commit 7030ca1a667b088517de9a31fdeb7f1389a21397
Author: bi_na <email address>
Date:   Mon Sep 13 22:31:08 2010 +0900

    2nd commit

commit d3184855f5a16f583df2a24045683f58953b1f3c
Author: bi_na <email address>
Date:   Mon Sep 13 22:28:43 2010 +0900

    1st commit

emailが表示されるところはスパムがくるとヤなので、email addressと置換してます。
これが標準のログ出力ですがフォーマットを色々いじれます。

$ git log --pretty=oneline
efe1f74d0c211bf854d8e08257f5a3d24a949c3c 3rd commit
7030ca1a667b088517de9a31fdeb7f1389a21397 2nd commit
d3184855f5a16f583df2a24045683f58953b1f3c 1st commit

これは

コミットを一意に決めるハッシュ値 コミット時のメッセージ

という書式で表示してくれます。


自分でフォーマットを指定するなら、

$ git log --pretty=format:"%H | %ci"
efe1f74d0c211bf854d8e08257f5a3d24a949c3c | 2010-09-13 22:34:03 +0900
7030ca1a667b088517de9a31fdeb7f1389a21397 | 2010-09-13 22:31:08 +0900
d3184855f5a16f583df2a24045683f58953b1f3c | 2010-09-13 22:28:43 +0900

こんな感じでできます。

-pは直前のコミットとのdiffを表示

-pを付けると、直前のコミットとのdiffを表示してくれます。

$ git log -p
commit efe1f74d0c211bf854d8e08257f5a3d24a949c3c
Author: bi_na <binagitmail@gmail.com>
Date:   Mon Sep 13 22:34:03 2010 +0900

    3rd commit

diff --git a/n.txt b/n.txt
index f7c6dd0..b23625e 100644
--- a/n.txt
+++ b/n.txt
@@ -1 +1 @@
-11111
+2222222222

.. 以下略


さっきの自前のフォーマットとの合わせ技も可能

$ git log --pretty=format:"%H | %ci" -p
efe1f74d0c211bf854d8e08257f5a3d24a949c3c | 2010-09-13 22:34:03 +0900
diff --git a/n.txt b/n.txt
index f7c6dd0..b23625e 100644
--- a/n.txt
+++ b/n.txt
@@ -1 +1 @@
-11111
+2222222222

.. 以下略

--graphが個人的にお気に入り

--graphを使うと アスキーアートでグラフを表示してくれます。
これはブランチを切ったときなどには使うようですが、ブランチを切っていなくても、
前に*などが表示されるため、ちょっと読みやすくなります(あくまで個人的意見)

$ git log --graph
* commit efe1f74d0c211bf854d8e08257f5a3d24a949c3c
| Author: bi_na <email address>
| Date:   Mon Sep 13 22:34:03 2010 +0900
| 
|     3rd commit
|  
* commit 7030ca1a667b088517de9a31fdeb7f1389a21397
| Author: bi_na <email address>
| Date:   Mon Sep 13 22:31:08 2010 +0900
| 
|     2nd commit
|  
* commit d3184855f5a16f583df2a24045683f58953b1f3c
  Author: bi_na <email address>
  Date:   Mon Sep 13 22:28:43 2010 +0900
  
      1st commit

前のリビジョン(バージョン)のソースを取り出す

前のリビジョンのソースを取り出してみたいと思います。


まず、取り出す前に、ソースの確認をしてみましょう。
次のコマンドで1回目のコミットで a.txt と n.txtが加わっているのがわかります。

$ git log --name-status
commit efe1f74d0c211bf854d8e08257f5a3d24a949c3c
Author: bi_na <email address>
Date:   Mon Sep 13 22:34:03 2010 +0900

    3rd commit

M       n.txt

commit 7030ca1a667b088517de9a31fdeb7f1389a21397
Author: bi_na <email address>
Date:   Mon Sep 13 22:31:08 2010 +0900

    2nd commit

M       a.txt

commit d3184855f5a16f583df2a24045683f58953b1f3c
Author: bi_na <email address>
Date:   Mon Sep 13 22:28:43 2010 +0900

    1st commit

A       a.txt
A       n.txt

それでは1回目のコミットでのa.txtの内容を確認してましょう。

$ git show d3184855f5a16f583df2a24045683f58953b1f3c:a.txt
AAAAA

ほら! 見ることができました!
書式は以下の通り。

$ git show コミットを一意に決めるハッシュ値:ファイル名


これでもファイルの中身が見れたので、いいんですけど、ファイル自体を取り出すには、
git checkout
を使います。

git checkoutはブランチを切り替えるといきによく使われるようですが、
パス名が与えられた場合はまったく違う動作をするようです。

ここ重要ですね、パス名が与えられた場合はブランチの切り替えではない動作!!

$ git checkout d3184855f5a16f583df2a24045683f58953b1f3c a.txt

showのときと書式が微妙に違うのですが、これで取り出せるようです。
何も言われず、いきなり置き換わっちゃうのがドキドキものですが、とりだすことはできたみたいです。


参考:
Git ユーザマニュアル (バージョン 1.5.3 以降用)
git log から作業日報を捻出する - Hello, world! - s21g
Subversion ユーザーが Git を使ってみた (基本操作編) - まちゅダイアリー(2010-05-06)
http://progit.org/book/ja/ch2-3.html
git log - Webtech Walker