Git及びGitHubについて基本知識

# 概要
　初心者にも分かるようにGit及びGitHubの構造・用語説明・基本操作についてまとめてみた。mainブランチ？originってよく見るけど何？クローン？っていう方には見ていただきたい。本記事ではgit-flow開発をベースに書かれている。git-flowの構築については[こちら](https://qiita.com/Yuki-TU/items/87e30281e1f86da437d5)を参考にしてほしい。

# gitの全体像
　git、githubの全体像を画像に示す。ローカルリポジトリは、各パソコンの環境であり、リモートリポジトリは、GitHubなどのソースコード管理Webサービスである。ローカルリポジトリは、さらに実際にソースコートを編集することができる**ローカルブランチ（作業ブランチ）**、リモートブランチの情報を保持し、ローカルブランチとリモートブランチの受け渡しの役割を担う**リモート追跡ブランチ**が存在する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/717054/27312f60-61a9-27be-ac76-67d127c75280.png)




# origin、mainブランチについて
　“main” ブランチは、リリース可能な品質が保証されたブランチを表すことが多い。"main"がよく使われている理由は、ただ単に `$ git init`がデフォルトで作るブランチ名がそうだからというだけのこと。 "origin"は、リモートリポジトリのURL（GitHUbなど）を置き換えた値である。名前が “origin” なのは、`$ git clone` を実行した際のデフォルト名が"origin"であるため。 変更したければ、クローンする際に`$ git clone -o booyah` とすると、デフォルトのリモートブランチは "booyah/main" となる。

# クローンとは？
　クローンは、リモートリポジトリをローカルリポジトリに保存すること。実行するとカレントディレクトリ直下にクローンしてきたプロジェクトが生成される。

```shell:shell
$ git clone [リモートリポジトリのURL]
# 具体例
$ git clone https://github.com/author/repository
```

# リモート追跡ブランチを更新
<!--
　`fetch`コマンドで、リモートリポジトリURLにアクセスし、まだ手元にないデータをすべて取得し、リモート追跡ブランチを更新し、origin/mainが指す先を最新の位置に変更する。
-->
　`fetch`コマンドで、リモートリポジトリURLにアクセスし、まだ手元にないデータをすべて取得し、リモート追跡ブランチを更新する。
　デフォルトであれば、`origin`がリモートブランチURLを表す。`$ git remote -v`で、`origin`のURLの値を見ることができる。引数をつけなければ、デフォルト値となる（この場合`origin`）。



```sehll:shell
$ git fetch [リモートブランチURL]
# 具体例
$ git fetch origin
# originの場合は、省略することができる
$ git fetch
```

# ローカルブランチ、リモート追跡ブランチの確認
　`$ git branch -a `を実行することで、ローカルブランチとリモート追跡ブランチを確認することができる。ここでは`develop`、`feature`がローカルブランチであり、接頭語が`remotes/origin/`であるブランチがリモート追跡ブランチである。


```shell:shell
$ git fetch         # リモート追跡ブランチの更新
$ git branch -a     # リモート追跡ブランチとローカルブランチを表示
* develop
  feature
  foo
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/feature/foo
  remotes/origin/feature/hoge
```


# ローカルブランチがどのリモートブランチを追跡しているのかの確認
　ローカルブランチは、リモート追跡ブランチと紐づいている必要がある。前章の例では、ローカルブランチの`develop`と、リモート追跡ブランチの`remotes/origin/develop`が紐づいている。どれが紐づいているか以下のコマンドで確認することができる。

```shell:shell
$ git branch -vv
```


# リモート追跡ブランチをローカルブランチに保存し作業を進める
　リモートリポジトリにはあって、ローカルリポジトリにはない、ブランチが存在する場合がある。そのブランチをローカルに落としてきて作業の続きをしたい場合の方法を記述する。

```shell:shell
$ git checkout -b [ローカルブランチ名] [リモート追跡ブランチ名]

# 具体例
$ git checkout -b issue32 remote/origin/issue32
# 省略版（ローカルブランチ名はissue32で作成される）
$ git checkout --track origin/issue32
```

# 新しく機能追加を行う
　既存の最新ブランチに新しく機能を追加をして作業をやり始める方法を記す。git-flowでは`develop`ブランチが最新ブランチになるため、まずは、developブランチに移動する。git pullで、最新の状態に更新する(詳しくは次章参照)。そして、新しく機能追加をするための作業ブランチを切り、移動し、作業を始めることができる。

```shell:sehll
$ git checkout develop             # 開発ブランチに移動
$ git pull                         # 最新の状態に更新
$ git checkout -b [作成ブランチ名]  # developブランチから作業ブランチを切り、移動
```

# git pullとは？
　`git pull`は、`git fetch`および`git merge`を一つのコマンドにしたものである。最新の状態に更新したいローカルブランチに移動し、`git pull`を実行すると、リモートリポジトリ上の最新のリモートブランチに更新される。
　`git merge`では変更箇所を統合することであり、ここではリモートブランチの内容をローカルブランチに統合している。

```shell:shell
$ git checkout develop     # 更新したいブランチへ移動
$ git pull                 # 最新の状態に更新(git fetch + git merge)
```

# git pushとは？
　`git push`では、ローカルブランチで作業した内容をリモートブランチに反映させるためのコマンドである。ローカルブランチに紐づいたリモート追跡ブランチがあれば`git push`だけで、リモートブランチに反映される。無い場合は、作る必要があり、オプション`--set-upstream(-u)`をつけることで、リモート追跡ブランチの作成及び、リモートブランチへの反映をすることができる。これは初回だけであり、次回以降は、`$ git push`だけでリモートブランチに反映される。
　git pushしたら、GitHub上で、プルリクエストを作成するわけであるが、プルリクエストが承認されいざマージする際に、コンフリクトが生じる可能性がある。それをあらかじめ対策するために以下の記事を書いたので参考にしてほしい。

https://qiita.com/Yuki-TU/items/ff849ca5d529a64b8370

```shell:shell
$ git push      # ローカルブランチをリモートブランチへ反映

# ローカルブランチに紐づくリモート追跡ブランチがない場合
$ git push -u origin [ローカルブランチ名]
# 具体例 
$ git push -u origin feature
```

　ローカルブランチに紐づくリモート追跡ブランチがない場合、いちいちローカルブランチ名をコピーするのは、めんどくさい。そこで以下のコマンドでも代替できる。HEADは、現在のブランチの先頭、つまり、コミットの一番新しいものを指している。 そこからブランチ名を取得できるので、ローカルブランチ名を入力することと同じになる。

```
# git push -u origin [ローカルブランチ名] と同じ
$ git push -u origin HEAD
```

# 他メンバーのプルリクエストをローカルで動作確認
1.ローカルにプルリスエストされたブランチを作成する。　

```shell:shell
$ git fetch origin pull/[プルリクエストID]/head:[ローカルへの保存ブランチ名]
# 具体例
$ git fetch origin pull/21/head:feature/issue/21/get_api
```

2.ローカルに作成されたブランチに移動する。

```shell:shell
$ git checkout [ローカルへの保存ブランチ名]
# 具体例
$ git checkout feature/issue/21/get_api
```

# コマンドについてのオプションの意味など調べる
　コマンドのオプションでなにかがわからないことがしばしばある。その時に活用するのが、`$ git help`コマンドだ。オプションがどういった機能をするのかも書かれているため、意外と便利である。 

```shell:shell
$ git help [コマンド名]
# 具体例
$ git help branch
```

# 終わりに
　git,githubについて簡単にまとめた。
間違っている個所があればコメントお願いします。

# 参考
https://qiita.com/uasi/items/69368c17c79e99aaddbf#:~:text=%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E8%BF%BD%E8%B7%A1%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AF%E3%80%8C%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB,%E3%81%95%E3%82%8C%E3%82%8B%E3%81%82%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%9F%E3%81%A8%E3%81%88%E3%81%B0%20origin%2Fmaster%20%E3%81%AF%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88,%E3%81%84%E3%82%8B%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E8%BF%BD%E8%B7%A1%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%A7%E3%81%99%E3%80%82

https://qiita.com/gold-kou/items/7f6a3b46e2781b0dd4a0#remotes%E3%81%A3%E3%81%A6%E4%BD%95

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