無知な新人がGitに入門したときの備忘録

(※2020年に書いた記事です)

# はじめに

この記事は、無知な新人(私)がGitを使うことになったときの記録です。
自分用の備忘録としてここにおいておきます。

### 参考にさせていただいた記事
 - Gitの基本概念の理解：「[図解！ Gitのブランチ・ツリーをちゃんと読む](https://qiita.com/jesus_isao/items/2a0495c973a4c911c2cc)」
 - 使い方の基礎：「[[Git] 基礎 ~master反映まで~](https://qiita.com/hikaru_/items/dc875b27a515f9ee9284)」
 - リモートにSSH接続するための準備：「[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)」
 - GitHub での Pull Request について：「[【GitHub】Pull Requestの手順](https://qiita.com/aipacommander/items/d61d21988a36a4d0e58b)」

# ０歩目：リポジトリ管理の流れ(GitHub Flow)をざっくり知る
- [GitHub Flow 本家はこちら](https://guides.github.com/introduction/flow/)

#### 変更の樹形図
**commit** は、ある状態と、それに対する変更(差分)を保存します。
commit の履歴は、最初の状態から commit の連なりとして、樹形図のような構造で保存されます。
この樹形図をたどることで、任意の状態まで遡ることができます。
樹形図の枝を**branch**といいます。

#### ざっくり GitHub Flow
こんな感じでしょうか...

1. リモートの master ブランチの状態をローカルに反映(cloneまたはpull = fetch + merge)
2. ローカルの hoge ブランチで編集して変更を保存(commit)
3. ローカルの hoge ブランチをリモートの hoge ブランチに反映(push)
4. リモートの hoge ブランチを master に merge する許可を乞う(pull request)
5. 許可が出ない → コメントや指摘をもらって2に戻る
6. 許可が出た → リモートの hoge ブランチをリモートの master ブランチに merge する
7. 1に戻る


#### 大事なこと
- リモートとローカルは常に同じブランチ構造を保つ
- リモートのmasterブランチに直接pushしない（できない設定にする）
- ローカルのいろんなブランチからpushしない
- コミットの粒度はできるだけ小さく


# １歩目：ローカルにリポジトリを作る
ここから、練習で一連の流れをやってみましょう。
練習用にローカルにディレクトリを作ります。

```sh
$ mkdir gittest
$ cd gittest
```
このディレクトリをGitリポジトリにします。

```sh
$ git init
```
管理するテキストファイル(`sample.txt`とする)を作ります。

```sh
$ echo "Hello Git" >> sample.txt
```
変更を登録します。(`commit` するものを選択)

```sh
$ git add sample.txt
```

`git status` で状態を確認できます。

```sh
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   sample.txt
```

コミットします。`-m`はコミットメッセージ( `"my first commit"`とする)を追加するオプションです。

```sh
$ git commit -m "my first commit"
```
ローカルの`master`ブランチができているのを確認します。` *`は現在のブランチを表しています。

```sh
$ git branch -a
* master
```

変更はすべて保存されました。

```sh
$ git status
On branch master
nothing to commit, working tree clean
```

# ２歩目：リモートにリポジトリを作る

#### 準備
リモートのリポジトリを準備しておきます。今回はGitHubでリモートリポジトリを作りました。

1. [GitHub.com](https://github.com/)で、サインインまたはサインアップして、"Create Repository" から適当な名前をつけてリポジトリを作ります。
2. リポジトリの "Setting" タブの "Deploy keys" にSSH接続のための公開鍵を追加します。公開鍵生成などの設定の仕方は「[GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~](https://qiita.com/shizuma/items/2b2f873a0034839e47ce)」を参考にしました。


リモートのリポジトリを追加します。ちなみに、`origin`はリモートリポジトリを指すラベルのようなものですが、`origin` でなくても好きな名前をつけて大丈夫です。

```sh
$ git remote add origin git@github.com:[ユーザー名]/[リポジトリ名].git
```
リモートのリポジトリが追加されているのを確認します。

```sh
$ git remote -v
origin	git@github.com:[ユーザー名]/[リポジトリ名].git (fetch)
origin	git@github.[ユーザー名]/[リポジトリ名].git (push)
```


# ３歩目：ローカルの変更をリモートに反映する
 

ローカルでブランチの生成と切り替え、コミットまではできるようになりました。

```sh

$ git push origin [push元(ローカル)のブランチ名] : [push先(リモート)のブランチ名(master以外)]
```

- :以下を省略すると、`push`元と同じ名前のリモートのブランチに`merge`される。
- 同じ名前のブランチがない場合は、自動で同じ名前のブランチが生成される。

# ４歩目：プルリクエスト
というわけで、「プルリクエスト」をやってみます。
３歩目でリモートのmaster以外のブランチに反映させた変更を、リモートの `master`に`merge`する際にプルリクエストを作成します。プルリクエストが承認されれば、`merge`できます。「create pull request」からプルリクエストの投稿を行います。変更がリモートの`master`に無事`merge`されれば、一時的にできていたブランチを消すことができます(と言われます)。

# 注意事項

※ローカルでmergeはしない！！
ローカルの(masterでない)作業用ブランチからリモートにpushする。

※ローカルと違う名前でpushしない！！
同じ樹形図を保てない。

※リモートの設定によってはいきなりmasterにpushしようとするとはじくことができる。
「ブランチのアクセス権」を設定しておくことでmasterへのやらかしを防げる。
できればCI環境を整えたい。


## おまけ(もっとわかりたいときのためのメモ)

- こちらオライリーの[蝙蝠本](https://www.oreilly.co.jp/books/9784873114408/)：Gitの仕組みがわかって面白いし勉強になります。
- リモートブランチについて：[Git公式](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)
- [リポジトリのcloneとforkの違い](https://qiita.com/matsubox/items/09904e4c51e6bc267990)
- [詳しくてわかりやすい図解](https://kray.jp/blog/git-pull-rebase/)
- [詳しくてわかりやすい記事がまとまってた](https://www.kaitoy.xyz/tags/git/)