全12回の勉強会でやっているGitの使い方 - AWS上で構築するRESTfulアプリ勉強会～Web開発ワークショップ～


## 12回もやる勉強会で必要になってきたGitの操作って？

こんな勉強会をやってます。全12回。
[AWS上で構築するRESTfulアプリ勉強会～Web開発ワークショップ～ - connpass](http://aws-rest-todo.connpass.com/)

[第1回 開発環境の構築](http://aws-rest-todo.connpass.com/event/10444/)でAWS-EC2のインスタンスを作成して開発環境を作っておけば、第n回からでも参加できるようにしています。

- 各参加者が作成したソースは、自分のGitHubアカウントで管理してもらう。
- 主催側のソースは[ここ](https://github.com/suzukishouten-study/rest-study)で管理していて、勉強会の開催時にはここにその回の完成版ソースが載っている状態にしています。

で、勉強会開始時に、
***「各参加者の環境に前回の内容がきちんと終了した状態のソースがある状態」***
から始める必要があるのですが、そのための作業手順を書いたのがこの記事です。

- 前回の内容を途中までやった方
- 前回の内容を完了した方
- 今回から参加の方

によって手順が少し違います。

:warning: 勉強会の内容は、事前にQiitaに投稿して、各参加者がマニュアルとして見られるようにしています。
そこに毎回この手順を書くのもなんなので、別記事にした次第です。各勉強会の投稿からここにリンクします。

## 勉強会の前にこういう状態にしておきたい！

やりたいことは、

- masterブランチを前回の内容を全て終えた状態にする
- 前回分の終了状態となったmasterブランチを元に、今回の作業用ブランチを作成し、チェックアウトする

## 以下の説明の前提

ここでは、

- 前回 = 第4回
- 今回 = 第5回

として話を進めます。第6, 7 回と進んだら適宜読み替えて下さい。

- 前回自分が作業したブランチは、`vol/04`
- 前回分の答えとして主催者が用意したブランチは、`vol/04-finish`
- 今回自分が作業するブランチは、`vol/05`
- 今回分の答えとして主催者が用意したブランチは、`vol/05-finish`

です。

## 手順1 - masterブランチを前回の内容を全て終えた状態にする

#### 前回が作業途中の方はまずこれ

とにかくコミットしましょう！途中でもとにかく！
未コミットの変更が残ったままだとGitにいろいろ怒られますので。

:white_check_mark:`git add .`
:white_check_mark:`git commit -m "途中だけどコミット"`
こんな感じで。

#### 次は全員同じ。 fork元をリモートリポジトリとして追加する

第1回勉強会でforkした元のリポジトリをリモートリポジトリとして追加します。
その前に確認。

:white_check_mark:`git remote`
とコマンドを打って、

```bash
origin
upstream
```

と表示される場合はこの作業は終わっています。次へ行きましょう！
`upstream`が表示されない人は次のコマンド。

:white_check_mark:`git remote add upstream https://github.com/suzukishouten-study/rest-study.git`

これでOKです！

#### 次も全員同じ。 upstreamリポジトリから最新を取得する

:white_check_mark:`git fetch upstream`

これでOK！今回分の完成ソースも含めた全てのソースが取得出来ました。

次は、

- 前回の内容を完了した方
- 前回の内容を途中までやった方と今回から参加の方

で少し違うのでご注意！

#### 前回の内容を完了した方

masterブランチを前回の内容を全て終えた状態にします。
前回を完了した方は、`vol/04`ブランチが綺麗に出来上がっているので、これをマージです。

:white_check_mark:`git checkout master`

でmasterブランチをチェックアウト後、

:white_check_mark:`git merge vol/04`

でマージ。これでOK！

#### 前回の内容を途中までやった方と今回から参加の方

masterブランチを前回の内容を全て終えた状態にします。
前回の内容を途中までやった方は`vol/04`が未完成、今回から参加の方は、そもそもブランチがありません。
upstreamリポジトリの`vol/04-finish`ブランチが前回終了状態のソースなので、これをマージです。

:white_check_mark:`git checkout master`

でmasterブランチをチェックアウト後、

:white_check_mark:`git reset --hard upstream/vol/04-finish`

で強制的にマージ。というかリセット。これでOK！

## 手順2 - 前回分の終了状態となったmasterブランチを元に今回の作業用ブランチを作成し、チェックアウトする

masterブランチは手順1で全員同じになったので、この手順2は全員同じ作業です。

今回の作業用ブランチとして、`vol/05`ブランチを作り、チェックアウトします。
`master`ブランチから分岐して`vol/05`ブランチを作成するので、まず`master`ブランチにいることを確認して下さい。
これまでの作業で、既にmasterブランチにいるはずですが念の為。

:white_check_mark: `git branch` でmasterにいることを確認
:white_check_mark: もしmasterにいなかった場合は、`git checkout master` でmasterをチェックアウト

次に、以下コマンドで`vol/05`ブランチを作成します。

:white_check_mark: `git branch vol/05` でブランチを作って
:white_check_mark: `git checkout vol/05` でそのブランチをチェックアウト
または、
:white_check_mark: `git checkout -b vol/05` でブランチ作成とそのブランチのチェックアウトを一度に実行

これでOK！

#### 確認

念のため確認します。

:white_check_mark: `git log` でコミットログを確認してみましょう。


コミットログが出力されます。
前回の最後のコミットが表示されていればOKです。


これでブランチの準備は整いました。
勉強会を始めましょう！

---

# おまけ

コマンドまとめ。上に書いてないコマンドも。勉強会の準備のためによく使ってるもの中心。
:warning: (自分用メモ)

## 勉強会で使っているもの

 まとめるまでもない...詳しくはググりましょう。

- `git add .`
	- 全部ステージ
- `git commit -m "途中だけどコミット"`
	- メッセージを付けてコミット
- `git remote`
	- リモートリポジトリを表示
- `git remote add upstream https://github.com/suzukishouten-study/rest-study.git`
	- upstreamという名前で`https://github.com/suzukishouten-study/rest-study.git`をリモートリポジトリとして登録。
- `git fetch upstream`
	- リモートリポジトリをフェッチ。Clone元は自動でoriginと命名、fork元はupstreamという命名するのがセオリー。かな？
- `git checkout master`
	- masterブランチをチェックアウト。
- `git branch vol/05` 
	- `vol/05`ブランチを作成
- `git checkout -b vol/05`
	- `vol/05`ブランチ作成とチェックアウトを一度に実行
- `git merge vol/04`
	- いまいるブランチにvol/04ブランチをマージ。
- `git reset --hard upstream/vol/04-finish`
	- 今いるブランチを無理やり`upstream/vol/04-finish`ブランチと同じ状態にする。
	- `git reset`については下記リンクが非常に勉強になりました。ありがとうございます！
		- [git reset についてもまとめてみる - murankの日記](http://d.hatena.ne.jp/murank/20110327/1301224770)
		- [[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法 - Qiita](http://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
		- [[git]git reset を取り消す(git reflogの使い方) - dackdive&apos;s blog](http://dackdive.hateblo.jp/entry/2014/09/01/121826)
		- 他にもいっぱいありますがこのへんで。
- `git log`
	- コミットログを確認。
	- `git log --graph`とするとグラフ表示。

## 勉強会の準備で使うもの

ユースケース毎に。


- upstreamに直接push(upstreamにpush権限がある場合のみ可能)
	- `git push upstream vol/05:vol/05-finish`
		- ローカルの`vol/05`をupstreamに`vol/05-finish`という名前でpush
- ブランチ名変更
	- `git branch -m vol/05 vol/05-finish`
		- 現在vol/05ブランチにいるなら、`git branch -m vol/05-finish`でよい。
- ブランチ削除
	- `git branch -d test`
		- testブランチを削除
- 直前コミットを修正。ちょっとだけ修正漏れた、と言う時にコミットを分けたくない時。
	- `git add .`でステージ
	- `git commit --amend`で直前コミットを修正
- 詳細なgit remote
	- `git remote -v`
		- fetch元とpull先のリポジトリのURIが表示される
- 詳細なgit branch
	- `git branch -a`
		- リモートも含め全部表示
	- `git branch -av`
		- 上記に加え、各ブランチの最終コミットハッシュとメッセージも表示
	- `git branch -avv`
		- 上記に加え、リモート追跡ブランチも表示

## 普段使ってるもの

- `git rebase master`
	- masterブランチの修正を取り込む。現ブランチとの分岐位置をすすめる。mergeするよりコミットログを汚さなくてよい。
- `git reset --hard HEAD`
	- 全部きれいに元に戻す。
- `git rebase -i HEAD~n`
	- コミットの修正。HEAD~nの`n`はいくつ前のコミットまで修正するか。いつもググって思い出す。
		- 修正後、やめる場合は`git rebase --abort`
		- 続ける場合は`git rebase --continue`

## その他

イケてる使い方見つけたら追記します。


以上です。