使い始める Git

Gitはバージョン管理を行うためのツールの一つです。Gitを利用することで、ソースコードを変更前に戻したり誰がいつ何処を変更したのかを把握することが可能になります。

## インストール

http://git-scm.com/downloads

## 初期設定

ユーザー名/メールアドレスを設定します。

```
git config --global user.name "git taro" 
git config --global user.email git.taro@example.com
```

プロキシ配下の場合(認証がある場合はuser:passにユーザーIDとパスワードを設定)
※パスワードに@がある場合は、@をURLエンコードした値(%40)を使用します

```
$git config --global http.proxy http://proxy.server.com:port
$git config --global http.proxy http://user:pass@proxy.server.com:port
```

` git config --global --list ` 

で設定確認

## 基本操作

Gitに限らず、バージョン管理系のソフトはファイルの変更を「コミット」(記録)することで、変更履歴を作成します。
この変更履歴にはメッセージを付けることができるので、「何のために」「ソースコードのどの箇所を変更したのか」を記録していくことができます。

コミットメッセージとしてどんなものが適切なのかは、[こちら](https://qiita.com/kawasima/items/feac49a299213e2c8ba6)の資料を参照してみてください。

Gitでの基本的な操作は、以下のようになります。

* リポジトリの作成: バージョン管理の対象となっているフォルダを「リポジトリ」といいます(ざっくり言えば)。これは、外からとってくる場合と自分で作る場合の2通りがあります。
 * `git init`: フォルダ内でこのコマンドを実行することで、そのフォルダをバージョン管理対象=Gitリポジトリにすることができます。
 * `git clone`: 外部のリポジトリを、ローカルにダウンロードします。この場合、外部のリポジトリはすでにGitリポジトリのため、バージョン管理が行われています。
* コミットの作成
 * `git add`: コミット対象の(変更された)ファイルを登録する
 * `git commit`: 変更を記録する
* (コミットの送信): リポジトリがオンラインにある場合は(GitHubなど)、手元で行ったコミットを外部のリポジトリに送信します
 *  `git push`: ローカルのコミットを外部のリポジトリに送信する

全体像は以下のような図になります。

![1-slide-git](https://camo.qiitausercontent.com/62f691d92f347351e8e5c1dae6a50ef13b0390e5/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f32353939302f61656562336162382d643031612d336337652d633965332d3738336632383437633862322e706e67)

[1slide で理解するGit](https://qiita.com/icoxfog417/items/b47f8f033a367b65ff37)より

### 基本

```
# フォルダを作成
mkdir myRepository

# git リポジトリにする
git init

# ~何かしらファイルを変更~

# 変更の登録
git add -A

# 変更の記録
git commit -m "commit message"
````

なお、リポジトリに含めたくないファイルは`.gitignore`で管理します。各言語や開発環境によって設定内容が変わってくるため、こちらから選んでくるとよいです。

[github/gitignore](https://github.com/github/gitignore)

**`.gitignore`を設定していないと、リポジトリのサイズが肥大化したりする弊害があります。リポジトリを作成した際は必ず確認しましょう**

### 取り消しを行う場合

上からadd、commitの取り消し、commit メッセージの修正を行う場合のコマンドになります。

```
git rm -r --cached .
git reset --soft HEAD~ 
git commit --amend -m "new message"
```

### commitログの修正

` git rebase -i HEAD~3 `
HEAD~で修正するコミットログの範囲を設定(3なら、直近3回のコミットを修正)

### 変更内容の確認

上からadd、commit、commitログの確認になります

```
git diff --cached --name-only 
git diff HEAD^ --name-only 
git log --pretty=oneline --abbrev-commit 
```

## branchの作成

まとまった変更を行うときは、ブランチという作業スペースを作成し、そこで変更を行っていき後で統合(マージ)を行います。
以下はブランチの作成/作成したブランチへの移動/削除/確認のコマンドになります。

```
git branch xxx
git checkout xxx
git branch -D xxx
```

外部のリポジトリに修正を送る場合(Pull Request)もブランチを使った作業になります。詳細は以下の記事をご参照ください。

[GitHubへpull requestする際のベストプラクティス](http://d.hatena.ne.jp/hnw/20110528)

## その他

### 標準エディタの使い方

`git commit`でメッセージを入れ忘れたり　git rebase すると謎なモードになりますが、これが標準のエディタです。
とりあえず以下のコマンドさえ覚えていれば困りません。

| コマンド | 説明 |
|:-----------|:------------|
| dd | 行削除 |
| i | 編集モードに入る。これでメッセージを編集できる |
|escキー| 編集モードから抜ける |
| :w | 編集内容を保存する |
| :q | エディタモードを終了する |

### オンラインリポジトリ(GitHub / Bitbucket)関連

リモートリポジトリの登録/削除/確認

```
git remote add xxx https://xxxx 
git remote -rm xxx
git remote show xxx
git remote 
```

リポジトリのダウンロード
` git clone https://xxxxx `

コミットの送信(remote名・ブランチ名で宛先指定)
` git push xxx master `

リポジトリ側の更新をローカルに反映
` git pull xxx master `

## 参考リンク

上記で紹介したコマンドの、より詳細な使い方は以下の記事をご参考ください。

* [git diff の使い方がほんの少し理解できた](http://d.hatena.ne.jp/murank/20110320/1300619118)
* [rebase -i でコミットをまとめる](http://www.backlog.jp/git-guide/stepup/stepup7_5.html)