Git & GitHubの基本的な使い方　第1回

## はじめに
Gitは、ソースコードのバージョン管理を行うためのツールです。本記事では、Gitの基本的な操作とGitHubを使ってリモートリポジトリにコードをアップロードする方法について記載します。実装方法がメインになります。詳細な理論やイメージを学びたい方は他の資料を参考にしてください。
※ディレクトリの構成やツリーなどについても説明していません。

### 手順一覧
- ローカルでの準備
　1. [**Gitのインストールと基本設定**](#1-ローカル環境でのgitのセットアップ)
　2. [**ローカルリポジトリの作成**](#2-ローカルリポジトリの作成)
　3. [**ファイルの追加とコミット**](#3-ファイルの追加とコミット)
- リモートでの準備
　4. [**GitHubアカウントの作成**](#4-githubアカウントの作成)
　5. [**SSH 公開鍵認証の作成**](#5-SSH公開鍵認証の作成)
　6. [**リモートリポジトリの作成**](#6-GitHubにリモートリポジトリを作成)
　7. [**リモートリポジトリへの接続**](#7-リモートリポジトリにコードをアップロード)

## 1. ローカル環境でのGitのセットアップ

### Gitのインストール
まず、Gitをインストール

- [Git for Windows](https://git-scm.com/download/win)
- **Mac:** `brew install git`
- **Linux:** `sudo apt install git`

インストール後、以下のコマンドでバージョンを確認

```bash
git --version
```

### ユーザー情報の設定
Gitを使用する前に、ターミナルかGit bashで基本設定を行う

```bash
git config --global user.name "名前"
git config --global user.email "メールアドレス"
```
### 外部エディタの設定（デフォルトはvimなことが多い）
```bash
git config --global core.editor vim
```
### デフォルトブランチの名前をmasterからmainに変更
```bash
git config --global init.defaultBranch main
```
### 設定内容の確認
```bash
cat .gitconfig
```
設定したことが以下のように出力されればOK
```
[user]
        name = 名前
        email = メアド
[core]
        editor = vim
[init]
        defaultBranch = main
```

## 2. ローカルリポジトリの作成

### フォルダの作成
まず、新しいプロジェクト用のフォルダを作成し移動
すでにフォルダを作成しているのであれば、cdで作成済みのフォルダへ移動

```bash
mkdir my-git-project
cd my-git-project
```

### Gitリポジトリの初期化
Gitで管理したいフォルダの初期化を行う

```bash
$ git init
```

これにより、`.git` フォルダが作成され、Gitの管理下に置かれます。

## 3. ファイルの追加とコミット
フォルダ内にあるファイル（orフォルダ）をGitにaddしてcommitする

```bash
$ git add ファイル名（ or フォルダ名）
$ git commit -m "first commit"
```
"first commit"　"updata_日付"などのcommit時のメッセージを記述する。`-m`はcommitのオプションの1つ。

ここまでがローカル環境で実施する内容。
基本的には、フォルダを作成 ➡ 初期化 ➡ add ➡ commitの順番で操作する。ローカル環境でcommitしたものをリモートのGitHubにアップロードするという流れです。
次からはGitHubと連携した操作になります。

## 4. GitHubアカウントの作成
GitHubにアクセスし、自身のアカウントを作成する。
プロジェクトによって複数アカウントを使い分けることも想定されますが、そのような状況は、他のテキストや記事などを参考にしてくだい。
 [GitHub公式サイト](https://github.com/)

## 5. SSH 公開鍵認証の設定
GitHubへの接続にはHTTPSとSSHの2種類の方法があります。SSHを利用すると、毎回パスワードを入力せずに安全にGitHubへアクセスできます。
　5-1. 秘密鍵と公開鍵のペアを作成する
　5-2. ブラウザ経由でGitHubに公開鍵を登録する
　5-3. ターミナルかGit bashからGitHubに秘密鍵を使って認証する
### 5-1. 秘密鍵と公開鍵のペアを作成する
SSH鍵の作成
```bash
$ ssh-keygen -t ed25519
```
出力例：
```
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/yourname/.ssh/id_ed25519): 
```
「Users/yourname/.sshにid_ed25519というファイル名で保存する」という意味。保存場所に特に問題が無ければそのままEnterを押す。
Enterを押すと以下のパスフレーズを聞かれる
```
Enter passphrase (empty for no passphrase):
```
自身のパスワード（なんでもいいが忘れないように）を入力する。なお、パスワードを入力しても、画面には表示されない。
```
Enter same passphrase again:
```
もう一度同じパスワードを入力するよう指示があるので、同じパスワードを入力する。パスワードが一致すると以下のような表示が出力される。
```
Your identification has been saved in /Users/yourname/.ssh/id_ed25519
Your public key has been saved in /Users/yourname/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:hogehoge yourname@デバイス名
The key's randomart image is:
+--[ED25519 256]--+
|      .o+.==+ +. |
|       . ==+ E o.|
|        +=++O + +|
|       ..+=o.  O*|
|        S ..  =+O|
|             . O |
|                *|
|               ..|
|                 |
+----[SHA256]-----+
```
### 5-2. ブラウザ経由でGitHubに公開鍵を登録する
次は作成した公開鍵をGitHubに登録したい。
```bash
$ cat ~/.ssh/id_ed25519.pub
```
上記のコマンドの出力をコピーする（これが登録したい鍵）。直接Users/yourname/.sshに保存されているid_ed25519.pubファイルを開いてコピーしても構わない。
　5-2-1. ブラウザからGitHubにログインする
　5-2-2. 「Settings」→「SSH and GPG keys」→「New SSH key」をクリック
　5-2-3. 「Title」に適当な名前を入力し、「Key」にid_ed25519.pubからコピーした公開鍵を貼り付ける
　5-2-4. 「Add SSH key」をクリック
これでGitHubにSSH公開鍵の登録が完了。

### 5-3. ターミナルかGit bashからGitHubに秘密鍵を使って認証する
最後に登録が完了したら認証できているかを確認する。
```bash
$ ssh -T git@github.com
```
初回接続時には以下のメッセージが出る。yesと入力する。
```
Are you sure you want to continue connecting (yes/no/[fingerprint])?
```
2回目以降の接続では出力されず、以下のメッセージが出る。
```
Enter passphrase for key '/Users/yourname/.ssh/id_ed25519':
```
パスワード入力する。その結果、
```
Hi (GitHubの)username! You've successfully authenticated, but GitHub does not provide shell access.
```
と表示されれば、鍵の登録に成功した。


## 6. GitHubにリモートリポジトリを作成
　6-1. GitHubにログインし、「New Repository」をクリック
　6-2. リポジトリ名を入力し、「Create repository」をクリック
　6-3. リポジトリが作成できたらcode（SSH: `git@github.com:your-username/your-repository.git`）をコピー。

## 7. リモートリポジトリにコードをアップロード
### リモートリポジトリを追加
ローカルリポジトリにリモートリポジトリを登録します。

```bash
git remote set-url origin git@github.com:your-username/your-repository.git
```

### GitHubへpush
リモートリポジトリにローカルの変更をアップロードします。

```bash
git branch -m main
git push -u origin main
```
これで、GitHubへのアップロードは完了です。
最後にGitHubのリポジトリページを開き、`ファイル（ or フォルダ）` がアップロードされていることを確認しましょ！

以下、エラーの思い出を書いておきます。


### エラー
以前、push後に以下のようなエラーが表示されました。
```bash
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/your-username/your-repository.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```
このエラーは、リモートリポジトリにローカルリポジトリにはない変更があるとき発生します（つまり、リモートとローカルで不一致ですよってこと）。
例えば、リモートリポジトリ作成時に.gitignoreやREADMEの作成にチェックを入れるとローカルとリモートで異なる状態のリポジトリが作成されます。

エラー解消方法として、まずリモートの変更を取り込んでから、再度pushする必要があります。
```bash
git pull origin main --rebase
```
`--rebase` オプションを使うことで、リモートの変更をローカルに取り込みます。
その後、再度`push`を実行する
```bash
git push origin main
```
**強制的にpushする方法（非推奨）**
「ローカルの変更を優先してリモートの変更を上書きしたい」場合は、強制 push も可能です。
```bash
git push -f origin main
```
**注意**
- リモートリポジトリの履歴が上書きされるため、他の人がpushした変更を失う可能性がある
- チーム開発では 基本的に使わない

## まとめ
この記事では、
- Gitの基本的な操作（`init`、`add`、`commit`）
- GitHubアカウントの作成
- ローカルリポジトリをGitHubにpushする方法

を説明しました。add、commitのオプションの使い方やlog、差分の確認方法など他の機能についても整理したいと思います。