初めてのGitHub　～エンジニアへの第一歩～

# プログラミングを始めるにあたって
これからコードを書き始める皆さんに，1つアドバイスしておくと，

### バージョン管理はめちゃめちゃ大事！！

プログラミングを始めると、コードを書いているうちに、
「あのときのコードの方が良かったけど，どこ変更したか忘れた…」
とか、
「ここを変更したのは良いけど、どういう意図で変更したっけ」
と感じる瞬間が必ずでてきます。そんなときに頼りになるのが 
**バージョン管理** です！

バージョン管理の利点を話すと、
1. 変更履歴を追跡できる
バージョン管理システムを使えば、いつ、誰が、何を変更したのかをすべて記録できます。これにより、問題が発生した場合でもすぐに元の状態に戻したり、どの変更が問題の原因になったのかを特定したりできます。

2. チーム開発が円滑に進む
複数人で開発を行う際には、各メンバーがそれぞれの作業を進めつつも、最終的に1つのプロジェクトに統合する必要があります。バージョン管理システムを使えば、各メンバーの作業内容を簡単に統合でき、誰かの変更が他のメンバーの作業に影響を与えないように管理できます。

3. 安全に開発できる
新しい機能を開発する際、メインコードにいきなり手を加えるのはリスクがあります。メインコードのコピーみたいなものを作成することで（後に話すブランチ機能を使うことで）、メインのコードに影響を与えずに新しい機能の開発を進めることができます。ブランチで十分にテストして問題がないと確認できたら、メインのコードに統合（マージ）することで、安全に新機能を追加できます。

4. コードの保管場所としても役立つ
クラウド上にリポジトリを保存することで、開発マシンが故障してもコードが失われることはありません。GitHubやGitLabなどのリモートリポジトリサービスを使うことで、どこからでもコードにアクセスできます。

そしてこのバージョン管理のためのツールが「**Git**」で，
これをWebサービスとしてインターネット上で使えるのが，タイトルにもある
「**GitHub**」です！
バージョン管理システムの使い方は、プログラミングを始めたばかりの人にとっては少し難しいかもしれませんが、早めに習得しておくことで、将来のプロジェクトやチーム開発で大いに役立ちます。少しずつ慣れていけば、コード管理が驚くほど楽になります！


# この記事のゴール
- GitHubを使うメリットを理解する
- 開発の一連の流れと意味を理解できる
- GitHubをターミナル上で操作することができる

ここまで理解すれば、個人やチームでの開発が円滑に進むようになります！（断言）

なお、この記事はGitHubの使い方を説明する記事となるので，GitのインストールとGitHubの始め方は以下の記事を参照してください。
[Git GitHub の始め方（超入門）](https://qiita.com/mt-blue-sou/items/e28ae0b27a7911c302d5)

[【超入門】初心者のためのGitとGitHubの使い方](https://tech-blog.rakus.co.jp/entry/20200529/git)


---

# GitHubとは
上記でも述べたように、**バージョン管理システム**の1つです。

## GitHubの利点
- **変更履歴を記録**し、異なるバージョン間の差異を確認できる
- **複数の並行するバージョン**を同時に扱うことができる
- **あらゆるファイルを管理可能**（Excelファイルや画像ファイルも含めて）
- **チームで共有**(**個人の場合には他人への引継ぎ**)をして、効率的にプロジェクトを進めることができる
---

# GitHub用語
- **リポジトリ（Repository）**:
プロジェクトを管理する場所。
リポジトリは自分のPC内に記録される「**ローカルリポジトリ**」と、
ネットワーク上に存在する「**リモートリポジトリ**」の2つがあります。
ローカルリポジトリで作業を行ったものを、リモートリポジトリへプッシュする流れが基本的な方法となります。
- **ブランチ（Branch）**: 並行して作業を進めるための分岐
- **コミット（Commit）**: 変更をリポジトリに保存する操作
- **プルリクエスト（Pull Request）**: 変更内容をレビューしてもらい、別ブランチに取り込むための提案
- **マージ（Merge）**: あるブランチで行った変更を別ブランチに取り込む操作
- **フェッチ(Fetch)**: Gitでリモートリポジトリの最新情報をローカルリポジトリに取得する操作のこと。
ただしローカルにその変更は反映されない（以下のPullとはここが異なる）

---

# GitHubの使い方（概要）
**事前準備**: リモートリポジトリを新規作成，あるいはクローン（データファイルを取得）して、ローカル環境に取得

開発のステップは7段階
1. **ブランチを作成**: 新しい作業を始める際にブランチを作成（ブランチを切るともいう。）
2. **プル（Pull）**: 共有のリポジトリから最新の変更を取得（上でのFetch＋Mergeの操作と等価）
3. **アド（Add）**: ローカルでの開発が完了したら、Commitするために変更を一時的にGitに登録
4. **コミット（Commit）**: 作業の変更を確定させ、リポジトリに保存
4. **プッシュ（Push）**: ローカルでの変更を共有のリポジトリに反映
5. **プルリクエストを作成（Pull Request）**：変更内容をメインブランチに統合するために、プルリクエストを作成し、コードレビューを依頼
6. **コードレビュー**  ：チームメンバーがプルリクエストを確認し、問題がなければ承認
7. **マージ（Merge）**: 完成したブランチの内容をメインブランチに統合

また，現在作業しているブランチの場所（git branch），編集の状態（git status）は常に確認しておきましょう．（ [確認コマンド](#確認コマンド)にコマンドを記載 ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795703/a17eb700-5c58-0d95-66a4-647739cfdee0.png)

---

# GitHubの使い方（詳細）
ここからは実際のコマンド上での操作を踏まえて，それぞれのステップの意味を改めて説明します．


## 事前準備：リポジトリを新規作成，あるいはクローンして、ローカル環境にファイルを準備
### リポジトリを新規作成する場合
GitHub上で新しいリポジトリを作成する手順は以下の通り

GitHubにログイン
⇓
GitHubのホームページに移動
⇓
ページ右上にあるプロフィールアイコンをクリックし、「Your repositories」（あなたのリポジトリ）を選択
⇓
"Repositories" ページに移動。このページでは、既存のリポジトリが一覧表示されています。
"New"（新規）ボタンをクリック
⇓
"Create a new repository" で作成



### リポジトリをクローンする場合
### 実行コマンド：
```bash
git clone <リポジトリURL>
cd <リポジトリ名>
```

### 操作の意味：
プロジェクトを開始する前に、リモートリポジトリから全てのファイルと履歴をローカル環境に複製します。クローンが完了すると、ローカルにリポジトリと同名のフォルダが作成され、その中にプロジェクトのすべてのファイルが展開されます。`git clone`コマンドを使うことで、リモートリポジトリの完全なコピーが作成され、ローカル環境で作業ができるようになります。次に、`cd <リポジトリ名>`でクローンされたプロジェクトのディレクトリに移動します。

このステップにより、プロジェクトの基盤が整い、以降の開発作業をローカル環境で進めることが可能になります。リモートリポジトリの最新状態を維持しつつ、安心して開発を進めるために重要な操作です。

次に開発手順のステップを追って説明します。



## 1. ブランチを作成する

### 実行コマンド：
```bash
git checkout -b <ブランチ名>
```

### 操作の意味：
ブランチは、独立した作業スペースを提供します。新しい機能追加やバグ修正を行う際に、メインブランチに影響を与えずに作業を進めるため、まず新しいブランチを作成します。これにより、複数人での作業が効率的に行えるようになります。

---

## 2. プル（Pull）

### 実行コマンド：
```bash
git pull origin <メインブランチ名>
```

### 操作の意味：
リモートリポジトリの最新の変更をローカルに取り込みます。これにより、他のメンバーが行った変更を自分の作業環境に反映し、コンフリクト（他の人と変更箇所が被り、どっちの変更を反映すればいいかわからない状態。）を最小限に抑えられます。
作業開始前にローカルリポジトリを最新の状態を保つことが重要です。

---

## 3. アド（Add）

### 実行コマンド：
```bash
git add .（もしくは「.」の部分をディレクトリ名に変更）
```

### 操作の意味：
ローカルで行った変更を一時的にGitに登録します。この操作により、次のコミットに含める変更が指定されます。変更を確定（コミット）する前に、どの部分をコミットするかを選択できるのが、このステップの役割です。

---

## 4. コミット（Commit）

### 実行コマンド：
```bash
git commit -m "変更内容の説明"
```

### 操作の意味：
登録された変更を確定し、ローカルリポジトリに保存します。コミットメッセージには、行った変更が他の人にわかりやすいように、何を、なぜ変更したかを簡潔に記述します。
これにより、プロジェクトの進捗、変更箇所を履歴として残すことができ、変更前のコードに自由に戻ることが出来ます。

※ここで以下のエラーが出る方へ
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795703/ca5f6ae5-67c2-678c-5aa6-e8b79a8bec68.png" width="600">

このエラーは、あなたはこのリポジトリの変更権限を持ったユーザーですか？という事を聞いています。なので、以下のように入力してください。
```bash
git config --global user.email "あなたのメールアドレス（GitHubに登録したもの）"
git config --global user.name "名前（ここはどんな名前でもOK）"
```
---

## 5. プッシュ（Push）

### 実行コマンド：
```bash
git push origin <ブランチ名>
```

### 操作の意味：
ローカルリポジトリで行った変更をリモートリポジトリに反映させます。他のメンバーがその変更を確認できるようになり、共同作業が進みます。プッシュすることで、リモートリポジトリが最新の状態に保たれます。

---

## 6. プルリクエストを作成する（Pull Request）

### 実行手順：
GitHubのリポジトリページにアクセスし、画面上の「Pull Request」をクリックして新規作成を行います。変更内容を説明し、レビュワーを指定して、プルリクエストを送信します。
![スクリーンショット 2024-09-04 194153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795703/20e1040b-43d4-097a-63f3-e93e4db4f34b.png)
![スクリーンショット 2024-09-04 194140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795703/e08c51fb-da03-0fd4-961e-28b3fe960ab5.png)

### 操作の意味：
プルリクエストは、変更内容をメインブランチに統合するためのリクエストです。このステップで、他のメンバーにレビューを依頼し、コードの品質や整合性を確認します。これにより、メインブランチが安定した状態に保たれます。

---

## 7. コードレビュー

### 操作の意味：
チームメンバーがプルリクエストを確認し、変更内容に問題がないかをチェックします。必要に応じてフィードバックを行い、修正を依頼することもあります。問題がなければ、プルリクエストを承認し、次のマージのステップに進みます。

---

## 8. マージ（Merge）

### 実行手順：
プルリクエストが承認されたら、「Merge」ボタンをクリックして、変更内容をメインブランチに統合します。

### 操作の意味：
メインブランチに変更を統合することで、開発の成果がプロジェクト全体に反映されます。マージが完了したら、不要になったブランチを削除することもおすすめです。これにより、リポジトリが整理され、管理がしやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3795703/70b13dc5-8eea-c7c4-8087-11bf1152bd3a.png)


## 確認コマンド
現在の作業ブランチ情報や，編集状態は常に確認するようにしましょう！
現在作業しているブランチの情報は以下のコマンド
```bash
git branch
```

現在の編集状態は以下のコマンド
```bash
git status
```

---

この詳細な手順に沿って作業することで、GitHubを使った効率的な開発が可能になります。コマンドの実行方法や操作の意味を理解し、チームでの共同作業を円滑に進めていきましょう。
また，「[GitHub Desktop](https://github.com/apps/desktop)」というアプリを利用すれば，
コマンドラインではなく，ボタン操作で，見やすいUIで開発作業を進められるので，このアプリを使うのもありです。

このアプリのインストール方法と使用例は以下の記事を参照してください。
[GitHub Desktopの使い方　Installから使用方法まで完全解説](https://qiita.com/yasu_qita/items/3a24322f0ebdd443ba7e)