Git/GitHub基礎まとめ

# はじめに
自身の備忘録として記録する

# GitHubとは？Gitと何が違うの？

Gitはソースコードのバージョンを管理するツール
GitHubはGitを利用した、開発者を支援するWebサービスの名称

Git:GitHubの関係性は動画:Youtubeのようなイメージと似ている。

Gitの仕組みを使っているサービスはGitHub以外にもあるが、GitHubが一番使われている。
Gitの仕組みを使ったツールサービスは、Gitホスティングサービスとも呼ばれる。

▼GitHub以外のGitホスティングサービス例

https://itpropartners.com/blog/8570/

▼参考サイト

https://it-kyujin.jp/article/detail/150/


# GitHub/Git実操作編
下記にて、GitHubおよびGitの基礎操作を記載する。

## リモートリポジトリを作成する
GitHub上で操作を行う。
リモート(ウェブ上)に、バージョンを管理する箱を準備するイメージ。

1. [GitHub](https://github.com/)にログインする。
2. 右上[+]から「New repository」を選択
3. Repository nameを入力/Public or Private/Readme追加するか など入力
**※Repository nameはローカルリポジトリと名前を合わせるのがセオリー**
4. 「Create repository」をクリックし完了

## SSH接続の設定

▼別記事でまとめているのでそちらを確認

https://qiita.com/suke_qiita/items/0ce8b55d0b8af4258dc6

## リモートリポジトリとローカルリポジトリの紐づけ
ローカルリポジトリとリモートリポジトリの紐づけ作業

リモートリポジトリ・ローカルリポジトリ・SSH連携が済んでいることが前提。
カレントディレクトリを紐づけたいファイルにしてからにする。

```:GitHubとの連携
git init
git remote add origin URL
```
URLはGitHubのリモートリポジトリのSSHを入れる。

```:接続できているか確認
git remote -v
```

リポジトリのURLが表示されたらOK！

## GitHub上でissueを作成する
issueとは**課題管理機能**。issueは英語で、日本語に直訳すると「問題」
リポジトリと紐づけて作成することができる。**つまりリポジトリがないと作成ができない。**
機能としてはシンプルで投稿に対してコメントをつけれたりする掲示板機能のようなもの。

前提条件として、リポジトリは作成済みとする。

1. 右上の自身のアイコンから「Your repositories」を選択
2. issueを作成したいリポジトリを選択
3. 上部メニューバーの「issue」を選択
4. 画面右上「New issue」をクリック 
5. titleへ件名、descriptionへ本題を記載
6. 右下「Submit new issue」をクリックして完了 

▼参考サイト

https://seleck.cc/647


## リモートリポジトリからローカル環境へクローンする
リモートリポジトリをローカルへコピーするやり方。
リポジトリのファイルが丸ごと来るので、ダウンロードのようなイメージが近い。

コマンドは`git clone`を使う。実施前提条件として[SSH接続](https://qiita.com/suke_qiita/items/0ce8b55d0b8af4258dc6)ができていること。

ローカル環境のターミナルで下記コマンドを実行。(VScode等)

```:git cloneを使ってローカルへリポジトリをクローン
$ https://github.com/[ユーザー名]/[リポジトリ名].git
```

**カレントディレクトリにファイル生成されるので、ディレクトリ位置に注意！**

## ローカル環境でブランチを切る
ブランチとは、作業スペースを増やすイメージ。
branchは日本語で直訳すると「枝」という意味。

ブランチを作成することを、ブランチを切るともいう。

本番環境を全員で触ってしまうと取り返しがつかないミスがあったときに復元する術がなくなる。
ブランチを細かく切っていると、作業ごとで編集された内容がわかったり、復帰地点を増やせたりすることができる。

セオリーとしては機能ごとでブランチを切るがよい。
(ログイン機能の実装/トップページの作成etc...)

ローカル環境のターミナルで下記コマンドを実施

```:現在あるブランチを確認する
$ git branch
```

```:ブランチを生成する
$ git branch ブランチ名
```

これで、ブランチの生成ができました。
ただ現在のブランチ位置は変わっていないので、`git checkout`を使ってブランチ切り替えする。

```:ブランチの位置を移動する
$ git checkout ブランチ名
```

ブランチ名を作成したブランチ名にすれば、移動することができます。

ほんとに移動できたか確認する場合はもう一度`git branch`をすると、
現在いるブランチに「*」などの印がついているので、確認することができます。

▼参考サイト

https://backlog.com/ja/git-tutorial/stepup/07/

## 変更内容をリモートに反映させる

作業をブランチを切って作業し、変更や更新が完了したら
リモートの環境に反映させる(push～プルリク)

ローカル環境のターミナルで下記コマンドを実行

```
$ git add .
$ git commit -m "コメント"
$ git push origin ブランチ名
```

`git push origin main`という字面で覚えてしまっている人は要注意
かならず`git push origin ブランチ名`とすること。

リモートリポジトリのメインブランチへ反映させる準備は整いましたが
まだ、リモートリポジトリのメインブランチは変わっていません。

ここからはメインブランチへの反映(マージ)方法。

GitHubの対象のリモートリポジトリへ移動
上部メニューのPull requestsをクリックすると、
```
 ブランチ名 had recent pushes a minutes ago
```
のような文言とともに「Compare & Pull request」というボタンが出現している。
「Compare & Pull request」をクリックして、プルリクエスト作成画面へ

```:プルリクエスト画面での操作
1. ブランチの行き先を正しく選択する(ex:main←分けたブランチとなっているか)
2. titleとdescriptionを入力
3. 「Create pull request」をクリックし、プルリクエスト完了
```
コンフリクトがなければ、
「marge pull request」のボタンが出現しているのでクリック
その後「Confirm merge」でマージを完了する。

コンフリクトが発生した場合は次章を参照し解消する。

## GitHub上プルリクエストで発生したコンフリクトを解消する

複数人で作業をしている場合に発生しやすい事案
同じ行に対して異なる編集が加わったりした場合に、コンフリクトが発生する。
「反映したらNGそうな変更になっているけど、どれが正解？」というのをGitHubが教えてくれている状態。

### ローカル環境でコンフリクトを解消する方法

```:解消方法(ローカルにPullし、変更を再Pushする)
1.分けたブランチ上で、git pull origin main
2.コンフリクトが発生している部分を正しい表記に変える。<<<とか>>>とか===も全部消す。
3.git add ./git commit -m "コンフリクト解消"/git push origin ブランチ名
```

GitHub上のPull requestsに戻ると・・・！
「marge pull request」のボタンが出現しているのでクリック
その後「Confirm merge」でマージを完了する。

### GitHub上でコンフリクトを解消する方法
```
1. 対象のプルリクを参照
2. コンフリクトが発生しているエラーメッセージ部にある「Resolve conflicts」をクリック
3. 画面に表示されている内容を正しく修正。<<<とか>>>とか===も全部消す。
4. 右上部、「Mark as resolved」をクリック。
5. 右上に「Commit merge」が出現するのでクリック
```

GitHub上のPull requestsに戻ると・・・！
「marge pull request」のボタンが出現しているのでクリック
その後「Confirm merge」でマージを完了する

▼参考サイト

https://docs.github.com/ja/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-on-github

# その他
Gitに関する疑問点やメモを下記にまとめる

## git cloneとgit pull何が違う？

GitHub上にあるファイルを実行した環境にコピーするという面では同じ役割を持っている。

`git clone`はファイルすべてをコピーする
`git pull`はローカル側とリモート側での差分のみコピーする


##### git clone
すべてのファイル群をカレントディレクトリに複製する。
`git clone`の引数にリポジトリのURLを記載する。
**※カレントディレクトリに同名のディレクトリがある場合使用できない**

**つまり、一番最初のダウンロード時にのみ行うコマンド**



##### git pull
更新されているファイルのみをカレントディレクトリにコピーできるコマンド。
メインブランチだけでなく、他のブランチもブランチ単位で複製できる。

**2回目以降つまり、ファイルの更新・アップデートを行っていくコマンド**

##### まとめると
初回は`git clone`でリモートリポジトリのメインブランチをそのままローカルにコピーして
2回目以降は`git pull`で環境をローカルに下ろして作業するというのがセオリー

https://tech.amefure.com/web-git-clone-push




## 1度マージまで完了しているブランチはもう再プルリクできない？

****結論：直接はできない、ブランチを再作成することで疑似実現はできる****

ブランチをマージするとclosedステータスになる。
そして、ステータスがclosedになっているブランチは再更新・再プルリクはできない。

***マージを終えたブランチは削除するのが一般的***

```:マージが済んでいるブランチの内容をどうしても再度使いたい場合
1.まったく別のブランチを切る
2.使いたいブランチをpullして、疑似的にブランチの複製を行う
3.変更後新規ブランチとしてメインブランチへのマージを試みる
```