githubを使って最低限のgit操作をやってみよう


# 社内勉強会のためのgit入門

初心者向けにgitの説明をします。

## 目的

* gitの基本コマンド、clone, status, add, commit, pushを使ってみる
* githubでのfork, pull request, mergeをやってみる
* チーム開発をするのに必要なgit操作を最低限理解する

## 前提

事前作業によりgithubにアカウントを作り、公開鍵を登録して鍵を使ってgitコマンドを受け付けられるようにしておきます。

## 作業内容

### fork

次のイメージのForkボタンより自分のリポジトリにリポジトリのコピーを作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/90d67670-a790-5c22-f7f4-d7f44f0ffd51.png)


自分のアカウントにリポジトリのコピーができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/c97017a4-997e-f619-f4b6-99788e174c1c.png)


### clone

自分のリポジトリをcloneして編集してみましょう。

```
$ git clone https://github.com/<your_account>/flask_sv.git
```

### status

編集されたファイルは次のコマンドで確認できます。

```
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   Readme.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	Account.md

no changes added to commit (use "git add" and/or "git commit -a")
$            
```

まだgitリポジトリで管理されていないファイルはUntracked files:に表示されます。

### ステージ登録

編集したら次のように編集ファイルをステージに登録します。

```
$ git add <ファイル名>
```

登録した次のコマンドで登録内容が確認できます。
Changes to be committed: に表示されたファイルはstageに登録された状態となる。

```
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   Readme.md

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	dummy
```

### リポジトリ本登録(コミット)

stageに登録されるの意味は、リポジトリに登録する前の仮登録となります。編集したファイルを複数登録して、まとめて本登録することができます。
本登録する操作はコミットといい、次の操作で行います。

```
$ git commit
```

コマンドを入力するとエディタが開きコミットの内容を入力できます。あとで他の人が何の改修をしたのか解るようにコメントを残しましょう。それは修正内容だけでなく修正の理由なども記載します。また、不具合修正などで片付けずどのような不具合をどう修正したのかも書きましょう。


コミットを行うとローカル(作業PC)上のリポジトリには正式登録されますがグループで使っているリモートリポジトリには登録されていません。リモートに登録するのはpushという作業をします。

```
$ git push
```

初回または、作成したブランチを初めてリモートに登録する時は次のように入力します。

```
$ git push -u origin <branch>
```

### ブランチとマージ

ブランチは何かの作業単位として作ります。例えばWebアプリの検索ボタン追加といった改修の単位で作成すると良いです。
マージは異なるブランチを統合することです。gitは優秀でマージの際に機械で判定できるところは自動的にマージすることができます。
また、githubなどのリポジトリ管理Webアプリを使うとマージを画面上で差分として確認でき、変更に対しコメントを入れることができます。変更者以外もマージを行うことができるのでレビューとして使うことができます。

### githubでのpull requestの送り方

forkして作った自分のリポジトリにpushします。

```
user:flask_sv/ (main✗) $ git push                                                                                                                         [0:06:08]
Username for 'https://github.com': <your_account>
Password for 'https://<your_account>@github.com': 
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 985 bytes | 985.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (4/4), completed with 3 local objects.
To https://github.com/creist-Kaoru-Sato/flask_sv.git
   e6591cd..aad74e3  main -> main
user:flask_sv/ (main✗) $ 
```

pushしたブランチをマージ先としてリポジトリの所有者のリポジトリとブランチを選び[Create pull request]ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/67f2be1e-8ba4-671f-0e8b-5659b1541ab5.png)

プルリクエストの題名とコメントを入力して[Create pull request]ボタンを押下します。
プルリクエストが作成されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/b64e97e2-765a-1776-5530-3199403662bf.png)

### githubでのpull requestのマージ方法

リポジトリの所有者側の画面より[Pull requests]リンクを押下しプルリクエストの確認画面に遷移します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/53f5a1bd-0489-7b94-7b05-076f8231b042.png)

画面下の[Merge pull request]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/5adbdbad-6fdc-dd62-6c7d-e7872b7f4ed3.png)

[Confirm merge]を押下することでマージされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/e4195691-701e-e51f-53b9-828a45b2af26.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/9ae8bd7a-5060-de78-3021-d235d510d441.png)

### 元のリポジトリの変更の取り込み

元のリポジトリで変更があった場合、forkしている場合、次のように表示される。

```
This branch is ? commit behind <リポジトリオーナー>:main
```

右側のFetch upstreamをクリックするとダイアログが開くので[Fetch and merge]を押下すれば変更が自分のリポジトリに反映される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/bb9ee52c-2db4-ad28-cd34-01fdd1fa0906.png)

```
This branch is even with <リポジトリオーナー>:main
```

と表示されると元のリポジトリと同期が取れている状態となる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284697/994f7b66-bc80-c651-71db-6f89dd95954e.png)