Gitの記録
前回のギトギット! (♪♪)
- ファイル four.txt を作った!
- 前々回と同じように git add && git commit した!
- ファイル four.txt を編集した!
- git status したら、ファイルが変更されていることが分かった!
- git diff したら、ファイルがどのように変更されているか分かった!
- git add と git commit をしたら、ファイルの変更を git に記録できた!
- git checkout したら、前のバージョンのファイルを取り出せた!
読者のみなさんの「Git力」はかなり高まってきましたよ。 なぜなら、git を使うのは、基本的に次の2つの繰り返しだからです。
- ファイルを作ったり、消したり、編集したりする。
- git add と git commit を使い、変更を記録する。
この繰り返しの果てには、何回もの変更を記録した git ができあがるのです。 あ、この「git ができあがる」って言葉、なんかおかしいですね。ちょっと解説します。
Git には知っておきたい概念やキーワードがたくさんあるのですが、それらをいっぺんに覚えるのは読者のみなさんも大変でしょうから、本稿では毎回、少しずつ覚えてもらうことにします。 今回覚えてほしいのは リポジトリ(repository) という言葉です。これは、やや不正確ですが、「git によって変更が記録されているディレクトリ」のことだと思ってだいたい合っているでしょう。
この言葉を使って、先ほどの文章を言い直します。
ファイルの変更と git commit の繰り返しの果てには、何回もの変更を記録した リポジトリ ができあがるのです。
ちなみに、この世には4万回以上も git commit がなされたリポジトリが存在します。まあ、Git 自身がそうなのですが。
さて、今回の git の勉強のために、変更記録をたくさんもつリポジトリを作ります。
手作業で何回もファイルを編集したり git commit コマンドを実行したりするのは大変でしょうから、「ファイルの変更と git commit」を自動的に繰り返すスクリプトを用意しました。
好きな場所に新しいフォルダを作って、そこで「Git Bash Here」から bash の画面を開き、以下のコマンドを実行してください。今回はコピー&ペーストをしやすいように、 $
は抜いてあります。
git init
echo "ファイル作成!" > five.txt
for i in `seq 1 7`
do
echo "$i 行目!" >> five.txt
git add five.txt
git commit -m "$i 回目の更新"
done
ちょっとスクリプトについて簡単に解説します。 まず最初の git init と echo は前回までに何回もやりましたね。.git フォルダを作って、ファイル five.txt を作るだけです。 その次の:
for i in `seq 1 7`
do
...
done
これは、HSPでいうところの repeat
loop
文のようなもので、 do
から done
までの間の「...」を 7 回繰り返します。
では、その内側も見てみましょう。
echo "$i 行目!" >> five.txt
git add five.txt
git commit -m "$i 回目の更新"
1行目の echo も、前回やりました。five.txt の最後に、行を1つ書き加える、というものです。
ここで、$i
がありますが、これはHSPでいうところの cnt
みたいなものです。文字列のなかに書いてありますが、ちゃんと変数として扱われて、 $i
の部分はループごとに 1, 2, 3, ..., 7 になります。
2行目、 git add five.txt
は前々回、前回と同様です。これは git commit
の前に必要なのです。
3行目、おなじみの git commit
ですが、今回はなにやらくっついています。
この -m "コミットメッセージ"
をつけておくと、ここに書いた文字列がコミットメッセージになるのです。
(そのため、エディタを開いてコミットメッセージを入力する、という手順が不要になります。)
と、いうところですね。要するに、ファイルの変更と git commit の繰り返しを7回やった、ということです。 これにより、ファイル five.txt は7つのバージョンを持っています。
- 1回目の更新の後のバージョン
- 2回目の更新の後のバージョン
- (中略)
- 7回目の更新の後のバージョン (←いまここ!)
序文でいったとおり、git はこれら すべてのバージョンを記録しています 。(リポジトリに記録されている、と言い直してもいいでしょう。)
今回のテーマは、古いバージョンをみていくことです。 古いバージョンを見るコマンドはいくつかありますが、まずは git log を使います。
$ git log --oneline
--oneline
をつけておくと、結果は1つのバージョンにつき1行になり、以下のように表示されます:
$ git log --oneline
3456001 7 回目の更新
1720f58 6 回目の更新
99bd126 5 回目の更新
96a691b 4 回目の更新
3a7f2d9 3 回目の更新
70e529a 2 回目の更新
dfb29ca 1 回目の更新
※この後 $
が表示されず、何も入力できない状態になった場合は、 q
を押してください。
※おそらく上に書いたハッシュ値と、みなさんの画面に表示されるハッシュ値は違う文字列になっていると思いますが、そうなるのが正しいので、安心してください。
7回更新されたことが分かりますね。上が新しいもので、下が古いものです。
右側にあるのはコミットメッセージの1行目、というのはいままでの説明から分かるかと思います。 そして、今回重要なのは、左側の7桁の英数字です。これを ハッシュ値 といいます。(意味はいつか説明するでしょうが、いまではないです。)
さて、バージョンが7つあることは分かりました。 具体的に、各バージョンがどうなっているかを見ていきましょう。 そのためには、git show コマンドが便利です。
以下のコマンドを実行してみてほしいのですが、ハッシュ値 3456001
の部分には、先ほどの git log --oneline
コマンドの1行目に表示されたハッシュ値をコピー&ペーストしてください。
$ git show 3456001
すると、結果は以下のようになります:
$ git show 3456001
commit 34560012430840446efb1a231b07fffa8950943d
Author: vain0 <[email protected]>
Date: Fri Mar 18 16:45:06 2016 +0900
7 回目の更新
diff --git a/five.txt b/five.txt
index e0cea92..38b02b4 100644
--- a/five.txt
+++ b/five.txt
@@ -5,3 +5,4 @@
4 行目!
5 行目!
6 行目!
+7 行目!
おいおい英語かよ、という気が一瞬するかもしれませんが、よく見ると英文はありません。 解説を補ってみます。
$ git show 3456001
commit 34560012430840446efb1a231b07fffa8950943d
[↑ハッシュ値の40桁バージョン]
Author: vain0 <[email protected]>
[↑この変更を git commit した人のユーザ名とメアド]
Date: Fri Mar 18 16:45:06 2016 +0900
[↑この変更が git commit された日時 (2016年3月18日金曜日、16時45分6秒、(日本時間))]
7 回目の更新
[↑コミットメッセージ (いまは1行しかありませんが、git show では全行表示されます)]
[↓この変更の差分 (git diff の結果)]
diff --git a/five.txt b/five.txt
index e0cea92..38b02b4 100644
[ 変更されたファイルは five.txt という名前。]
[↓ファイルの名前は変更前後で変わっていない。]
--- a/five.txt
+++ b/five.txt
@@ -5,3 +5,4 @@
4 行目!
5 行目!
6 行目!
+7 行目!
[↑ 7行目が追加された]
いかがでしょうか。長い出力でしたが、こうして解説を補ってみると、分かりやすいのではないでしょうか? (解説のない部分は、どうでもいい部分です。)
※ちなみに「ハッシュ値の40桁バージョン」と書きましたが、本来ハッシュ値は40桁であり、 git log の出力で7桁だったのは、単に後半の33桁が省略されていただけです。
最後に、前回の最後のコマンドにあった HEAD~
を説明しましょう。
これは正確に説明しようとすると難しいのですが、平たく行けば単純です。
HEAD
とは「最後に git commit された変更」を表しているものです。 (※不正確です)HEAD~
とは、「HEAD の1つ前に git commit された変更」すなわち「HEAD の1つ前のバージョン」を表しています。(※不正確です)- 同様に
HEAD~~
は「HEAD の1つ前の1つ前」すなわち「HEAD の2つ前のバージョン」を表しています。 ~
を何回も書きたくない場合は、「HEAD~5」などと書いて「HEAD の5つ前のバージョン」を表すこともできます。(※不正確です)
では少し試してみましょう。
いまは「7つ目の更新の後のバージョン」なので、その5つ前は?
引き算して、 7 - 5 = 2
ですね。
$ git show HEAD~5
commit 70e529af260f9f3be271dc04b97f08456455882c
Author: vain0 <[email protected]>
Date: Fri Mar 18 16:45:05 2016 +0900
2 回目の更新
diff --git a/five.txt b/five.txt
index 5f4356b..c3d18bc 100644
--- a/five.txt
+++ b/five.txt
@@ -1,2 +1,3 @@
ファイル作成!
1 行目!
+2 行目!
実際に「2回目の更新」(5つ前のバージョン)の具体的な内容を知ることができました。
以上でみなさんは、
- 変更を記録する。
- 変更を閲覧する。
ことが自在にできるようになりました。 もう、いっぱしの git 使いといえるのではないでしょうか。
次回は一旦 git から離れて、git をバックアップツールのすごいやつとして使う方法を解説します。