ちなみに

火曜日の空は僕を押しつぶした。

Git入門(ちょっとすすんだつかいかた編)

前回に引き続きGitの使い方を。'すすんだつかいかた'と書いていますが、そんなに高度なことはしていません。'さいしょのいっぽ'よりかは進んだ使い方だと解釈してください。

差分を取る

では、greet.rbを変更していきます。'Hi, git!'を'Hello, git!'に変更したとします。'git status'ではmodifiedとなります。
変更を'.git/index'に反映するには'git add greet.rb'とします。
プロジェクトのHEAD*1との差分を取るには'git diff'を使います。

$ git diff --cached
diff --git a/greet.rb b/greet.rb
index 5f73eff..933f909 100644
--- a/greet.rb
+++ b/greet.rb
@@ -1,2 +1,2 @@
 
-puts 'Hi, git!'
+puts 'Hello, git!'

'-'は削除した部分'+'は追加した部分と、見たまんまの意味です。

今回は'--cached'オプションをつけているので'.git/inde'との差分を取ってますが、オプションをつけなければワーキングディレクトリ*2との差分を取ります。

変更をコミットしておきましょう。

$ git commit -a -m 'HiをHelloに変更'
Created commit 4bc394d: HiをHelloに変更
 1 files changed, 1 insertions(+), 1 deletions(-)

今回はコミットメッセージに日本語を使用してみました。

コミットログを見る

'git log'コマンドで見ることができます。

$ git log
(ページャが起動して)
commit 4bc394d85ff2b3cda654b92f42ce2bf93d8ff665
Author: your name <you@example.com>
Date:   Wed May 14 21:50:40 2008 +0900

    HiをHelloに変更

commit db58434795394232ddf5ed09416c619647ef21f8
Author: your name <you@example.com>
Date:   Wed May 14 21:25:51 2008 +0900

    initial commit

上から、SHA1ハッシュ値*3、コミットした人、タイムスタンプ、コミットメッセージとなっています。'git log'では'--pretty'オプションで書式を細かく指定できるのですが、それを省いたデフォルトでは'--pretty=medium'を指定したことになっています。'--preytty'で指定できる書式については'man git-log'で確認してください。

以前のファイルの状態を見る

以前のコミット時のファイルの状態をみるには'git show'を使います。どのコミットかを指定するにはタグかSHA1ハッシュ値を用います。今回はタグをつけていないので先ほどの'git log'で得られたSHA1ハッシュ値を用います。こんなに長いの覚えられないですね。というわけでSHA1ハッシュ値は省略してもいいことになっています。つまり'db58434795394232ddf5ed09416c619647ef21f8'は'db58434'でOKだと言うわけです。

$ git show db58434:greet.rb
(ページャが起動して)

puts 'Hi, git!'

変更前の内容が得られました。ファイルの指定は'SHA1ハッシュ値:ファイルのパス'という風に':'で区切って行います。ファイルを指定しなかったり、':'を使わなければ*4結果はdiff形式で表示されます。

以前のコミットをチェックアウトする

では、ワーキングディレクトリ内の内容を以前のコミット時に戻すにはどうすればいいでしょうか。答えは'git checkout'を用いる方法です。
'git checkout'にSHA1ハッシュ値かタグを指定することでそのコミット時の状態を取り出せます(チェックアウト)。ファイルを指定することも可能です。

$ git checkout db58434 greet.rb
$ cat greet.rb

puts 'Hi, git!'

操作を取り消す

さきほど最初のコミット時のgreet.rbをチェックアウトしましたが、もしこれを止めたくなった場合は、コミット前であれば以下の様にして取り消すことができます。

$ git reset --hard HEAD
HEAD is now at 4bc394d HiをHelloに変更
$ cat greet.rb

puts 'Hello, git!'

もしコミット後であれば2種類の方法があります。

  • 修正をしたものを改めてコミットする
  • 履歴を修正してなかったことにする

しかし、一度公開してしまった場合は改めてコミットしなおさなければ混乱を招きますし。gitは履歴が変更されることを想定していないので不都合が生じてしますため二つ目の方法は推奨されません。よってここでは割愛します。

改めてコミットしなおすのは面倒なのですが、ありがたいことにgitにはそれはしてくれる機能があります。

$ git revert HEAD

エディタが開いてコミットメッセージの入力が促されますが、既にRevertしたことを示すメッセージが入力されているのでそのままコミットすることも出来ます。

再び分割します。次はタグやブランチについて。


>>Git入門(たぐとかぶらんち編) - チナミニ

*1:現在のBranchの先頭

*2:作業中のディレクトリ。つまり今回addしてないファイルとの差分もとる

*3:コミット時のオブジェクトから得られたSHA1ハッシュの値。Subversionにおけるリビジョン相当

*4:git show db58434 greet.rb