---
# System prepended metadata

title: Git / GitHub でコードのバージョンを管理する

---

# Git / GitHub でコードのバージョンを管理する

## 準備

### Git / GitHub に入門する際の資料

- [サル先生のGit入門〜バージョン管理を使いこなそう〜【プロジェクト管理ツールBacklog】](https://backlog.com/ja/git-tutorial/)
  - 初心者向け。まずは目を通しておいてほしいです。
- [Git・GitHubの使い方 · 研究室内 IyatomiLab/wiki Wiki](https://github.com/IyatomiLab/wiki/wiki/Git・Githubの使い方)
  - 研究室OBの [@SyogoShibuya](https://github.com/SyogoShibuya) が書いてくれた wiki です。非常に素晴らしいです。
- [バージョン管理（Git/GitHub） - ソフトウェア1 (2020)](https://eeic-software1.github.io/2020/git/)
  - 東京大学工学部電子情報工学科・電気電子工学科の進学内定者を対象としたソフトウェア１の講義の講義資料ですが、非常にわかりやすいです。
### GitHub に ssh 鍵を登録する

- [GitHub アカウントへの新しい SSH キーの追加 - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account) を参考に ssh 鍵を GitHub に登録しておく

---

## レポジトリを `clone` する

- `git clone` コマンドを使って github にある [`IyatomiLab/nlp-onboarding`](https://github.com/IyatomiLab/nlp-team-onboarding) レポジトリを clone する

```shell
(system) [australia: ~]
$ git clone git@github.com:IyatomiLab/nlp-team-onboarding.git
```
<details>
<summary>コマンド実行結果</summary>

```shell
Cloning into 'nlp-team-onboarding'...
remote: Enumerating objects: 51, done.
remote: Counting objects: 100% (51/51), done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 51 (delta 17), reused 31 (delta 8), pack-reused 0
Receiving objects: 100% (51/51), 55.59 KiB | 262.00 KiB/s, done.
Resolving deltas: 100% (17/17), done.
```

</details>

- clone したレポジトリに移動する

```shell
(system) [australia: ~]
$ cd nlp-team-onboarding/
```

## 新しい `branch` を `checkout` して作る

### `git branch` コマンドで現在のブランチを確認する
- `main` ブランチであることを確認する

```shell
(system) [australia: ~/nlp-team-onboarding]
$ git branch
*  main
```

### `git checkout` コマンドを使って新しいブランチを作る
- ここでは `(ユーザー名)/(ブランチの適当な説明)` という名前でブランチを作る
  - 説明には `XXX のファイルを追加した` や `YYY なファイルを変更した` 等、適切な文言を加える

```shell
(system) [australia: ~/nlp-team-onboarding]
$　git checkout -b (ユーザー名)/(ブランチの適当な説明)
```

<details>
<summary>コマンド実行例</summary>

```shell
(system) [australia: ~/nlp-team-onboarding]
$ git checkout -b pink/add_files
Switched to a new branch 'pink/add_files'
```

</details>

### ブランチが作られたか確認する
- 自身が作成たブランチが表示されており、なおかつ `*` マークが頭に付いて選択させていることを確認する

```shell
(system) [australia: ~/nlp-team-onboarding]
$ git branch
  main
* (ユーザー名)/(ブランチの適当な説明)
```

---

## git の 4 ステップ `git status`, `git add`, `git commit`, `git push` を覚える

レポジトリの clone と branch の checkout はひとまず1回実施すれば大丈夫です。以降、課題解答用のファイル追加・変更の際の以下4ステップの git コマンド実行サイクルが手に馴染むようにしておいてください:

- git status
- [git add](https://hackmd.io/MkkSlqOERHqUur4znNrAeg#%E8%BF%BD%E5%8A%A0%E3%83%BB%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%9F%E3%81%84%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92-add-%E3%81%99%E3%82%8B)
- git commit
- git push

以上を順番に説明していきます。

## 追加・変更したいファイルを `add` する

### 自分用の作業ディレクトリを作成する

- `2022` ディレクトリに移動する
- `ユーザー名` のディレクトリを作成する

```shell
(system) [australia: ~/nlp-team-onboarding]
$ cd 2022/

(system) [australia: ~/nlp-team-onboarding/2022]
$ mkdir (ユーザー名)
```

<details>
<summary>コマンド実行例</summary>

```shell
(system) [australia: ~/nlp-team-onboarding]
$ cd 2022/

(system) [australia: ~/nlp-team-onboarding]
$ mkdir pink

(system) [australia: ~/nlp-team-onboarding/2022]
$ ls
Permissions Size User Group Date Modified    Name
drwxrwxr-x     - pink pink  2022-02-28 18:31  pink # pink ディレクトリが作成されていることを確認する
```

</details>

### 追加しないファイルを予め `ignore` する

- [`.gitignore`](https://docs.github.com/ja/get-started/getting-started-with-git/ignoring-files) ファイルを使って追加したくないファイルを予め無視するようにしておきます
  - データサイズが大きいデータセットや画像ファイル等は追加しないようにします
    - python のキャッシュファイル `__pycache__` や `.DS_Store` ・ `Thumbs.db` といったディレクトリキャッシュ等も追加しないようにすべきです
      - **これらのファイルがある github レポジトリを見つけたら要注意です。おそらくそのコードの品質は高くはありません。使わないことをおすすめします**
  - [`gitignore.io`](https://www.toptal.com/developers/gitignore) から [python 用のテンプレート](https://www.toptal.com/developers/gitignore/api/python) を持ってくると簡単にできます

```shell
(system) [australia: ~/nlp-team-onboarding/2022/pink]
$ vi .gitignore

#
# gitignore.io で作成した python 用の gitignore テンプレートを貼り付ける
#
```  

### 新規作成・変更したファイルを追加 `add` する

- `git add` コマンドを使って変更があったファイルを指定する
  - 例として言語処理100本ノック第50問目を解答するファイルを `git add` してみる

```shell
git add 50.py
```

### ファイルの追加や変更をレポジトリに記録 `commit` する

- `git add` したファイルをレポジトリに記録する
  - 記録する際にどのような変更か `-m` オプションを付けてメッセージを記述する

```shell
git commit -m '言語処理100本ノック第50問目の解答コードを追加'
```

<details>
<summary>コマンド実行例と実行結果</summary>

```shell
(system) [australia: ~/nlp-team-onboarding/2022/pink]
$ git commit -m '言語処理100本ノック第50問目の解答コードを追加'
[pink/add_files 0cbdace] 言語処理100本ノック第50問目の解答コードを追加
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 2022/pink_test/50.py
```
    
</details>