最低限なGitの使い方

:::note info
編集履歴
2023/09/19 内容を大幅に追記、修正しました。
:::


:::note warn
注意
研究室に所属された後輩用に記述しているため、詳しく記述していません。
もし、おかしな記述等ありましたら、編集リクエストをお願いします。
:::

本記事では、IT系では必須となる「Git」の使い方について説明しています。

「Git」は**ソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システム**のこと。
「GitHub」は **Gitを利用した、開発者を支援するWebサービス**のこと。
上記2つの違いは覚えておいてください。

参考:[いまさら聞けないGitとGitHubの違いって何？](https://www.i3design.jp/in-pocket/3111)



# Gitの使い方
まずは、自分のGitHubのサイトを以下に示します。
![repository.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196752/ffa87154-0672-9f04-a4c2-5ddfcd43ccdc.png)
potyama.github.ioやalgorithmといった名前のものをリモートリポジトリと言います。

リポジトリは、主に2つの使い方をします。
- 複数人とソースコードを共有する
- ファイルやディレクトリの変更履歴を記録する

一方、自分の端末にあるリポジトリのことをローカルリポジトリと言います。

## 自分で作成
後日追記

## リポジトリを取得
取得したいリポジトリをローカルに持っていくことをCloneと言います。
実際にやってみましょう。
![Screenshot from 2019-10-31 10-04-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196752/251d86e1-aa20-c021-2f5b-49627cbafcdd.png)

まず、取得したいリポジトリのページに行き、ページ右上にある「Clone or download」のボタンを押して下さい。

ここで、HTTPSかSSHのどっちでクローンか選べます。
HTTPSだと簡単にできます(事前準備がいらない)が、毎回ユーザー名とTOKENが聞かれます。
TOKENの作り方は下記を参照してください(余裕があったら追記します)。
参考:[Managing your personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens)

ssh-keyを登録すれば、SSHでも問題ないです。好きな方法を選んでください。
今回はHTTPSで説明していきます。

コピーをすると、`https://github.com/potyama/potyama.github.io.git`と行ったURLをコピーできます。
その後、以下のコマンドをターミナルに入力してください。

```terminal:terminal
git clone <コピーしたURL>
```

上記のコマンドを実行後、ディレクトリにpotyama.github.ioというファイルができていると思いますのでそこに移動してください。

## ファイルをリモートリポジトリに送る
例えば、以下のファイルを作成したとします。

```C:hello.c
#include <stdio.h>
int main(){
    printf("HelloWorld\n");
    return 0;
}
```
あくまで、ファイルの作成、削除等といった変更はローカルリポジトリ内の話です。そのため、リモートリポジトリに修正の差分を送信する必要があります。
最初にファイルをGit管理の対象に入れるためにaddする必要があります。

```terminal:terminal
git add hello.c
```

次にGit管理の対象に入れたファイルの変更や追加などを保存するためにcommitしましょう。
コミットするとファイルの変更をgitリポジトリに保存できます。

```terminal:terminal
git commit -m "test"
```
`-m`はコメントを残すことができ、その後にコメントを書いてください。
`test`の部分は好きなように書いて下さい。また、ここは**誰が見てもわかりやすく簡潔に**書くことをおすすめします。
例えば、`よっこらfix`といったコメントだとわからなくなります:relaxed:

最後に、リモートリポジトリにコミット履歴を送信したいのでpushを行います。

```terminal:terminal
git push origin <branch>
```
初期だとbranchはmainだと思います。ただし、実際の開発環境だとmainにpushすることは殆どない(というかしてはいけない)ので自分でbranchを作成し、pushしましょう。
また、originも時と場合により、変わる場合があります。

以上の手順が終わったら、GitHubで自分のリポジトリを見ると先ほどpushしたファイルがあると思います。

## PRを作り方

Pull Request(PR)と呼ばれる機能があります。mainに入れてもよいか許可を取るものと考えてもらえたら良いです。
実際にやってみましょう。

まずは、新しいbranchを作ります。
```terminal:terminal
git branch <branch>
```
今回はtestという名前にします。
入力後、作成できたことを確認しましょう。

```terminal:terminal
$ git branch
* main
  test
```
test branchができたことが確認できました。*があるbranchが今いるbranchです。
次に、test branchに移動してみましょう。
```terminal:terminal
git checkout test
```
これで移動することができました。実際にgit branchで確認すると*がtestに移動していると思います。

移動できていることが確認できたら、適当にファイルを追加しpushしてください。

その後はGitHubで作業を行います。

GitHubに移動すると、下記のような状態担っていると思います。
![Screenshot from 2023-09-21 11-01-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196752/bc19a068-6115-385d-bbb0-4e7154ad7527.png)
上記のPull requests-> New pull requestの順番で押しても、Compare & pull requestを押してもPRの作成はできます。

どちらかのボタンを押すと、以下のような画面が表示されます。
![Screenshot from 2023-09-21 11-03-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196752/cca54582-cb5a-d05e-4c32-ad5f2e558248.png)
タイトル、何を修正したかなどを詳しく書きましよう。
Markdown形式で書くことも可能です。見やすく書きましょう。

最後に右下のCreate pull requestを押すと、PRが作成されます。
![Screenshot from 2023-09-21 11-04-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196752/dd63f242-c45b-f119-23d8-9d861fa1340a.png)

適切にレビューしてもらい、レビューが完了したらmainに取り込むことができます。これをMergeと言います。

開発をしていく際は、branchを作成し、ローカルリポジトリで作業する。こまめにpushをし、作業が完了したらPRを作成と行った流れを心がけてください。

## PRをする上で気をつけること
PRをする前には、以下を気をつけましょう。
- 最新の状態か？
- 動作確認はしたか？
- 余計なものをpushしていないか？

### 最新の状態にする
作業しているときに他の人のPRが受理され、Mergeされている可能性があります。その時は以下のコマンドを実行しましよう。
```terminal
git pull
```
これは、最新のリモートリポジトリをローカルリポジトリにMergeをすることが可能です。
PRを作成する前に関わらず、定期的にpullをすることは心がけましょう。

### 動作確認
pull前に動いていたから、動くだろうとPRを作成するとバグを生み出したり、意図しない動作をする可能性があります。
必ず、pull後に自分の手元で動作確認を行いましょう。

### 余計なファイルをpushしていないか
メモ用に書いていたファイルやPRに関係ないファイルまでpushしていないでしょうか？
確認する際に、PRが複雑となりミスの見逃しとなる可能性があります。
**できるだけ、簡潔にわかりやすく** を心がけましょう。
また、予め、git追跡対象にならないために.gitignoreという仕組みがあります。
詳しくは下記ドキュメントを読んでおいてください。

https://git-scm.com/docs/gitignore

余裕があったら追記します。

# 最後に

まだ追加していく。
気持ちがあれば...

わからなかったら[@PotyaExe](https://twitter.com/PotyaExe)まで連絡お願いします。