---
# System prepended metadata

title: eLV Git 勉強会 資料
tags: [event, Github, Git]

---

# eLV Git 勉強会 資料

## 講師 自己紹介

名前：kozzy ([Twitter](https://twitter.com/kozzy0919))

* 都内 Web系 ECサービス フロントエンド、サーバーサイドエンジニア
* Python, Ruby, PHP, JavaScript 色々な言語に浅く広く触れている
* 小学生から社会人まで、プログラミング教育活動経験あり
* ハンズオンイベント等の企画などもよくやるマン

## おことわり

[Gitチートシート(Qiita)](https://qiita.com/kozzy/items/b42ba59a8bac190a16ab)

こちらのチートシートおよび、今回の講義資料では抽象化することでイメージしやすくなればという想いの前提で作られたものなので、厳密に説明仕切れない部分もございます。

あくまで参考程度に、試してみて覚えられそう、と感じていただけたならば使っていただけると幸いです。

また、本資料は public に公開は致しませんのでご了承のほどお願い致します。分からない用語について解説の中で口頭で説明する予定ですが、[用語集](https://hackmd.io/Hi1AlX-tTjGVJbb8oxk_tQ?view#%E7%94%A8%E8%AA%9E%E9%9B%86) と合わせてご確認ください。

また、本勉強会のスタンスとしては `git add` / `git commit` / `git push` などのコマンドは知っているけれど、少しイレギュラーな操作はまだできないかなー、と思われている方をメインターゲットとしております。

## Git とは何？

* Gitとは分散型 **バージョン管理** システムのひとつ
* **バージョン管理** は、ファイルの変更内容や変更履歴を保持して、後から古い状態（バージョン）に戻せるようにするためのもの
* ローカルにリモートリポジトリを複製し、複数人が各々のローカルで変更履歴を利用して自由にファイルの編集やローカルコミットができるのが特徴


## なぜ Git が必要？

> ### 1.1 仕事でエクセルファイルを使用するときどんなステップを踏む？
> 
> 1. ファイルを作成
> 2. 保存する
> 3. 内容変更する
> 4. 保存する
> 5. 内容変更する
> 6. 4~5をエンドレスに・・・
> 
> ### 1.2 マニュアルでファイルのバージョンを管理すると？
> 
> - ファイルのネーミングルールをいくらチーム内で決めても、形骸化してしまう
> - 人間はミスを犯す、全員がルールを守るというのは難しい
> - 結果的に下記のように、どのファイルを見たらいいのかわからなくなってしまう
> 
> ![](https://i.imgur.com/UnBWMph.png)
> 
> どれみればいいの？わかりにく〜い
> 
> ## **....ということは？？**
> 
> ### 1.3 下の流れを自動化できたらいいのかな？🤔🤔🤔
> 
> 1. どのファイルが変更されたのか
> 2. 何が変更されたのか
> 3. どうして変更されたのか
> 4. 誰が変更したのか
> 
> ### 1.4 要するに・・・下の機能があるツールが欲しい！
> 
> - ファイルのバージョンを逐一記録してくれる
> - ファイルの変更内容を記録してくれる
> - チームワークを円滑にすすめられる
> 
> 引用：[初心者のためのGIT & GITHUB](https://www.notion.so/ea5af2fbfb6d4f1e8bfcd21634274f7d)

## Session 1. 基本操作（課題のおさらい）

この章では git を扱う上で必要な基本コマンドを学んでいきます。

まずは、[事前課題](https://hackmd.io/H3rU1JnDSpyHsNO7XVHTrg) の振り返りを行います。

---

事前課題を行なった上で、リポジトリの`git-traning`ディレクトリにcdしてからコマンドライン上で下記の `git log` コマンドを実行してみましょう。

コマンドライン

```
$ git log
```

結果
```
commit 14fcfaf27904dc7ade538e58c3a83503976c5f4a (HEAD -> master, origin/master, origin/HEAD)
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Oct 20 10:04:14 2019 +0900

    Initial commit
```

#### git log 

![](https://i.imgur.com/PfCtqFF.png)

オプション例

`-p`: 各コミットのパッチを表示する
`--oneline`: 表示がコミットごとに１行になる
`--graph`: ブランチやマージの歴史を、ログ出力とともにアスキーグラフで表示する（５章以降でご紹介）

ここで `14fcfaf27904dc7ade538e58c3a83503976c5f4a` と書かれている文字列について説明します。これは `commit ID` と呼ばれているもので、これから説明する操作コマンドの対象とするために利用します。


コマンドライン

```
$ git log -p
```

結果
```
commit 14fcfaf27904dc7ade538e58c3a83503976c5f4a
Author: kozzy0919 <kozzy***@gmail.com>
Date:   Sun Oct 20 10:04:14 2019 +0900

    Initial commit

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e308123
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# git_traning
```

## Session 2. ブランチの作成と変更

ここまでは、Gitの基本となる commit 操作について中心に解説していきました。

この章では branch 操作について説明していきます。

コマンドライン

```
$ git branch
````

結果
```
* master
```

コマンドライン

```
$ git branch new_branch
```

コマンドライン

```
$ git branch
````

結果
```
* master
  new_branch
```

コマンドライン

```
$ git checkout new_branch
$ git branch
```

結果
```
  master
* new_branch
```

#### git branch / checkout

![](https://i.imgur.com/ceL54Jv.png)


次に、ファイルの中身を変更しましょう。

`README.md` (Before)

```
# git_traning

* first change
```

`README.md` (After)

```
# git_traning

* first change
* new message
```

コマンドライン

```
$ git diff
```

結果
```
diff --git a/README.md b/README.md
index bd712a3..5466141 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
 # git_traning

 * first change
+* new message
```

#### git diff

![](https://i.imgur.com/MzZgoEY.png)

ここで、ブランチング話がずれますが、Tips です。

コマンドライン

```
$ git status
```

結果
```
On branch new_branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
```

コマンドライン

```
$ git stash
```

結果
```
Saved working directory and index state WIP on new_branch: 2e771b2 first commit
```

コマンドライン

```
$ git status
```

結果

```
On branch new_branch
nothing to commit, working tree clean
```

コマンドライン

```
$ git stash pop
```

結果

```
On branch new_branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (b1549f37e52a3b05b01b69e20b5c011fec764a94)
```

#### git stash / git stash pop

![](https://i.imgur.com/wjelCZg.png)

コマンドライン

```
$ git add README.md
$ git status
```

結果

```
On branch new_branch
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   README.md
```

コマンドライン

```
$ git commit -m 'second commit'
```

結果

```
[new_branch 08654e1] second commit
 1 file changed, 1 insertion(+)
```

コマンドライン

```
$ git log
```

結果

```
commit 08654e10d051edc2c31bda4adc8b6626a364011a (HEAD -> new_branch)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:31:33 2019 +0900

    second commit

commit 2e771b247414427d96372ecc0a282f282a6aafab (origin/master, origin/HEAD, master)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:24:04 2019 +0900

    first commit

commit 14fcfaf27904dc7ade538e58c3a83503976c5f4a
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Oct 20 10:04:14 2019 +0900

    Initial commit
```

## Session 3. commit の取り消し

この章では、積み上げた commit を取り消す（打ち消す）処理を実施していきます。

次のように、README.mdの内容を編集していきます。

`README.md` (Before)

```
# git_traning

* first change
* new message
```

`README.md` (After)

```
# git_traning

* first change
* new message
* temporary message
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'temporary commit'
```

コマンドライン

```
$ git log
```

結果

```
On branch new_branch
Changes to be committed:
commit b03aa56e48d3ba04ba09d8c41f99c4d2d3c1c441 (HEAD -> new_branch)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:39:09 2019 +0900

    temporary commit

commit 08654e10d051edc2c31bda4adc8b6626a364011a
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:31:33 2019 +0900

    second commit

commit 2e771b247414427d96372ecc0a282f282a6aafab (origin/master, origin/HEAD, master)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:24:04 2019 +0900

    first commit

commit 14fcfaf27904dc7ade538e58c3a83503976c5f4a
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Oct 20 10:04:14 2019 +0900

    Initial commit
```

コマンドライン

```
$ git reset HEAD^
```

結果

```
Unstaged changes after reset:
M	README.md
```

`HEAD^` で直前の commit を指します。

`git log` の結果で2つ目の commit IDである `08654e10d051edc2c31bda4adc8b6626a364011a` （上記の場合） を指定して以下のようにすることでも同じことができます。（前方数文字だけでも実行可）

例
```
$ git reset 08654e10d051edc2c31bda4adc8b6626a364011a
$ git reset 08654e
```

commit ID は各々違ったものになるので、そのまま実行できない点に気をつけてください。

コマンドライン

```
$ git log
```

結果

```
commit 08654e10d051edc2c31bda4adc8b6626a364011a (HEAD -> new_branch)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:31:33 2019 +0900

    second commit

commit 2e771b247414427d96372ecc0a282f282a6aafab (origin/master, origin/HEAD, master)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:24:04 2019 +0900

    first commit

commit 14fcfaf27904dc7ade538e58c3a83503976c5f4a
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Oct 20 10:04:14 2019 +0900

    Initial commit
```

コマンドライン

```
$ git status
```

結果

```
On branch new_branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
```

コマンドライン

```
$ cat README.md
```

結果

```
# git_traning

* first change
* new message
* temporary message
```

`git log` で commit が削除されたことが確認できましたが、追加された１行が削除されていないことも確認できました。

コマンドライン

```
$ git reset --hard HEAD^
```

結果

```
HEAD is now at 08654e1 second commit
```

#### git reset

![](https://i.imgur.com/CUSGGG9.png)


`README.md` (Before)

```
# git_traning

* first change
```

`README.md` (After)

```
# git_traning

* first change
* second temporary message
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'second temporary commit'
```

結果

```
[new_branch 5e687ad] second temporary commit
 1 file changed, 1 insertion(+)
```

コマンドライン

```
$ git revert HEAD
```

今回は現在位置の commit を打ち消す操作をするので `HEAD^` ではなく `HEAD` を指定しましょう。

結果（エディタが vi の場合 `:wq`で保存する）

```
Revert "second temporary commit"

This reverts commit 5e687ad9dc122156140d2c0c068f98204e17bff4.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch new_branch
# Changes to be committed:
#       modified:   README.md
#
```

コマンドライン

```
$ cat README.md
```

結果

```
# git_traning

* first change
* new message
```

追加された１行が削除されていることを確認しました。

コマンドライン

```
$ git log
```

結果

```
On branch new_branch
commit 396e7ac3fe06c7bcdcd69c6c64df61e67107f04d (HEAD -> new_branch)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 01:03:49 2019 +0900

    Revert "second temporary commit"

    This reverts commit 5e687ad9dc122156140d2c0c068f98204e17bff4.

commit 5e687ad9dc122156140d2c0c068f98204e17bff4
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 01:01:46 2019 +0900

    second temporary commit

commit 08654e10d051edc2c31bda4adc8b6626a364011a
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:31:33 2019 +0900

    second commit

commit 2e771b247414427d96372ecc0a282f282a6aafab (origin/master, origin/HEAD, master)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 00:24:04 2019 +0900

    first commit

commit 14fcfaf27904dc7ade538e58c3a83503976c5f4a
Author: kozzy0919 <kozzy***@gmail.com>
Date:   Sun Oct 20 10:04:14 2019 +0900

    Initial commit
```

`git reset --hard` ではコミットのログ自体を削除しているのに対して、`Revert "second temporary commit"` という「Revertさせましたよ」というログを残すコミットを積み上げた上で、ファイルの状態を元に戻しているという点で違いがありますl。


#### git revert

![](https://i.imgur.com/ZXV74IC.png)


## Session 4. git merge による 他 Branch の commit 取り込み

コマンドライン

```
$ git branch
```

結果

```
  master
* new_branch
```

コマンドライン

```
$ git checkout -b merge_traning
```

このコマンドは

* `git branch merge_traning`
* `git checkout merge_traning` 

の２コマンドを行ったものと同じものとなります

結果

```
Switched to a new branch 'merge_traning'
```

コマンドライン

```
$ git branch
```

結果

```
  master
* merge_traning
  new_branch
```

`README.md` (Before)

```
# git_traning

* first change
```

`README.md` (After)

```
# git_traning

* first change
* will be merged
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'will be merged'
$ git log
```

結果

```
commit ef4581afeae6f080107506b05bd0e72338c32278 (HEAD -> merge_traning)
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Nov 24 18:19:11 2019 +0900

    will be merged

commit 307e5d014959b074879b18ff63da9c12b0a3ea16 (new_branch)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 01:15:39 2019 +0900

    Revert "second temporary commit"

    This reverts commit 04cbf41fac644217276dfc541933f476685ada71.

commit 04cbf41fac644217276dfc541933f476685ada71
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 01:15:33 2019 +0900

    second temporary commit
```

コマンドライン

```
$ git checkout master
$ git branch
```

結果

```
* master
  merge_traning
  new_branch
```

`README.md` (Before)

```
# git_traning

* first change
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'master branch commit'
$ git log
```

結果

```
commit bd4cb810b7f25889801b620855e4d380955391ba (HEAD -> master)
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Nov 24 18:33:01 2019 +0900

    master branch commit

commit 307e5d014959b074879b18ff63da9c12b0a3ea16 (new_branch)
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 01:15:39 2019 +0900

    Revert "second temporary commit"

    This reverts commit 04cbf41fac644217276dfc541933f476685ada71.

commit 04cbf41fac644217276dfc541933f476685ada71
Author: kozzy <kozzy***@gmail.com>
Date:   Sat Nov 23 01:15:33 2019 +0900

    second temporary commit
```

コマンドライン

```
$ git merge merge_traning
```

結果

```
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
```

コマンドライン

```
$ git status
```

結果

```
On branch master
Your branch is ahead of 'origin/master' by 4 commits.
  (use "git push" to publish your local commits)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both modified:   README.md
```

### コンフリクトとは
• コードの同じ箇所を複数の人が別々に編集してしまっている状態

### コンフリクトが起きると？
• Git はどちら（または両方）の内容を取り入れたらのかわからない
• GitHub で発行した Pull Requests が自動的にマージできない

コマンドライン

```
$ cat README.md
```

結果

```
# git_traning

* first change
<<<<<<< HEAD
* master branch commit
=======
* will be merged
>>>>>>> merge_traning
```

`<<<<<<< HEAD`  ~ `=======`: 今いる master ブランチ側で変更したコミットにおける内容

`=======` ~ `>>>>>>> merge_traning`: merge_traning ブランチ側で変更したコミットにおける内容


`README.md` (Before)

```
# git_traning

* first change
<<<<<<< HEAD
* master branch commit
=======
* will be merged
>>>>>>> merge_traning
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
* will be merged
```

両方の変更を取り入れる場合は以上のようにします。

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git status // status に問題ないことを確認
$ git commit // Merge の場合は commit message がなくても自動的に追記される
```

結果（エディタが開かれるので保存し、終了する）

```
[master d6891f7] Merge merge_traning branch
```

※ merge をキャンセルする際は `git merge --abort` を実行する

#### git merge

![](https://i.imgur.com/Pe3IdVc.png)

コマンドライン

```
$ git log --graph
```

結果

```
*   commit d6891f7c2333399c72a79794c0373bf0c1241bf3 (HEAD -> master)
|\  Merge: bd4cb81 ef4581a
| | Author: kozzy <kozzy***@gmail.com>
| | Date:   Sun Nov 24 18:54:24 2019 +0900
| |
| |     Merge branch 'merge_traning'
| |
| * commit ef4581afeae6f080107506b05bd0e72338c32278 (merge_traning)
| | Author: kozzy <kozzy***@gmail.com>
| | Date:   Sun Nov 24 18:19:11 2019 +0900
| |
| |     will be merged
| |
* | commit bd4cb810b7f25889801b620855e4d380955391ba
|/  Author: kozzy <kozzy***@gmail.com>
|   Date:   Sun Nov 24 18:33:01 2019 +0900
|
|       master branch commit
```

 
## Session 5. git rebase による 他 Branch の commit 取り込み


コマンドライン

```
$ git branch
```

結果

```
* master
  merge_traning
  new_branch
```

コマンドライン

```
$ git checkout -b rebase_traning
```


`README.md` (Before)

```
# git_traning

* first change
* master branch commit
* will be merged
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'will be rebased'
```

コマンドライン

```
$ git checkout master
```


`README.md` (Before)

```
# git_traning

* first change
* master branch commit
* will be merged
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
* will be merged
* master branch commit2
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'master branch commit2'
$ git log
```

結果

```
commit 7345e307dd59dad44e508f6fa8e55bf57395f41d (HEAD -> master)
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Nov 24 19:08:36 2019 +0900

    master branch commit2

commit 152bf1c98a3cc924fe4793bacfb05a4096daf51f
Merge: bd4cb81 ef4581a
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Nov 24 18:59:32 2019 +0900

    Merge branch 'merge_traning'

commit bd4cb810b7f25889801b620855e4d380955391ba
Author: kozzy <kozzy***@gmail.com>
Date:   Sun Nov 24 18:33:01 2019 +0900

    master branch commit
```

コマンドライン

```
$ git rebase rebase_traning
```

結果

```
First, rewinding head to replay your work on top of it...
Applying: master branch commit2
Using index info to reconstruct a base tree...
M	README.md
Falling back to patching base and 3-way merge...
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
error: Failed to merge in the changes.
Patch failed at 0001 master branch commit2
hint: Use 'git am --show-current-patch' to see the failed patch

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".
```

コマンドライン

```
$ git status
```

```
rebase in progress; onto d5fbd62
You are currently rebasing branch 'master' on 'd5fbd62'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

	both modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
```

コマンドライン

```
$ git add README.md
$ git rebase --continue
$ git log --oneline --graph
```

※ merge をキャンセルする際は `git rebase --continue` の代わりに、 `git rebase --abort` を実行する

結果

```
* 21a3a0c (HEAD -> master) master branch commit2
* d5fbd62 (rebase_traning) will be rebased
*   152bf1c Merge branch 'merge_traning'
|\
| * ef4581a (merge_traning) will be merged
* | bd4cb81 master branch commit
|/
* 307e5d0 (new_branch) Revert "second temporary commit"
* 04cbf41 second temporary commit
* 08654e1 second commit
* 2e771b2 (origin/master, origin/HEAD) first commit
* 14fcfaf Initial commit
```

`merge` した時には2つのコミットが分岐して、統合しているにに対して、 `rebase` した時には 1列 のコミット担っていることを確認しましょう。

#### git rebase

![](https://i.imgur.com/iwuQEbC.png)


## Session 6. git cherry-pick による 他 Branch の commit 取り込み

コマンドライン

```
$ git checkout -b cheery-pick_traning
```

`README.md` (Before)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
* will be cherry-picked
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'will be cherry-picked'
```

`README.md` (Before)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
* will be cherry-picked
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
* will be cherry-picked
* will be cherry-picked2
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'will be cherry-picked 2'
$ git log --oneline --graph
```

結果

```
* 5d17053 (HEAD -> cheery-pick_traning) will be cherry-picked 2
* 2cc576b will be cherry-picked
* 21a3a0c (master) master branch commit2
* d5fbd62 (rebase_traning) will be rebased
*   152bf1c Merge branch 'merge_traning'
|\
| * ef4581a (merge_traning) will be merged
* | bd4cb81 master branch commit
|/
* 307e5d0 (new_branch) Revert "second temporary commit"
* 04cbf41 second temporary commit
* 08654e1 second commit
* 2e771b2 (origin/master, origin/HEAD) first commit
* 14fcfaf Initial commit
```

上から 2つ目の `will be cherry-picked` の commit ID をコピーして控えておきましょう（上記の場合は `2cc576b`）

コマンドライン

```
$ git checkout master
$ git cherry-pick 2cc576b // <- 控えていた commit ID
```

結果

```
[master ea1aab9] will be cherry-picked
 Date: Sun Nov 24 19:50:23 2019 +0900
 1 file changed, 1 insertion(+)
```

コマンドライン

```
$ git log --oneline --graph
```

結果

```
* ea1aab9 (HEAD -> master) will be cherry-picked
* 21a3a0c master branch commit2
* d5fbd62 (rebase_traning) will be rebased
*   152bf1c Merge branch 'merge_traning'
|\
| * ef4581a (merge_traning) will be merged
* | bd4cb81 master branch commit
|/
* 307e5d0 (new_branch) Revert "second temporary commit"
* 04cbf41 second temporary commit
* 08654e1 second commit
* 2e771b2 (origin/master, origin/HEAD) first commit
* 14fcfaf Initial commit
```

コマンドライン

```
$ cat README.md
```

結果

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
* will be cherry-picked
```

#### git cherry-pick

![](https://i.imgur.com/VEmx16f.png)


## Session 7. Pull Request の作成

コマンドライン

```
$ git push origin master
```

まずは、事前準備で作成した自分の Github 上にある git_traning リポジトリをブラウザから参照しましょう。

https://github.com/{user_name}/git_traning


#### git push

![](https://i.imgur.com/5uvB97N.png)

コマンドライン

```
$ git checkout new_branch
$ git rebase master
```

`README.md` (Before)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
* will be cherry-picked
```

`README.md` (After)

```
# git_traning

* first change
* master branch commit
* will be merged
* will be rebased
* master branch commit2
* will be cherry-picked
* will be merged by pull request
```

コマンドライン

```
$ git diff // 変更箇所の確認
$ git add README.md
$ git commit -m 'pull request traning'
$ git push origin new_branch
```

ここまできたら、再度 git_traning リポジトリをブラウザから参照して、Pull Request を実行していきましょう。

https://github.com/{user_name}/git_traning

![](https://i.imgur.com/gHGizXV.png)

![](https://i.imgur.com/mvNudIT.png)

`Compare & pull request` をクリック。下記のような表示になる。

**重要** :heavy_exclamation_mark: 

`kozyszoo/git_traning` を `{your_githubname}/traning` に変更する

![](https://i.imgur.com/2IaH1sw.png)

記入欄に Pull Request の説明文を追加し、Create pull request を クリック。

![](https://i.imgur.com/M6vkxBp.png)

![](https://i.imgur.com/q3ClFjJ.png)

File changed を選択。

![](https://i.imgur.com/ASoqfWE.png)

![](https://i.imgur.com/szbeykL.png)


`will be merged` の行の左端「`+`」をクリック

![](https://i.imgur.com/gsNlj5L.png)

![](https://i.imgur.com/k0NKbSf.png)

コメントに対するコメントを記入することができる。
ここでは、`Add single comment`をクリックしましょう。

![](https://i.imgur.com/6vQdUNL.png)

![](https://i.imgur.com/4EmfQuq.png)

![](https://i.imgur.com/AB6Xl3X.png)

![](https://i.imgur.com/KwMvdwv.png)

`Code` タブを選択。

![](https://i.imgur.com/THMIPoH.png)

`Merge pull request` をクリックする。
Merge して良いか確認されるので、「`Confirm Merge`」 をクリックする。

![](https://i.imgur.com/eqEOIsT.png)

`Code` タブを選択。

![](https://i.imgur.com/THMIPoH.png)

README.md が変更されていることが確認できる。

![](https://i.imgur.com/SSHHscl.png)

ここで、ローカルにも github 上での変更を取り入れていきます。

コマンドライン

```
$ git checkout master
$ git pull origin master
```

結果

```
remote: Enumerating objects: 1, done.
remote: Counting objects: 100% (1/1), done.
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (1/1), done.
From github.com:kozyszoo/git_traning
 * branch            master     -> FETCH_HEAD
   2e771b2..cb62c90  master     -> origin/master
Updating ea1aab9..cb62c90
Fast-forward
 README.md | 1 +
 1 file changed, 1 insertion(+)
```

#### git fetch / pull

![](https://i.imgur.com/7BZzS6H.png)

## Session 8. その他コマンド

#### git reflog

![](https://i.imgur.com/ge82cTG.png)

`git reset --hard HEAD^` など誤ってしてしまい、必要だった commit を削除してしまった時などに、必ずお世話になるコマンドです。ピンチの時にこのコマンドがあるということだけ知っておけばもしかしたら役に立つでしょう。（できればお世話になりたくないと思いますが。。） 

---

#### git mv / rm

![](https://i.imgur.com/JJySAD6.png)

これらのコマンドはファイル名称を変更したり、削除した後に `git add` をするのと変らないコマンドなので、特別覚えておく必要はないでしょう。

---

#### git rebase -i

筆者がよく使うコマンドとオプションの組み合わせの一つに `git rebase -i` というものがあります。複数のコミットを1つにまとめたりすることができるので、commit の数が多くなってきた時に使います。

参考：https://qiita.com/takke/items/3400b55becfd72769214

## おすすめ学習法

実践で活用することに挑戦してみるのが一番ですが、必要な場面がなければ難しいと思いますので、今回のハンズオンの内容をリポジトリを作成する部分から繰り返しやって素振りしてみると良いのではないかと思います。

## おまけ

### Git 関連便利ツールの紹介

* [Tig](https://jonas.github.io/tig/)
* [Git-Completion](https://github.com/git/git/blob/master/contrib/completion/git-completion.bash)

参考：https://qiita.com/zaramme/items/e12e3db158c61ff03009

---

* [hub]()
* [gibo]()
* [preopen]()

参考：https://dackdive.hateblo.jp/entry/2016/03/28/214912

---

* [Oh my zsh](https://qiita.com/NaokiIshimura/items/249bb1a101b626a59387)

![](https://i.imgur.com/sFVR5oJ.png)

---

* [ghq](https://github.com/motemen/ghq)
* [peco](https://github.com/peco/peco)

参考：https://qiita.com/itkrt2y/items/0671d1f48e66f21241e2

---

* [エイリアス設定](https://qiita.com/unsoluble_sugar/items/ce14e9ce20aa5ba34fe5)

### ブランチモデル 〜 Git Flow と Github Flow 〜

参考：https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%83%A2%E3%83%87%E3%83%AB

### チートシート (DLしてご利用下さい)

![](https://i.imgur.com/iAwQQU9.jpg)

## 宣伝

Techpit（Rails と Vue.js で教材作ってます）
* https://www.techpit.jp/

## アンケート

* https://docs.google.com/forms/d/e/1FAIpQLSfU1ny-BauRDufl45ces5LB26mMSU_eqnW_Y5A640vui9AUUQ/viewform

# 用語集

| 用語               | 解説                                                                                                                                                                                                                                                                                      |
| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| リポジトリ         | > ファイルやディレクトリの状態を記録している場所全体のこと。 変更履歴を管理したいディレクトリをリポジトリの管理下に置くことで、そのディレクトリ内のファイルやディレクトリの変更履歴を記録することができる。<br>参考：https://www.slideshare.net/lunaluna_dev/save-your-history-git-part1min |
| ローカルリポジトリ | > 自分の手元にある実際の作業をするところ （普段の作業はすべてここで。この中でもバージョン管理する。） ゲームで言う「セーブデータ」をどんどん残すイメージ<br>参考：https://www.slideshare.net/lunaluna_dev/save-your-history-git-part1min                                                    |
| リモートリポジトリ | > リモートリポジトリが「共用サーバ」という位置づけ。<br>参考：https://www.slideshare.net/lunaluna_dev/save-your-history-git-part1min                                                                                                                                                        |
| ワーキングツリー               | > Gitの管理下に置かれた、自分が実際に作業をしているディレクトリのことです。作業ディレクトリ、ワークツリー、様々な呼ばれ方をします。 <br>参考：https://zukulog098r.com/git/ |
| インデックス               | > インデックスとは、コミットする前に更新内容の一時的な保存をする場所のことで、ステージとも呼びます。 <br>参考：https://zukulog098r.com/git/ |
| origin             | > リポジトリの場所(URL)の別名 「origin」はデフォルトのリポジトリ  cloneした時にgitが自動で作成する。<br>参考：https://www.slideshare.net/lunaluna_dev/save-your-history-git-part1min                                                                                                ||
| HEAD               | > 今いるブランチの最新のコミットの代名詞を指します。デフォルトではmasterの先頭を表し、HEADが移動することで、使用するブランチが変更されます。 <br>参考：https://zukulog098r.com/git/ |
| Fork               | > forkはGitHubが提供する機能のひとつです。fork は他の開発者のリポジトリを github上でclone(クローン）します。<br>参考：https://zukulog098r.com/git/  |



おすすめ：[【イラストで覚える】初心者のためのGitとGitHub用語集](https://zukulog098r.com/git/) 

## 参考記事

* [サルでもわかるGit入門](https://backlog.com/ja/git-tutorial/)
* [基本操作（clone、add、commit、pushなど）を覚えて、開発出来るようになる](https://www.yoheim.net/blog.php?q=20140104)
* [いまさらだけどGitを基本から分かりやすくまとめてみた](https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0)
* [逆引きGit](https://backlog.com/ja/git-tutorial/reference/)

###### tags: `Git` `Github` `event`
