【初心者向け】GitHubで構成管理を行う際の一連の流れ

# 1.初期設定
構成管理を行う上で一番最初にやるべきことを整理する。ここでやることは基本的に一度だけしかやらないことが多い。
まずはGitHubにユーザ登録を行った後に、次にローカルのコマンドラインから下記のコードを打ち込み、GitHubの初期設定を行う。

```
$ git config --global user.name "GitHubに登録したユーザー名"
$ git config --global user.email GitHubに登録しているメールアドレス
```

続いて、リモートリポジトリをGitHub上で作成する。ローカルリポジトリを既に作成済みであれば、ローカルリポジトリと同じ名称でリモートリポジトリを作成する。ローカルリポジトリも未作成である場合は、下記コードをコマンドラインに打ち込むことで、作業中のワークツリー(フォルダやその中にあるファイル)からローカルリポジトリを新規作成できる。

```
$ git init 
```
*`$ git init`はローカルリポジトリが未作成である場合は新規作成を行い、既に作成済みである場合は初期化を行うコマンドで、gitの管理対象とするためのコマンド


続いて、作成したリモートリポジトリを登録する。
```
$ git remote add origin リモートリポジトリのURL
```
*`git remote add origin URL`とすることで、URLで指定したモートリポジトリをoriginという名前で参照できるようになる。

次に、リモートリポジトリにあるファイルやフォルダを丸ごとローカルへコピーするために`git clone`を実行する。git cloneを実行するとカレントディレクトリにフォルダが新規に作成される。

```
$ git clone リモートリポジトリのURL
```

# 2.リモートリポジトリのコミット内容をローカルへ反映させる

ここではリモートリポジトリ上にある最新のコミット内容をローカルリポジトリへ反映させて、その続きから開発を行う場合を想定した手順を整理する。リモートリポジトリの最新の内容がローカルに反映されている場合や、まだ開発ディレクトリ内で作業をしたい場合はこの章の内容を飛ばして3章へ進む。


### git fetch
他の開発メンバーによるアップデートがあったか確認をするには`git fetch`を行う。git fetchはリモートリポジトリのコミット履歴を取得し、ローカルリポジトリのコミット履歴を更新する。更新するだけで、開発中のファイルは上書きされない。

```
$ git fetch リモート名
```

### git merge
git fetchのコミット履歴の内容を確認したら、`git merge`を行い、ローカルで作業中のファイルを更新する。マージ処理は同一ファイルに行われた変更を統合する処理と、コミットに含まれるファイル全体を統合する処理を行う。この際、どのブランチにマージするかが大事なので、マージを実行したいブランチへ移動する。

```
#どのブランチにいるか確認
$ git branch

#マージしたいブランチへ移動
$ git switch ブランチ名
```
マージを実行したいブランチへ移動できたらマージを実行する。
```
$ git merge マージするブランチ名
```
この際、同じファイルの同じ行に別の変更があった場合は、コンフリクトが発生しマージ処理が一時中断される。どちらのブランチを採用するかはgitでは判断できないため、開発者でこの問題を解決する必要がある。

まずは`git status`コマンドを実行し、マージ処理に失敗したファイルを確認し、手作業でファイルの修正を行う。次に、`git add`コマンドを修正したファイルをインデックスに追加する。この作業をコンフリクトが解消するまで行う。
```
#ディレクトリ内のファイルの状況を確認
$ git status

#修正したファイルをインデックスへ追加
$ git add 修正したファイル名
```

### git pull
`git pull`はリモートリポジトリの更新情報を取得してきて、現在のブランチへマージするコマンドである。いわば、`git pull`は`git fetch`と`git merge`を同時に行う処理である。そのため、マージ処理と同様に、コマンドを実行する時のブランチを確認しておくことと、コンフリクトが発生する可能性があることを念頭に入れる必要がある。

`git pull`と`git fetch + git merge`の使い分けはmainブランチにいるときはpull、mainからブランチを切って作業している時はfetch+mergeを行うと良い。

```
$ git pull リモート名　ブランチ名
```

# 3.ローカルで作業を行い、リモートリポジトリへ反映させる

### ブランチを作成する

ブランチとは複数人で共有リポジトリを用いて開発を行う際に、それぞれ枝分かれしつつも独立して開発できるようにするための機能である。各々の開発メンバーはメインブランチから各自ブランチを切って開発を行い、開発が完了したらメインブランチへ自分の変更内容を取り込んでいく。

まずは自身で開発を行うためのブランチを作成し、そのブランチへ移動する。

```
ブランチを作成
$ git branch ブランチ名

ブランチを切り替える
$ git switch ブランチ名

ブランチを新規作成して切り替える
$ git switch -c ブランチ名
```


### git addとgit commit
ローカルで作業し、その成果をリモートリポジトリへ反映させるための事前準備として、ローカルリポジトリへ更新履歴をコミットする必要がある。作業フォルダからローカルリポジトリへ直接コミットするのではなく、インデックスにファイルを登録する必要がある。

```
#作業ディレクトリからインデックスへコミット対象となるファイルを追加
$ git add ファイル名
$ git add . (全ファイルを追加)

#インデックスに登録したファイルをローカルリポジトリへコミット
$ git commit -m "コミットメッセージ"
```

### 変更内容を確認する
git addやgit commitを実行する前に、変更内容を確認したい時に使うコマンドが`git diff`と`git status`コマンドである。`git diff`は変更内容の確認、`git status`は変更ファイルを確認する為に行う。

```
#リポジトリとディレクトリの変更内容を確認
$ git diff

#リポジトリとインデックスの差分を確認
$ git diff -staged

#ディレクトリとインデックス間の変更ファイルを確認
$ git status
```
ローカルリポジトリの変更履歴を確認する時は`git log`コマンドを実行する。
```
$ git log
```

### 変更内容を修正する
変更内容を修正する時は`git restore`コマンドを実行する。
```
#ディレクトリのファイルの変更をリポジトリの内容に戻す
$ git restore ファイル名

#インデックスに上げた変更を元に戻す
$ git restore -staged 元に戻したいファイル名
```

### リモートリポジトリへpushする
ローカルリポジトリへのコミットや変更内容の確認が出来たら、いよいよリモートリポジトリへ反映させていく。

```
$ git push origin main
```
originは`git remote add`で設定したリモートリポジトリ、mainはpushするブランチ名を入力する。

続いてプルリクエスストをGitHub上で行う。pushされた内容を元にGitHubでプルリクエストを作成し、自身のコードレビュワーなどに確認をしてもらい、問題がなければマージする。

# 参考
・Git の基礎勉強 〜Git によるバージョン管理を使う〜
https://tracpath.com/bootcamp/learning_git_firststep.html

・git fetch, git pull, git cloneは何が違うのか？使い方を実例で解説｜Githubのリモートレポジトリからデータや最新のコミットを取得する方法（クローン、フェッチ、プルの違い）
https://prograshi.com/general/git/difference-of-git-clone-fetch-pull/