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

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

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

GIT IMMERSIONで無料でGitを学ぶ メモ1
GIT IMMERSIONで無料でGitを学ぶ メモ2
GIT IMMERSIONで無料でGitを学ぶ メモ3
GIT IMMERSIONで無料でGitを学ぶ メモ4
に引き続きメモその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 go コマンドは同じくエイリアスを設定しているので、
go='git checkout '
の意味です。

GIT IMMERSION LAB33

masterブランチをリセット

衝突が起きたコミットの前の時点までmasterブランチをリセットする。
masterブランチにインタラクティブモードを追加したとき(LAB29)、greetブランチへの更新箇所が競合してしまった。この変更をする前にmasterブランチを巻き戻ししよう。これで衝突について心配せずにrebaseコマンドを実証できる。

実行してみよう
$ git checkout master
$ git hist

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

                                          • -

$ git hist
* 6b6beca 2012-03-06 | Made interactive (HEAD, master) [Jim Weirich]
* 3ce0095 2012-03-06 | Added README [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]

                                          • -

‘Added README’コミットが衝突の直前だね。このコミットまでリセットする。

実行してみよう。
$ git reset --hard
ここで入れるハッシュ値は上の例だと'76ba0a7'となる。
$ 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]

                                          • -

GIT IMMERSION LAB34

REBASING

mergeコマンドではなく、rebaseコマンドを使用してみよう。
現在までのレッスンでmasterブランチとgreetブランチの最初のマージ前の時点に戻っている。そしてgreetブランチにマスターの変更を取り入れたい。

実行してみよう
$ git checkout greet
$ git rebase master
$ git hist

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

                                          • -

$ go greet
Switched to branch 'greet'
$
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added Greeter class
Applying: hello uses Greeter
Applying: updated Rakefile
$
$ git hist
* e1399d1 2012-03-06 | Updated Rakefile (HEAD, greet) [Jim Weirich]
* 183c6ad 2012-03-06 | Hello uses Greeter [Jim Weirich]
* 297678c 2012-03-06 | Added greeter class [Jim Weirich]
* 3ce0095 2012-03-06 | Added README (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]

                                          • -

1:Merge VS Rebase

rebaseの最終結果は、mergeと非常によく似ている。greetブランチは現在、masterブランチからのすべての変更はもちろんのことすべての変更が含まれている。しかし、コミットツリーは全く異なっている。greetブランチのコミットツリーはmasterブランチがコミットの履歴の一部となるように書き直された。おかげでコミットのチェーンが線状となり読みやすい。

2:rebaseすべき時とmergeすべき時

こんな時はrebaseを使わないで
ブランチを公開しており他のユーザーと共有している場合コミットツリーを書き換えてしまうと他のメンバーに迷惑をかけるかもしれない。
正確なコミットブランチの履歴は重要だ(リベースはコミット履歴を書き換える)。

上記を考慮して、rebaseは短い間のローカルブランチに使用して、パブリックリポジトリのブランチに対してはmergeを使用する使い方がよいだろう。

GIT IMMERSION LAB35

マスターにマージ

greetブランチを(rebaseコマンドにより)masterブランチと共に最新に保ってきた。

今度はmasterブランチに戻って greetブランチの変更をマージしてみよう。

01:masterブランチにgreetブランチをマージ

実行してみよう
$ git checkout master
$ git merge greet

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

                                          • -

$ git checkout master
Switched to branch 'master'
$
$ git merge greet
Updating 3ce0095..e1399d1
Fast-forward
Rakefile | 2 +-
lib/greeter.rb | 8 ++++++++
lib/hello.rb | 6 ++++--
3 files changed, 13 insertions(+), 3 deletions(-)
create mode 100644 lib/greeter.rb

                                          • -

masterのheadがgreetのhead直接の祖先であるため、gitは早送りマージを行うことができる。早送りの時、ブランチのポインタは単純にgreetブランチと同じコミットを指すように前方に移動される。

早送りマージで衝突が発生することは決してない。

02:ログ確認

実行してみよう
$ git hist

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

                                          • -

$ git hist
* e1399d1 2012-03-06 | Updated Rakefile (HEAD, master, greet) [Jim Weirich]
* 183c6ad 2012-03-06 | Hello uses Greeter [Jim Weirich]
* 297678c 2012-03-06 | Added greeter class [Jim Weirich]
* 3ce0095 2012-03-06 | Added README [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]

                                          • -

greetとmasterブランチは現在全く同じである。

GIT IMMERSION LAB36

複数リポジトリ

ここまで我々は単一のgitリポジトリに対して作業をしてきた。しかしgitは複数リポジトリでの作業に優れている。それら複数リポジトリは、ローカルに格納されているかもしれないし、ネットワーク接続を介してアクセスされるかもしれない。

次のセクションは、 "cloned_hello"と呼ばれる新しいリポジトリを作成する。あるリポジトリから別のリポジトリに変更を反映する方法と、2つのリポジトリ間で競合が発生したときに処理する方法を示したいと思う。

今のところ、我々はローカルのリポジトリ(すなわちリポジトリはローカルのハードディスクに保存されている)を使用して作業するが、このセクションで学んだことのほとんどは、それらがローカルにせよネットワークを介してリモートに格納されているにせよ、複数リポジトリに適用される。

注:これからリポジトリの両方のコピーに変更を加えることが予定されている。あなたは、次のラボの各段階で自分がどのリポジトリに対して作業しているか注意を払ってほしい。

GIT IMMERSION LAB37

リポジトリをcloneする

リポジトリのコピーを作る方法を学んでみよう。

01:作業ディレクトリに移動する
実行してみよう
$ cd ..
$ pwd
$ ls

注意!現在作業ディレクトリにいる

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

                                          • -

$ cd ..
$ pwd
/Users/jerrynummi/Projects/edgecase/git_immersion/auto
$ ls
hello

                                          • -

あなたは現段階で「作業」ディレクトリにいる。ここには"hello"という名前の一つのリポジトリがあるはずだ。

02:helloリポジトリのクローンを作成する
実行してみよう
$ git clone hello cloned_hello
$ ls

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

                                          • -

$ git clone hello cloned_hello
Cloning into 'cloned_hello'...
done.
$ ls
cloned_hello
hello

                                          • -

オリジナルのhelloリポジトリと新しくクローンされたcloned_helloリポジトリの2つのリポジトリがあるはずだ。