ハンズオンで学ぶGit

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Gitのインストール](#Chapter1)
1. [Gitの初期設定](#Chapter2)
1. [ローカルリポジトリの新規作成](#Chapter3)
1. [Gitの基本的なフロー](#Chapter4)
1. [【課題1】addとcommit](#Chapter5)
1. [【課題2】status,diff,log](#Chapter6)
1. [GitHubとの連携](#Chapter7)
1. [リモートリポジトリの作成](#Chapter8)
1. [ローカルリポジトリのプッシュ](#Chapter9)
1. [ブランチとは](#Chapter10)
1. [ブランチを操作する際に必要なコマンド](#Chapter11)
1. [トピックブランチから統合ブランチへの反映](#Chapter12)
1. [【課題3】トピックブランチの作成とマージ](#Chapter13)
1. [コンフリクト](#Chapter14)
1. [【課題4】コンフリクトへの対応](#Chapter15)
1. [git clone](#Chapter16)
1. [その他知っておきたいコマンド](#Chapter17)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Gitのインストール
1\. 下記のページからGitのダウンロードを行う。

https://gitforwindows.org/

2\. 全てデフォルトでインストール。
3\. GitBashを起動し、下記のコマンドを実行後バージョンが表示されればインストール完了。

```sh
git version
```

<a id="#Chapter2"></a>
# 初期設定
1\. GitHubアカウントのユーザー名、メールアドレスを設定
```sh
git config --global user.name "ユーザー名"
git config --global user.email "メールアドレス"
```
2\. 作業用のディレクトリを作成し移動する
```sh
mkdir "ディレクトリ名"
cd "ディレクトリ名"
```
<a id="#Chapter3"></a>
# ローカルリポジトリの新規作成
下記のコマンドを実行し、.gitディレクトリを作成する。このディレクトリ内のファイルによってバージョン管理が行われる。
```sh
git init
``` 

<a id="#Chapter4"></a>
# Gitの基本的なフロー
1. ファイルの変更をステージングエリアへ追加
1. ローカルリポジトリにコミット
1. リモートリポジトリにプッシュする

![スクリーンショット 2023-07-21 172525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/3497f283-577b-806a-ba6c-60e6c69a8dbe.png)

<a id="#Chapter5"></a>
# 【課題1】addとcommit
```sh
git add
git commit
```
1. 自分の名前.txtファイルを作成し、中身に自己紹介を記入しよう
1. 自分の名前.txtをステージングエリアに追加しよう
1. 自分の名前.txtをコミットして、コミットメッセージを追加しよう
1. -m オプションを使ってメッセージ付きコミットを行おう
1. 複数ファイルを一度にaddしよう
1. 複数ファイルを変更し、一部のファイルのみaddしよう

<a id="#Chapter6"></a>
# 【課題2】status,diff,log
```sh
git status
git diff
git log
```
1. git statusコマンドを使ってみよう
1. ファイルを編集してgit statusコマンドで変更されたファイルを確認しよう
1. git diffコマンドで編集差分を確認しよう(新規ファイルと既存ファイルの違いは？)
1. 変更したファイルをaddして再度git statusの結果を見てみよう
1. addしたファイルをcommitして再度git statusの結果を見てみよう
1. git logコマンドでコミット履歴を見てみよう

<a id="#Chapter7"></a>
# GitHubとの連携
今回はSSH接続を利用してローカルリポジトリをGitHubと連携します
1\. 公開鍵・秘密鍵を生成
```sh
cd ~/.ssh
ssh-keygen -t rsa #オプションを聞かれます。今回は全てデフォルトなので3回エンターを押してください。
```

2\. 公開鍵をクリックボードにコピー
```sh
clip < ~/.ssh/id_rsa.pub
```

3\. GitHubに公開鍵を登録
- GitHub>Setting>Access>SSH and GPG keys画面でNew SSH keyボタンを押してkeyを追加する
- titleは適当
- key type はAuthentication Key

4\. 接続を確認
下記のコマンドを実施し、2行目のような返答があれば成功
```sh
ssh -T git@github.com
Hi ○○! You've successfully authenticated, but GitHub does not provide shell access.
```

<a id="#Chapter8"></a>
# リモートリポジトリの作成
1. GitHub>Repositories画面でNewボタンを押して新しいリポジトリを作成する

<a id="#Chapter9"></a>
# ローカルリポジトリのプッシュ
下記のコマンドを実行してローカルリポジトリの状態をリモートリポジトリに反映する
```sh
git remote add origin git@github.com:アカウント名/作成したリポジトリ名.git
#origin にリモートリポジトリを登録
#originとは、リモートリポジトリに対してGitがデフォルトでつける名前
git push origin master
#pushコマンドでローカルリポジトリの状態をリモートリポジトリに反映
```
先程作成したリポジトリをGitHubで表示すると、ローカルリポジトリで作成したファイルが反映されていることが確認できる

<a id="#Chapter10"></a>
# ブランチとは
ブランチとは、Gitに用意された機能の一つで、変更履歴を分岐して記録するためのもの。
同じリポジトリ中であってもブランチはそれぞれ独立に編集出来る。ブランチを使用することで、複数人で同時並行で作業を進めることが出来る。

## ブランチを使用した開発の基本的なフロー
1. リポジトリに最初のコミットを行うとmasterブランチが作成される
1. 統合ブランチ(通常masterを使用する)を決める。統合ブランチはリリース版であり、トピックブランチの分岐元でもあるのでバグの無い状態に保つことが大切。
1. 特定の作業を行うために作成するブランチ(トピックブランチ)を統合ブランチから分岐する形で作成する
1. トピックブランチでの作業が完了したら、トピックブランチでの変更履歴を統合ブランチに取り込む
![スクリーンショット 2023-07-24 183836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/94361ec0-408b-752e-f5e4-f78aff626003.png)

<a id="#Chapter11"></a>
# ブランチを操作する際に必要なコマンド
```sh
git branch # ブランチの一覧表示。行頭に"*"がついているものが現在のブランチ
git branch "ブランチ名" # ブランチの作成
git branch -D "ブランチ名" # ブランチの削除
git checkout "ブランチ名" # ブランチの切り替え
git checkout -b "ブランチ名"  #ブランチの作成と移動を同時に行う
```

<a id="#Chapter12"></a>
# トピックブランチから統合ブランチへの反映
## マージ
ブランチを統合することをマージといい、下記のコマンドで行う
```sh
git merge "取り込みたいブランチ名" # 指定したブランチの変更履歴を現在のブランチに取り込む
```
![スクリーンショット 2023-07-24 190109.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/fddbbb9d-ee8f-f8e8-d644-98267819edd2.png)

## プルリクエスト
マージコマンドによってトピックブランチでの変更を統合ブランチへ取り込むこともできますが、一般的なチーム開発ではGitHubが提供するプルリクエストという機能を使って取り込むことが多い。

プルリクエストとは、各トピックブランチでの変更を他の開発者へ通知する機能のことで、プルリクエストの通知を受けた開発者はコードレビューを行い問題が無ければ統合ブランチへ取り込む。
こうすることで、統合ブランチの状態を安定した状態に保つことが出来る。

![スクリーンショット 2023-07-24 191354.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/42e2216e-ff4b-5607-32fb-a20dbff6717b.png)

## プルリクエストの作成手順
1. GitHub>pull request画面でNew pull requestボタンを押す
1. base:に統合ブランチ、compare:にトピックブランチを指定する
1. タイトル、説明を記入する
1. create pull requestボタンを押す

## プルリクエスト通知を受けたレビュワーの手順
1. 該当のプルリクエストのコミット履歴、統合ブランチとの差分を確認する
1. 問題のある個所にはFiles changedタブから+ボタンを押してコメントを残す
1. 問題がすべて解消されたらConversationタブの下の方にあるMerge pull requestボタンを押してマージする

<a id="#Chapter13"></a>
# 【課題3】トピックブランチの作成とマージ]
1. masterブランチから好きな名前のトピックブランチを作成しよう
1. 作成したトピックブランチへ移動し、新しいファイルを作成しよう
1. 作成したファイルをコミット、プッシュしプルリクエストを作成しよう
1. プルリクエストを確認し、コードの好きな箇所にレビューコメントをつけてみよう
1. プルリクエストから、トピックブランチをmasterブランチへマージしよう

<a id="#Chapter14"></a>
# コンフリクト
複数人で作業していると、同じリポジトリの同じファイル、同じ行に対してブランチごとに異なる変更が加えられることがある。そのような状態の二つのブランチはマージすることが出来ない。
このような状態をコンフリクトと呼び、マージしようとすると下記のようなコンフリクト状況を表現する記述がコンフリクトが発生している行に自動挿入される。

```vim
masterブランチにtopicbranchブランチをマージしようとした場合

<<<<<<< HEAD
コンフリクトしている行(現在のブランチで行われた編集)
= = = = = = =
コンフリクトしている行(マージしようとしたブランチで行われた編集)
>>>>>>> topicbranch
```

コンフリクトが発生した際には、コンフリクトしているファイルの残したい部分だけ残して不要な部分を削除した後、add,commitを行うことで解消できる。

<a id="#Chapter15"></a>
# 【課題4】コンフリクトへの対応
1. masterブランチで「conflict.txt」ファイルを作成し、1行目に「コンフリクトを起こしてみる」と記入し変更をコミットしよう
1. masterブランチから「conflict_branch」ブランチを切り出そう
1. conflictブランチへ移動し、「conflict.txt」ファイルの2行目に「conflictブランチでの編集」と記入し変更をコミットしよう
1. masterブランチへ移動し、「conflict.txt」ファイルの2行目に「masterブランチでの編集」と記入し変更をコミットしよう
1. 「conflict_branch」ブランチをmasterブランチへマージしよう
1. コンフリクトが発生するので、「conflict_branch」ブランチでの変更のみを残してマージを完了させよう

<a id="#Chapter16"></a>
# git clone
Gitでは、下記のコマンドを用いることで既存のリポジトリをローカル環境に複製することもできる。
privateなリポジトリの場合、パスワード認証かSSH公開鍵を利用することでクローンできる。
```sh
git clone "リポジトリのパス"
```
## 【課題5】
お互いのリポジトリをクローンし、プルリクエストを出し合ってみよう

<a id="#Chapter17"></a>
# その他知っておきたいコマンド
## revert
既存のコミットを打ち消すためのコマンド。ID指定したコミットを打ち消すコミットを新しく追加する
```sh
git revert "コミットID"
```

## rebase
mergeと同様ブランチを統合するコマンド。ブランチの分岐点を変えることが出来る。
```sh
git rebase "分岐点として指定するブランチ" # 操作したいブランチ上で実行

# 例)下記のコマンドを実行すると、下の図のように履歴を変更できる
git checkout topic
git rebase master
```
![スクリーンショット 2023-07-25 195611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2885419/c52c1aaa-8d23-2a59-829a-4247b90663b2.png)

## stash
コミットしていない変更を退避することができる。
やりかけの作業を残して他のブランチへ移動したいときに使用する。
```sh
git stash -u # コミットしていない変更を退避する
git stash list # 退避した作業の一覧を確認する
git stash apply stash@{n} #stash listの結果の上からn番目の退避を元に戻す
```

<a id="#reference"></a>
# 参考文献
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

https://backlog.com/ja/git-tutorial/intro/01/