Gitの使い方 - 初心者向け（入門）

## はじめに
### 本記事の背景
今回、社内開発の案件がGITで管理されており、開発メンバに使い方と情報共有するため、GITに関しての記事を書こうと思っています。GIT使い始めるのは2年前ぐらいです。自分も初級者なので、該当記事はチーム開発の初級者向けとなります。上級者は勝手に飛ばしてよい(笑～～～)

### 内容と目標

本記事の内容はGIT基本コマンドの使い方、及びチーム開発の時よく使うGITコマンドを紹介します。目標としては、GITワークフローの全体イメージを理解し、日常の開発運用に対して、GITコマンドでソース管理できるようになるまで。

## Gitの概要
### 「Git」とは？
### 作業フロー全体像
まず一番シンプルな作業フローイメージを見てみましょう。
![GIT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244355/7d39af7c-dc60-effd-b2b4-a815c076258c.png)


- **共有リポジトリ(shared repository)**
共有リポジトリはリモートリポジトリとも呼び、開発チームで共有するリポジトリとなります。
一般的にメインバージョンのソースが格納されている。
開発者は共有リポジトリからソースを「pull/fetch」コマンドで取り込む。

- **ローカルリポジトリ(local repository)**
ローカルで作業内容を一時的に保存するため、ローカルマシン上にあるリポジトリです。pushにより共有リポジトリに変更内容を反映する。

- **インデックス(index)**
インデックスとは、ローカルリポジトリにコミットの準備をするための場所です。インデックスの内容は、コミットによりローカルリポジトリへ反映されます。

- **作業ツリー(working tree)**
ユーザーが作業中のフォルダやファイルのことです。作業ツリーの変更点はgit addによりインデックスに追加されます。



## Gitコマンドについて
- **基本操作のコマンド**<br>
  - **環境設定**

    ```bash
    # ユーザ名設定
    $ git config --global user.name "hayashi.hirohumi"
    ```

  - **リポジトリ作成**

    ```bash
    # カレントディレクトリをGitリポジトリとして初期化する。
    $ git init
    
    # リモートリポジトリをローカルにクローン（複製）する。
    $ git clone https://github.com/ryanhoward19830311/gittest.git
    ```
  - **ファイル管理**

    ```bash
    # ファイルをインデックスに登録する。（バージョン管理対象になる）
    $ git add <pathspec>

    # ファイル名変更、移動
    $ git mv <source> <destination>

    # ファイルをバージョン管理から除外する。
    $ git rm <pathspec>
    ```

  - **ステータスと差分の確認**
  
    ```bash
    # 現時点作業ツリー内の状態を確認する。
    $ git status

    # コミットや作業ツリーとの差分を表示する。
    $ git diff

    # コミットの差分、ファイルの内容を表示する。
    $ git show <commit>
    ```
  - **コミット**

    ```bash
    # インデックスに変更内容を登録する。
    $ git add <file>

    # インデックスの内容をローカルリポジトリにコミットする。
    $ git commit
    ```
  - **取り消し**

    ```bash
    # ファイルの変更やコミットをリセットする。（※git addの取り消しも使える）
    $ git reset [--mixed | --hard | --soft] [<commit>][<file>]

    # コミットの内容を取り消す。
    $ git revert [--no-edit] [-n] <commit>...
    ```

- **共有リポジトリ（リモート）でのチーム作業のコマンド**<br>
  - **変更を公開する**
  
    ```bash
    # ローカルの変更を共有リポジトリに反映する。
    $ git push
    ```
  - **共有リポジトリの変更を取り込む**
  
    ```bash
    # 共有リポジトリの変更を取得して、作業ツリーに取り組む。
    $ git pull

    # 共有リポジトリの変更を取得する。（取り込みはしない。変更を確認してから手動で取り込むことが多い。）
    $ git fetch
    ```
  - **変更をマージする**
  
    ```bash
    # 他のブランチの変更をチェックアウトしているブランチにマージする。
    $ git merge <branch_name>

    # 競合がある場合、競合を手動で解決して、再度コミット
    $ git add <conflict_file>
    $ git commit
    ```

  - **変更をリベースする**
    
    ```bash
    # 他のブランチの変更をチェックアウトしているブランチにマージする。
    $ git rebase <branch_name>
    # 競合がある場合、競合を手動で解決して続行
    $ git rebase --continue
    ```

  - **特定のコミットをブランチに取り込む**

    ```bash
    # 他のブランチの変更をチェックアウトしているブランチにマージする。
    $ git cherry-pick <commit_id>...
    ```

- **その他**<br>
  - **ブランチ作成**
  
    ```bash
    $ git checkout -b <new_branch_name>
    ```

  - **ブランチ・タグの切り替え**

    ```bash
    $ git checkout <branch_name>
    ```

  - **リビジョンにタグ付け**
 
    ```bash
    $ git tag v1.0
    ```

  - **履歴**
 
    ```bash
    $ git log

    # 前の5件概要のみ表示する。
    $ git log -5 --oneline
    ```

  - **一時保存**

    ```bash
    # 現在編集中のファイルを一時保存
    $ git stash

    # 一時保存したリストを確認する。
    $ git stash list

    # 一時保存した内容を確認する。
    $ git stash show <stash_id> [---name-only]

    # 一時保存した内容を取り出す。
    $ git stash pop
    ```

## 終わりに
　今回Gitの概要をざっくり説明しましたが、各コマンドについての詳細は次回の記事に公開します。

## 各コマンドの詳細
- [「Gitの設定編（一）　git configの概要と使い方」](https://qiita.com/RyanHoward/items/8436159b4d0471401df9)