[Git] 基礎 ~master反映まで~

過去にSVNから移行した際のアウトプット/メモ。変な個所がありましたら、ご指摘いただけますと幸いです<m(__)m>

# Gitとは。
分散型バージョン管理システム。ブロックを色んなところで組み立てて、タワーに積み上げるイメージ。
対比として、中央集権型バージョン管理システムのSVNが挙げられる。

# まずは大まかなイメージ図
<img src="https://qiita-image-store.s3.amazonaws.com/0/198971/6c8e37af-eaff-82a8-8778-eee917375ab9.png" width=100%>

### 登場するのは大きく分けてこの３つ。
・作業ブランチ
・リモート追跡ブランチ
・リモートブランチ

作業ブランチとリモート追跡ブランチを合わせた領域がローカルブランチ。

#### 作業ブランチ
メンバー各々が開発を進めていく個人スペースで、機能毎に作業ブランチを作成してコーディングし、リモートブランチにpushしていく。別名だと追跡ブランチ(tracking branch)。

#### リモート追跡ブランチ
作業ブランチとリモートブランチの間に存在するブランチ。(上図参照)
作業ブランチとリモートブランチは直接のやり取りはせず、リモート追跡ブランチを介してやり取りをする。
```git fetch```した時に更新される。少しややこしい。

#### リモートブランチ
みんなで共有しているブランチ。```git push```しない限り変更されない。
逆に言うと、リモートブランチにpushするとみんなに影響出ちゃう可能性があるので注意。

# 既存リポジトリのclone

```terminal
$ git clone [url]
```
これだけ。

# 実務フロー
エディター上でも操作は可能だが、コマンドラインでの操作方法を記述


案件で機能追加が発生した場合

①作業ブランチを作成
↓
②リモートブランチにpush
↓
③masterブランチへmerge


## ①作業ブランチを作成

作業ブランチ作成。
※この時に最新のmasterから生やすように注意!

```terminal
$ git branch ブランチ名
```

参照するブランチを切替

```terminal
$ git checkout ブランチ名
Switched to branch 'hoge_branch'
```

ブランチ一覧&参照ブランチ確認

```terminal
$ git branch -a
* hoge_branch　　 現在参照されているブランチ
 master           ローカルのmasterブランチ
 remotes/origin/master　　リモート追跡ブランチのmasterブランチ
```

## ②リモートブランチにpush
開発が一段落したらソースをステージしてcommitしてpushする。(パルスのファルシのルシがパージでコクーン感)


ステージとは、commit予定のファイル一覧リスト,もしくは追加すること。このリストをHEADにcommitする。この時点では、リモートブランチに影響は出ない、言い換えるとローカル内でリモートに反映する準備をしただけ。SVN利用者は勘違いしやすい。

一応、差分が無いかstatusを確認する。差分が無ければ次へ。

```terminal
$ git status
```

ソースをステージする。(索引に追加)

```terminal
$ git add ファイル1 ファイル2 ...

~その他~
$ git add .     //すべてのファイル・ディレクトリ
$ git add *.css //すべてのCSSファイル
$ git add -n    //追加されるファイルを調べる
$ git add -u    //変更されたファイルを追加する
```

HEADにcommitする。

```terminal
$ git commit
もしくは
$ git commit -a -m "任意のコメント"  //コミット (-aオプションは変更を自動検出してくれる
```

リモートブランチにpush。(ここで外部に更新内容が反映される)

```terminal
$ git push origin ブランチ名  
```

### その他コマンド

・HEADにcommitしたのを取り消したい

```terminal
$ git reset --soft HEAD~2   #最新のコミットから2件分をワークディレクトリの内容を保持し取り消す
$ git reset --hard HEAD~2   #最新のコミットから2件分のワークディレクトリの内容とコミットを取り消す

追記
$ git reset --soft @~　　#これでもいける。HEADと@は同じ意味
```


・commitメッセージを修正したい

```terminal
$ git log
編集...
```

完了。

```terminal
$ git commit --amend
```

複数修正したい場合

```terminal
$ git rebase -i HEAD~2   #HEADから2件のコミットメッセージを表示
```
Viエディタ起動

```vim
pick commitId メッセージ // 2件目
pick commitId メッセージ // 1件目(最新)
.
.
.
```
上記の「pick」を「edit」に書き換えて保存してrebaseする。rebase危ないので用法用量を守って正しくお使いください。

```terminal
$ git rebase --continue
```

# ③masterブランチへmerge

ローカルmasterブランチとリモートmasterブランチの差分を確認

```terminal
$ git checkout master
$ git status
```

今度は機能追加で作成した作業ブランチとローカルmasterブランチの差分を確認。

```terminal
$ git diff --name-status master hoge_branch
```

差分があったら、取り込む。

```terminal
$ git fetch                #リモートの更新内容を取得
$ git merge origin/master  #取得した更新内容をローカルに反映
```

ローカルmasterブランチへ作業ブランチの内容を取り込む。

```terminal
$ git merge master hoge_branch
```

リモートmasterブランチにpush

```terminal
$ git push origin master:master
```


## 不要になったブランチ削除
機能毎にブランチをたくさん作成するので、こまめに消そうね。

作業ブランチ削除

```terminal
$ git branch --delete ブランチ名
```

リモートブランチ削除

```terminal
$ git push --delete origin foo
もしくは
$ git push origin :foo
```

## 参照
[Subversionを使用し続けているプロジェクトがGitに移行することを考えてみた](https://qiita.com/sh-ogawa/items/0bac2516d85e3db4dfd8)
[【Git】基本コマンド](https://qiita.com/konweb/items/621722f67fdd8f86a017)
[Gitコマンド一覧](https://qiita.com/fukumone/items/73e1a9a62c5e4454263b)
[Git 基本の用語集](https://qiita.com/toshi_um/items/72c9d929a600323b2e77)
[git rebase についてまとめてみた](https://qiita.com/KTakata/items/d33185fc0457c08654a5#git-rebase)
[Git で不要になったローカルブランチ・リモートブランチを削除する方法](https://qiita.com/iorionda/items/c7e0aca399371068a9b8)