風のGitを聴け


「完全なgitなどというものは存在しない
　完全な絶望が存在しないようにね」

##gitはじめる

gitをはじめるにはたったこれだけでいい。羊の皮を剥ぐよりもずっと簡単だ。

```
$ mkdir app
$ cd app
$ git init
Initialized empty Git repository in /Users/yutaka/tmp/app/.git/
```
`git init`：gitレポジトリ作成

***git理解度２０％***

##レポジトリにファイルを加える

**レポジトリっていうのはファイル管理帳みたいなものだ。**
レポジトリにファイルを加えるとgitがそのファイルの変更を管理してくれるようになる。

```
$ echo 'やれやれ' > test.txt
$ git add test.txt
```

`git add`：gitレポジトリにファイル加える
`git add app.rb config.yml`：レポジトリにapp.rbとconfig.ymlを加える。
`git add .`：現在のディレクトリに存在するすべてのファイルをレポジトリに加える（よく使う）。

##ファイルを修正する

これで`test.txt`はレポジトリに加えられた。
これからはこのファイルに加えられた変更をgitが管理してくれる。

```
$ git diff
$ echo 'ぼく大巨人' >> test.txt #ファイルに変更を加える
$ git diff
diff --git a/test.txt b/test.txt
index 73b66d0..d3411d1 100644
--- a/test.txt
+++ b/test.txt
@@ -1 +1,2 @@
 やれやれ
+ぼく大巨人
```

`git diff`：レポジトリに含まれるファイルの変更点を表示する。
`-`がファイルから削除された行
`+`がファイルに追加された行

こののコマンドは頻繁にお世話になる。

***git理解度４０％***

##ファイルをコミットする

コミットはレポジトリという管理帳に変更点を清書する作業だ。
ファイルに修正を加えただけではレポジトリに変更は反映されない。
管理帳はファイルを監視しているだけだからだ。

```
$ git commit -a

あたらしいファイルを追加した(ここにファイルの変更点や作業内容を、ほかのだれかが見て理解できるように書くんだよ）。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Committer: Yutaka <yutaka@MacBookAir.local>
#
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   test.txt
```
`git commit -a`：ファイルの変更をレポジトリに反映する（新規ファイルを含む）。
`git commit     `：ファイルの変更をレポジトリに反映する（新規ファイルを含まない）。
`git commit -m 'はじめてのコミットだ'`：「はじめてのコミットだ」というメッセージでコミットする。

***git理解度６０％***

##コミットログをみる

レポジトリはファイルの管理帳だ。
ファイルの履歴を記録しておいてくれたり、それまでのコミットでのメッセージを表示してくれる。

```
$ git log
commit 2bbcd7611d76ba0e1086887ca36486ba1520873e
Author: Yutaka <yutaka@MacBookAir.local>
Date:   Tue May 7 22:05:03 2013 +0900

    あたらしいファイルを追加した(ここにファイルの変更点や作業内容を、ほかのだれかが見て理解できるように書くんだよ）。
```
`git log`：これまでコミットしたメッセージをすべて表示
`git log -p`：これまでコミットしたメッセージと変更点をすべて表示
`git log -l 10`：これまでコミットしたメッセージを最近の１０件まで表示

***git理解度７０％***

## ブランチを作る

ブランチは大勢でのコーディングするときに活躍する。

**ブランチはレポジトリ本体の完全なコピーだ**。
**ファイルを消しても追加しても変更しても、レポジトリ本体には影響がない。**

レポジトリに含まれれるファイルに変更を加えたらアプリ全体に支障が発生するような変更が必要になる場合、ブランチを使う。

```
$ git branch issue20130507
$ git checkout issue20130507
Switched to branch 'issue20130507'
```

`git branch`:ブランチをすべて表示
`git branch sandbox`：ブランチ作成（ブランチ名:sandbox）
`git checkout sandbox`：ブランチ切り替え（ブランチ名:sandbox）
`git checkout master`:ブランチ切り替え（本体のブランチへ）

***git理解度８０％***


## ブランチをマージする

マージとは、ブランチでの変更点をレポジトリ本体に反映させることだ。

ブランチはなんでもやり放題の遊び場だ。
だけれどブランチで追加したり変更したりしたファイルもレポジトリ本体に反映させることができる。マージにより、ただ遊ぶだけじゃなくて遊びから学んだことを本体に活かせる。

```
$ echo 'デレクハートフィードは２度死んで３度生き返った' >> test.txt 
$ echo 'よのなかねかおかかねなのよ' > test2.txt
$ git commit -a -m 'ブランチのレポジトリにコミットした'
$ git checkout master
$ git merge issue20130507
$ git log
commit 440f207b8e69581f4c5261439d8b7a49b88e1a61
Author: Yutaka <yutaka@MacBookAir.local>
Date:   Tue May 7 23:13:50 2013 +0900

    ブランチのレポジトリにコミットした

diff --git a/test.txt b/test.txt
index d3411d1..0a53f6a 100644
--- a/test.txt
+++ b/test.txt
@@ -1,2 +1,3 @@
 やれやれ
 ぼく大巨人
+デレクハートフィードは２度死んで３度生き返った
diff --git a/test2.txt b/test2.txt
new file mode 100644
index 0000000..b564778
--- /dev/null
+++ b/test2.txt
@@ -0,0 +1 @@
+よのなかねかおかかねなのよ

commit ed8684cab1659ed27be8978eca2b5fe5eb825f62
Author: Yutaka <yutaka@MacBookAir.local>
Date:   Tue May 7 22:53:42 2013 +0900

    あたらしいファイルを追加した(ここにファイルの変更点や作業内容を、ほかのだれかが見て理解できるように書くんだよ）。
```

`git status`：レポジトリで変更・新規作成されたファイルを表示（コミット前のファイル確認で利用）
`git merge sandbox`：ブランチの変更点をレポジトリ本体に反映（ブランチ名：sandbox）


***git理解度１００％***

## プッシュとプル

これができたら
***git理解度１２０％***

##おまけ

###ほかのレポジトリをクローンする

![](http://i.imgur.com/gf7oa7c.png)

他人が作ったレポジトリをクローンできるようになればもう一人前。

```
$ git clone git://github.com/sinatra/sinatra.git
$ cd sinatra
$ git log -p
```
`git clone git://github.com/rails/rails.git`：Railsのレポジトリをコピーする

###コミット前のファイルを確認する

```
$ git status
$ echo 'ファイル作成' > example.txt
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#	example.txt
nothing added to commit but untracked files present (use "git add" to track)
```
`git status`：コミット前のファイルを確認する（ファイルの変更や追加を検査するため）

### [git](http://i.imgur.com/KTtSXfc.jpg)と[subversion](http://i.imgur.com/oSqeFFC.jpg)どっちがいい？

知性　：git > subversion
活力　：git >>> subversion
将来性：git >>>>> subversion
難易度: git == subversion