git リポジトリの利用方法

リクルートさんではgitが扱えないと仕事にならないという話をウェブで見たりするのでgitの扱いをまとめておきましょう。
GitHubはコードのバージョン管理が出来る便利なサイトで基礎的な部分を抑えた後プログラミングを書くならここを見るに限ります。

環境はMacOSX 10.8

#アカウント作成

まずアカウントがないと始まらないのでアカウントを作成しましょう
https://github.com/

gitのコマンドはMacの場合はhomebrewで落とせます。
###gitインストール
```
$ brew install git
```

###homebrewがない場合は事前にインストール
```
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
```
###バージョン確認
```
$ git --version
git version 1.8.5.2 (Apple Git-48)
```
#ローカルリポジトリ作成

使っているPC上で開発中のコード置き場を作ります
###ディレクトリ作成
home directory下等に専用のディレクトリを作り
配下に移動します。

```
$ mkdir git_dev
$ cd git_dev
```

ローカルリポジトリとして初期化します。

```
$ git init
Initialized empty Git repository in /Users/*****/git_dev/.git/
```

##.gitディレクトリが作成されていれば成功

```
$ ls -la
total 0
drwxr-xr-x   3 keigo  staff  102  5 29 10:46 .
drwxr-xr-x  18 keigo  staff  612  5 29 10:43 ..
drwxr-xr-x  10 keigo  staff  340  5 29 10:46 .git
```

##対象ファイルをステージングエリアへ記録
test.jsを対象ファイルとしてgit_dev配下へ移動させ
ステージングエリアへ記録

```
$ git add test.js
# 変更したファイル全てをステージングエリアへ記録する時
$ git add --all
$ git status
On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   test.js
```
##リポジトリのコミット

コミットメッセージの入力は -m　オプションで短縮出来ます。

```
$ git commit -m "test commit"
[master (root-commit) e48a96e] test commit
 1 file changed, 15 insertions(+)
```

###ログの確認

```
$ git log
commit e48a96ef2140df1feb028d7bb66305afb8b6b891
Author: JohnKeigo <**********@gmail.com>
Date:   Sun May 29 11:46:10 2016 +0900

    test commit
```

#リモートリポジトリの登録

下記コマンドでリモートリポジトリを登録出来ます。

```
$ git remote add <name> <URL>
```

今回は私のテスト用のリポジトリを登録します

```
$ git remote add JohnKeigo https://github.com/JohnKeigo/hello-world
```

###リモートリポジトリの確認
登録されているリモートリポジトリの確認はgit remoteで出来ます。
JohnKeigoの登録が確認出来ました。

```
$ git remote
JohnKeigo
```

詳細なリモートリポジトリ登録情報の確認

```
$ git remote show JohnKeigo
* remote JohnKeigo
  Fetch URL: https://github.com/JohnKeigo/hello-world
  Push  URL: https://github.com/JohnKeigo/hello-world
  HEAD branch: master
  Remote branches:
    master        new (next fetch will store in remotes/JohnKeigo)
    python-branch new (next fetch will store in remotes/JohnKeigo)
  Local ref configured for 'git push':
    master pushes to master (local out of date)
```
#リモートリポジトリ操作

###fetchでリモートトラッキングブランチ作成
```
$ git fetch JohnKeigo
warning: no common commits
remote: Counting objects: 14, done.
remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 14
Unpacking objects: 100% (14/14), done.
From https://github.com/JohnKeigo/hello-world
 * [new branch]      master     -> JohnKeigo/master
 * [new branch]      python-branch -> JohnKeigo/python-branch
 * 
localhost:git_dev keigo$ git branch -r
  JohnKeigo/master
  JohnKeigo/python-branch
```
fetchはこの後mergeしなければローカルのmasterは更新されません。


###git pull
fetchしてMergeするより直感的で楽に感じます。
名前のごとくリモートリポジトリの情報をローカルへ
持って来ます。
ただしmergeまで一括で実行します。

temp.js をgithubのJohnKeigo/hello-worldリポジトリへアップロードしコミット後にpullしてみます。

```
$ git pull JohnKeigo master
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/JohnKeigo/hello-world
 * branch            master     -> FETCH_HEAD
   ce56dd3..81c1ae9  master     -> JohnKeigo/master
Updating ce56dd3..81c1ae9
Fast-forward
 temp.js | 13 +++++++++++++
 1 file changed, 13 insertions(+)
 create mode 100644 temp.js
```

ローカルに同期されました。

###git push
コミットされたローカルのリポジトリを
リモートのリポジトリへ書き込むコマンドです。

```
$ git push JohnKeigo master:master
Counting objects: 7, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 698 bytes | 0 bytes/s, done.
Total 5 (delta 1), reused 0 (delta 0)
To https://github.com/JohnKeigo/hello-world
   cd5319e..ce56dd3  master -> master
```
本来複数人でコードのバージョン管理する事が主眼のサイトだと思います。次の記事で複数人での管理操作の手順も
確認して上げたいと思います。

参考ページ
[Gitではじめるバージョン管理 〜ローカルリポジトリでファイルを管理してみよう〜](http://www.hivelocity.co.jp/blog/34777)
[Git 再入門 リモートリポジトリを使った作業]
(http://www.yunabe.jp/docs/relearning_git_remote.html)