Gitの基礎知識

# はじめに

「Gitとは？」という人に説明するときに使う内容を記載した。
SVNユーザに説明することが多いのでSVNユーザ視点で表現している箇所がある。
コマンドは[こちらの逆引きを参照](https://qiita.com/HyunwookPark/items/82ce84163d1dd14da933)。

# 参照サイト

* Git 本家マニュアル
  * [Git Book v2](https://git-scm.com/book/ja/v2)
* 使用頻度の高いコマンド
  * [Git コマンド総選挙](http://akiyoko.hatenablog.jp/entry/2012/12/16/055913)
* 初見の人におすすめ
  * [git - 簡単ガイド](http://rogerdudler.github.io/git-guide/index.ja.html)
* 各機能について忘れたとき
  * [サルでもわかるGit入門](http://www.backlog.jp/git-guide/)
* gitサービス比較
  * [gitホスティングサービス比較](http://bitwave.showcase-tv.com/gitホスティングサービス比較par2/)

# 概念

![](git_overview.png)
**図を作成中です。**

# なぜGitを使うのか
* ローカルリポジトリに気軽にcommitできる
  * ローカルにcommitしても他の作業者に影響がない
  * 定時で帰るときに仮でcommitできる
  * 割り込み作業が入ったときに自分の作業中のファイルを退避(commit)し、すぐに戻せる
  * commit間違いを取り消せる
  * 一つの対応で複数回に分けてcommitしたものを一つのcommitにまとめて綺麗な履歴にできる
* 作業ごとにブランチを分けやすい

# 用語説明(概念)

| 概念    | 説明        |
|:-----------|:------------|
|リモートリポジトリ|サーバのリポジトリ(svnのサーバのイメージ)|
|ローカルリポジトリ|サーバのリポジトリを履歴ごとローカルにコピーしたもの(※git独自のもの)|
|作業領域(WORKING DIRECTORY)|ローカルリポジトリで作業中のブランチのファイルの状態(実際に編集するファイルシステムを概念としたもの)|
|ブランチ|履歴の分岐のこと。gitではすべてブランチと呼び、svnのtrunkとbranchをgitではどちらもブランチと呼ぶ。|
|マスターブランチ|開発の本流のブランチ。svnのtrunkに相当する。<br><font color="red">※最初にpushしたブランチ名がmasterブランチになるので注意</font>|
|トピックブランチ|作業単位でブランチをつくる運用|
|git-flow|リリース用ブランチやホットフィックスなど用途に合わせてブランチを用意する運用(Vincent Driessen氏提唱)|
|GitHub/BitBucket|Gitのサーバ機能をクラウドで利用できるサービス|
|GitLab/GitBucket|Gitのクラウドサービスを社内のサーバなどにインストールできるように作成されたもの|
|pull request or merge request|GitLab/GitBucketなどでサーバー上でmergeの操作を要求する機能|
|インデックス or ステージ|コミット対象のファイルを登録する場所|

# 用語説明(command)

| command    | 説明        | 用途|
|:-----------|:------------| :-- |
|git clone   | リモートrepositoryからチェックアウト | 最初にリポジトリを取得するとき |
|git add     |commit 対象を追加(staging)| コミットするファイルの選択時 |
|git commit  |ローカルrepositoryにコミット| 実際にコミット |
|git push    |リモートrepositoryに送る| コミットしたものをサーバにアップロード |
|git fetch   |リモートrepositoryをローカルrepoに同期| リモートの状態を知りたいとき(ソースは持ってこない) |
|git pull(fetch + merge)|リモートrepositoryをローカルに持ってくる| ローカルソースを最新化したいとき |
|git merge   |2branch間のマージ| masterの最新状態を作業中のブランチに取り込むとき |
|git checkout|ブランチ切替**(SVNと意味が違うので注意)**|カレントのブランチの向き先を変更したいとき|

# Gitクライアント

* [Git本体](https://git-scm.com/downloads)
* [GitExtensions](https://gitextensions.github.io/)
* [GitKraken](https://www.gitkraken.com/)

||GitExtensions|GitKraken|Sourcetree|GitHub Desktop|
|---|---|---|---|---|
|コミッタ|名前表記(アイコン連携あり)|アイコン表記(アイコン連携あり)|名前表記|名前表記|
|環境|Windows|Windows, Mac, Linux|Windows, Mac|Windows, Mac|
|Free?|無償|基本無償(有償版あり)|基本有償(評価版あり)|無償|
|ユーザ登録|不要|必要|必要|不要|
|日本語|日本語対応なくなった|なし|なし|なし|
|UI|わかりやすい|わかりやすい|ちょっとくせあり|みづらい|
|マージツール|KDiffインストールされる|マージ機能あり(めっちゃ使いやすい)|外部呼出し|マージ無理|
|prefix|フラット表示|階層表示|階層表示|フラット表示|
|git-flow機能|なし|あり|あり|なし|
|提供元|個人|GitKraken|Atlassian|GitHub|

### GitExtensions

* 編集中ファイルありの表記が正しく動作しないことがある
  * 再起動すると直ることもある

### Sourcetree

* ローカルブランチとリモートブランチ見づらい(同じ色)
* 邪魔なアラートが出る
  * インストール時Mercurialを探す
  * サーバキーの受け入れ？なにそれ
* マージは外部ツールが起動される(たまたまKDiffが入ってたので起動された)

### GitHub Desktop

* そもそもログのマップ見れない？
* マージ無理ぽい

### GitKraken

* UIは一番いい感じ
* privateのリポジトリを見ようと思うと有料

# Gitのインストールしてリポジトリ取得するまで

1. [Gitクライアント](https://git-scm.com/downloads)をインストール
1. GitBashを起動
1. ssh-key作成
  1. Gitクライアントで[ssh-keygen](https://git-scm.com/book/ja/v1/Git-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-SSH-%E5%85%AC%E9%96%8B%E9%8D%B5%E3%81%AE%E4%BD%9C%E6%88%90)を実行