独習Gitを読んだまとめ(絵)

# 1. プッシュするまでの流れ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/e44de624-4450-d154-cbca-98cf4d2b6a1b.png)

## ステージングにあげる

```
$ git add [file]
$ git add .
```

## ワークスペースに戻したい

```
$ git reset [file]
```

## コミットする

```
$ git commit -m [comment]
```

## プッシュする

```
$ git push [destination] [branch]
```
ただし、リモートリポジトリの同一名称のブランチにpushする分には引数は省略可能。

# 2. ブランチ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/aac23a54-7a64-38f9-4e94-2739c4577938.png)
HEADとは現在のコミットの位置を表すポインタ。`checkout`コマンドはこのポインタの指す場所を変更するコマンド。
なので、ブランチ名だけでなくコミットのSHA１_IDを指定することも可能。

```
$ git checkout [branch]
$ git checkout -b [branch] #作成して移動
$ git checkout [SHA1_ID]
```

```
$ git branch [branch] #作成
$ git branch -d [branch] #削除
```

# 3. スタッシュ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/982ce54d-e6e1-c0dd-1a0e-b245ea5f6040.png)
Stushとは一時退避場所。
ステージングに変更がある状態ではブランチを移動できない。その旨のエラーが出る。そこで使用するのがStash。
移動前に格納して、移動後に取り出す。上記はmaster→branchDevへ移動する例。

```
$ git stash       # stashに格納
$ git stach list  # 一覧表示
$ git stash pop   # 取り出し
```

# 4. マージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/1561a92a-ff70-79da-4d2e-03458fe2d968.png)
複数のブランチを一つにするときにはコンフリクトが生じることがある。
それを解決するのが`merge`である。
ファイルを編集し、再度コミットすることでマージできる。
取り込む側のブランチ上でこのコマンドを実行する。

```
$ git merge [branch]
```

# 5. クローン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/d0aa9f6c-c093-5245-3b15-06426db62f0f.png)
ブランチ全てを持っては行かない。追跡用のそのブランチへのパスだけ持っている。
必要であれば`checkout [branch]`とすると`$git checkout -b branch remotes/origin/[branch]`と等価な実行結果が得られる。

```
$ git clone [already_exist_branch] [new_branch]  #作成
```

# 6. ベアリポジトリ
作業場のないリポジトリ。github上に置いているリモートリポジトリはこれに当たる。
編集方法はpushのみ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/58e8cc6a-30de-08ac-2428-aa768e7971ed.png)

```
$ git clone --bare [already_exist_branch] [new_bare_branch]  #作成
```

# 7. remoteコマンド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/3b30887f-7b46-8d95-c008-8d715c8af262.png)
リモートリポジトリの情報を取得。

`$ git remote -v show origin`とすることで、リモートのoriginと自身を比べて最新か更新があるかがわかる。

```
remote origin
Fetch URL: /Users/username/bare_test
Push URL: /Users/username/bare_test HEAD branch: master Remote branches:
  branchB tracked
  branchC tracked
  branchD tracked
Local branch configured for 'git pull': 
  master merges with remote master
Local ref configured for 'git push': 
  master pushes to master (up to date)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/b7499603-b350-5f1a-b7af-f24dcad44ffc.png)

# 8. プル

`fetch`して`merge`している。

## (1) コンフリクトしない易しい時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/3016828f-bfb6-2e09-f0df-d44905d61426.png)

## (2) コンフリクトしためんどくさい時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/29fedaa6-8f19-0160-c22b-c160acfad5b1.png)

# 9. リモートへの新規ブランチ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/5e1fbeac-1527-6992-2495-bd00d2ded12a.png)
ローカルで作った後に反映させる。

```
$ git push --set-upstream origin [new_branch]
```

# 10. rebaseを使う

base（ブランチが枝分かれした部分)を変更できる。

## ユースケース1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/cca75534-f01b-5dc8-b09c-c0fa06e291d9.png)

## ユースケース2
同じく、例としては何度も追加した対して中身のないコミットログを全てgitにあげるのは無駄なので、いらないものをスカッシュする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/57ff1653-9ed8-c078-2703-7f61f21927c5.png)

# 11. 設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/615e532e-5b6c-fe8a-a37a-efb69444646c.png)

エイリアス`$ git lol`は以下のようにして設定する。

```
$ git config --global alias.lol "log --graph --decorate --pretty=oneline --all --abbrev-commit"
```