gitコマンドまとめ

# 1.初級編 基本的な用語とコマンド

## 基本用語

| 用語 | 説明(イメージ) |
|:-:|:-:|
| **ブランチ**  | 枝。大元の枝から切り分けることで、作業ごとまたは作業人ごとで、複数の作業や履歴を並列に管理できる  |
| **レポジトリ**  | 履歴管理を行う場所  |
| **クローン(clone)**  | ダウンロードのイメージ。リモートのレポジトリをそのまま全てローカルに持ってくること  |
| **アド(add)**  | コミットする前に仮にセーブするイメージ。addしないとコミットできない
| **コミット(commit)**  | 変更対象をセーブするイメージ。コミットは全て履歴として残る  |
| **プッシュ(push)** | アップロードに近いイメージ。ローカルでコミットしたものをリモートにあげること  |
| **プル(pull)**  | リモートリポジトリの最新状態をローカルリポジトリに反映させる。ダウンロードのイメージだが、cloneとは違いpullはすでにローカルにリポジトリがある状態(clone済みの状態)でしか行えない  |

## 基本コマンド

### git clone `git@github.com:〜 or https://github.com/〜`

リモートのレポジトリをクローンしてきます。

### git checkout 存在しているブランチ名

ローカルに存在しているブランチに切り替えます

### git checkout -b 新しいブランチ名

現在のブランチから新しくブランチを作成します。

### git add 作業パス(変更したファイル)

変更したファイルをcommitする前に取り込みます。(仮にセーブするイメージ)

変更したファイルのパスがわからない場合が、```git status``` で確認できます。
全部addしたいときなどによく使うのは、```git add .``` です。

取り消す際は、```git reset HEAD 作業パス(変更したファイル)``` で取り消せます。
ファイルの内容は元のままなので、せっかくここまでやったのに消えてしまうという心配も不要です。

### git commit

addしてある箇所をコミットします。
セーブに近いイメージです。セーブに履歴を付けれることがgitの特徴でしょうか。

```git commit -m "コメント"```

これだとvimを開かないで済みます。

```git commit -m "コメント" -m "コメント"```

と2行以上書くことも可能です。

### git push origin hoge(pushしたいブランチ名)

プッシュします。これによりローカルからリモートにコミットが反映されます。
アップロードに近いイメージです。

### git status

git addがきちんとされているか否かも確認できます。

### git revert コミット番号

コミット履歴は残しつつ、あくまでコミットによる変更のみを打ち消すコマンドです。
コミット番号については、```git log``` で調べられます。

### git pull origin ローカルブランチ名

リモートの最新状態を取得します。

## origin とは何か

レポジトリの場所(URL)の別名です。
最初にcloneしたときに、設定されます。

```git config --list``` で確認できます。

# 2.中級編 やりたいことから逆引き

## リモートで特定のブランチをクローンしてくる方法

```git clone -b リモートで落としたいブランチ名 https://github.com/〜```

-b でリモートのブランチ名を指定することがポイント

##  強制的にローカルブランチをリモートブランチに合わせる

```
git fetch origin
git reset --hard origin/master(現在のブランチ名)
```

リモートの最新の状態をもってくることができる。
ローカルとリモートの整合性が取れなくなった時に使うと良いと思います。
もしくは一度ローカルブランチを削除して、リモートブランチを持ってくるかです。

## リモートブランチを持ってくる

まずはリモートにあるブランチの情報を取得して表示する

```
git fetch (リモートブランチの最新の情報を取得)
git branch -a (ローカルブランチとリモートブランチの一覧を表示)
```

```
git branch -a
* master
  remotes/origin/master
  remotes/origin/hoge_branch
```

上記で、remotes/origin/hoge_branchをリモートからもってきて、ローカルでhoge_branchとして作業する場合に下記のようなコマンドを打つ

```git checkout -b hoge_branch origin/hoge_branch```

# 3.上級編

## 既存ブランチは残しつつ、全く新しく0からのブランチを作る

### まずはローカルにディレクトリを作成

```
$ mkdir hogeDir
$ cd hogeDir/
```

### 作成したディレクトリ内でinitし、リモートのレポジトリを持ってくる

```
$ git init
Initialized empty Git repository in /Users/user_name_hoge/hogeDir/.git/
$
$ git remote add origin git@github.com:hogehoge/hogehoge.git
$
$ git status
On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)
```

### マスターからブランチを切って新しいブランチを作成し、
ファーストコミット、プッシュまでを行う

```
$ git checkout -b hoge_branch
Switched to a new branch 'hoge_branch'
$
$ vi README.md
$ git add .
$ git commit -m "First commit" -m "READMEファイル作成"
[hogeDir (root-commit) 26tey74] First commit
 1 file changed, 11 insertions(+)
 create mode 100644 README.md
$
$ git push origin hoge_branch
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 521 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:hogehoge/hogehoge.git
 * [new branch]      hoge_branch -> hoge_branch
$
```

これでリモートに全く新しいブランチ『hoge_branch』ができました。
このブランチをデフォブランチ(リモートで設定可能)に設定すると、他のブランチに手をつけず、作業をすることができます。

## 異なるレポジトリから差分をコピーして持ってくる

### まずはAAAレポジトリをクローンする

```
git clone git@github.com:hoge/AAA.git
cd AAA
```

### 確認する

```
git config --list

(中略)
remote.origin.url=git@github.com:hoge/AAA.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
```

### コピーしてきたいBBBのレポジトリを登録する

※作業ディレクトリは変更しなくてよい

```
git remote add BBB git@github.com:hoge/BBB.git
```

※BBBの名前は何でも良い、この後呼び出すのに使います。

### 確認する

```
git config --list

中略
remote.origin.url=git@github.com:hoge/AAA.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
branch.master.remote=origin
branch.master.merge=refs/heads/master
remote.BBB.url=git@github.com:hoge/BBB.git
remote.BBB.fetch=+refs/heads/*:refs/remotes/BBB/*
```

### BBBレポジトリのブランチ情報を取得

remoteのレポジトリを登録した後に、必ずfetchしてあげることがポイントです。
これをしないとBBBレポジトリのブランチを指定できません。

```
git fetch BBB
```

これにより、BBBのレポジトリのブランチの情報が取得できる。

### 確認する

```
$ git branch -a
* master
  remotes/BBB/hogehoge
  remotes/BBB/error-fix
  remotes/BBB/fix-sass
  remotes/BBB/master
  remotes/origin/hogehoge
  remotes/origin/HEAD -> origin/master
  remotes/origin/hogetest
  remotes/origin/master
```

### リモートのレポジトリを指定して、AAAのローカルブランチにマージする

```
git merge BBB/master
```

※現在作業中のブランチにマージされるため、masterから切ったブランチにマージして、pushしてリモートで差分を確認するのが良いと思います。

### 二回目以降に上記作業を行うケース

一度remoteでaddしてあれば、下記だけでいつでもコピーや差分が取り込めます。

```
git checkout master
git pull (AAAレポジトリの最新の状態を持ってくる)
git checkout -b AAA_2018xxxx (BBBをマージするためブランチを切っておく)
git fetch BBB (BBBレポジトリの最新のブランチを取得)
git merge BBB/master (AAA_2018xxxxへBBBレポジトリのmasterブランチをマージ)
```

# 覚えておくと便利

ブランチ変えて作業したいけど、差分があってadd,commitしないとブランチを変えれない時に使えるのがstashです。

```
git stash
```

一時的に保存してくれます。
とりだすときは `git stash pop`　を使います。
リストは `git stash list` で見れます。