Androidはワンツーパンチ 三歩進んで二歩下がる

プログラミングやどうでもいい話

GIT IMMERSIONで無料でGitを学ぶ メモ3

GIT IMMERSIONで無料でGitを学ぶ メモ1
GIT IMMERSIONで無料でGitを学ぶ メモ2
に引き続きメモその3です。

続きは
GIT IMMERSIONで無料でGitを学ぶ メモ4
GIT IMMERSIONで無料でGitを学ぶ メモ5
GIT IMMERSIONで無料でGitを学ぶ メモ6
GIT IMMERSIONで無料でGitを学ぶ メモ7
GIT IMMERSIONで無料でGitを学ぶ メモ8

GIT IMMERSIONというGitのやり方を教えてくれるチュートリアルサイトを勉強しながらメモを取っています。
自分用なのであまり見やすいものではないです。

※ $ git hist コマンドはGIT IMMERSION LAB11 でコマンドエイリアスを設定しているので
hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short
の意味です。

GIT IMMERSION LAB23

Gitの内部:GITのオブジェクトを直接操作
objectの記録の構造について学ぼう。

直接gitのリポジトリのオブジェクトをSHA1ハッシュを使って
調べてみよう。

【最新のコミットを見つける】
$ lgit hist --max-count=1
これで表示されるのは最新のコミットだ。頭の7桁の文字がSHA1
ハッシュ値だ。

最新のコミットを出力してみよう
$ git cat-file -t
$ git cat-file -p

実行結果はこんなイメージだ。
$ git cat-file -t 76ba0a7
commit
$ git cat-file -p 76ba0a7
tree 096b74c56bfc6b40e754fc0725b8c70b2038b91e
parent b8f15c35ac4e42485773fec06e7155203a16c986
author Jim Weirich 1331068328 -0500
committer Jim Weirich 1331068328 -0500

Added a Rakefile.

これはmasterブランチの先頭にあるコミットオブジェクトのダンプだ。

【ツリーを見つける】
コミットの中で参照されているツリーを直接ダンプしよう。
先ほど表示した中の"tree"の行からSHA1ハッシュを使用して次のように実行してみよう。
$ git cat-file -p

実行結果はこんなイメージだ。
$ git cat-file -p 096b74c
100644 blob 28e0e9d6ea7e25f35ec64a43f569b550e8386f90 Rakefile
040000 tree e46f374f5b36c6f02fb3e9e922b79044f754d795 lib

◯libディレクトリをダンプする。

$ git cat-file -p

実行結果はこんなイメージだ。
$ git cat-file -p e46f374
100644 blob c45f26b6fdc7db6ba779fc4c385d9d24fc12cf72 hello.rb

hello.rbが表示されたね。

◯hello.rbをダンプする。

$ git cat-file -p

上のhello.rbの行のハッシュ値でダンプすると、
実行結果はこんなイメージだ。
$ git cat-file -p c45f26b
# Default is World
# Author: Jim Weirich (jim@somewhere.com)
name = ARGV.first || "World"

puts "Hello, #{name}!"

以上。gitリポジトリから直接コミットオブジェクト、ツリーオブジェクトおよびBlobオブジェクトをダンプした。 blob、tree、commit、これで全てということだ。

あなたのリポジトリの最古のコミットをハッシュ値を使って手動でたどってファイルまで辿り着けるかやってみよう。

GIT IMMERSION LAB24

ブランチを作る。

hello world に大きな仕様変更が発生した。修正には時間がかかるかもしれないからmasterの変更から独立したブランチに修正をいれたいと思うだろう。

【ブランチを作る】
新しいブランチを「greet」と呼ぶことにしよう。

$ git checkout -b greet
$ git status
NOTE:git checkout -b は git branch のショートカットに続けてgit checkout を実行するというショートカット。

git status を見ると今greet ブランチにいることがわかるだろう。

【greetブランチに変更を加える】
Greeterクラスを新しく作ってみよう。
lib/greeter.rbというファイルを作り、以下のように編集しよう。

                                          • -

class Greeter
def initialize(who)
@who = who
end
def greet
"Hello, #{@who}"
end
end

                                          • -

実行してみよう
$ git add lib/greeter.rb
$ git commit -m "Added greeter class"

メインプログラムを修正してみよう
hello.rbを変更してgreeter.rbを使うようにしてみよう。
lib/hello.rbを以下のように編集しよう。

                                          • -

require 'greeter'

# Default is World
name = ARGV.first || "World"

greeter = Greeter.new(name)
puts greeter.greet

                                          • -

実行してみよう
$ git add lib/hello.rb
$ git commit -m "Hello uses Greeter"

Rakefileを修正してみよう
Rakefileを修正して外部のrubyプロセスを使用するようにしよう。
Rakefileを以下のように編集しよう。

                                          • -

#!/usr/bin/ruby -wKU

task :default => :run

task :run do
ruby '-Ilib', 'lib/hello.rb'
end

                                          • -

実行してみよう
$ git add Rakefile
$ git commit -m "Updated Rakefile"


今回新しい greet ブランチに3つのコミットをした。
次回はブランチ間の移動と切り替えを学ぼう。

GIT IMMERSION LAB25

ブランチを移動する。

今プロジェクトに2つのブランチがある(LAB24の操作により)
$ git hist --all

実行結果は以下のようなイメージだ。

                                          • -

* e2257cb 2012-03-06 | Updated Rakefile (HEAD, greet) [Jim Weirich]
* a93f079 2012-03-06 | Hello uses Greeter [Jim Weirich]
* 4b9457a 2012-03-06 | Added greeter class [Jim Weirich]
* 76ba0a7 2012-03-06 | Added a Rakefile. (master) [Jim Weirich]
* b8f15c3 2012-03-06 | Moved hello.rb to lib [Jim Weirich]
* 9c78ad8 2012-03-06 | Add an author/email comment [Jim Weirich]
* 4054321 2012-03-06 | Added a comment (v1) [Jim Weirich]
* 1b754e9 2012-03-06 | Added a default value (v1-beta) [Jim Weirich]
* 3053491 2012-03-06 | Using ARGV [Jim Weirich]
* 3cbf83b 2012-03-06 | First Commit [Jim Weirich]

                                          • -

【masterブランチに切り替える】
git checkout コマンドを使うだけでブランチ間の移動ができる。

$ git checkout master
$ cat lib/hello.rb

実行結果は以下のようなイメージだ。

                                          • -

$ git checkout master
Switched to branch 'master'
$ cat lib/hello.rb
# Default is World
# Author: Jim Weirich (jim@somewhere.com)
name = ARGV.first || "World"

puts "Hello, #{name}!"

                                          • -

hello.rbを表示させるとGreeterクラスを使用していないね。
つまりmasterブランチにいるということだ。

【greetブランチに戻る】

$ git checkout greet
$ cat lib/hello.rb

実行結果は以下のようなイメージだ。

                                          • -

$ git checkout greet
Switched to branch 'greet'
$ cat lib/hello.rb
require 'greeter'

# Default is World
name = ARGV.first || "World"

greeter = Greeter.new(name)
puts greeter.greet

                                          • -

hello.rbの中を確認するとちゃんとgreetブランチに戻っていることがわかる。

GIT IMMERSION LAB26

masterブランチを変更する。
複数のブランチが違う変更をしていった場合の扱い方について学ぼう。

greet ブランチを変更している裏でmaster ブランチを誰かが変更した。彼らは” README”を追加した。

◯masterブランチに切り替える
$ git checkout master
◯ READMEファイルを作成する
以下のように編集しよう。

                                          • -

This is the Hello World example from the git tutorial.

                                          • -

◯masterブランチにREADMEをコミットする
$ git add README
$ git commit -m "Added README"

GIT IMMERSION LAB27

分岐したブランチを表示する。

リポジトリに2つの分岐したブランチがある。log コマンドを使用してブランチとどのように分岐しているかを見よう。

$ git hist --all

実行結果は以下のようなイメージだ。

                                          • -

$ git hist --all
* e2257cb 2012-03-06 | Updated Rakefile (greet) [Jim Weirich]
* a93f079 2012-03-06 | Hello uses Greeter [Jim Weirich]
* 4b9457a 2012-03-06 | Added greeter class [Jim Weirich]
| * 3ce0095 2012-03-06 | Added README (HEAD, master) [Jim Weirich]
|/
* 76ba0a7 2012-03-06 | Added a Rakefile. [Jim Weirich]
* b8f15c3 2012-03-06 | Moved hello.rb to lib [Jim Weirich]
* 9c78ad8 2012-03-06 | Add an author/email comment [Jim Weirich]
* 4054321 2012-03-06 | Added a comment (v1) [Jim Weirich]
* 1b754e9 2012-03-06 | Added a default value (v1-beta) [Jim Weirich]
* 3053491 2012-03-06 | Using ARGV [Jim Weirich]
* 3cbf83b 2012-03-06 | First Commit [Jim Weirich]

                                          • -

これは --graphオプションを git histの動作に足したものを初めて見る機会だ。
--graphオプションをgit log に加えると コミットツリーをシンプルなアスキー文字で描く。
私達は両方のブランチを見ることができる(greet masterの両方)そして、masterブランチが現在のHEADだ。両方のブランチの共通の祖先は “Added a Rakefile” だ。

--all フラグは全てのブランチを確実に見られる。デフォルトでは現在のブランチだけを表示する。