Git＆Githubの基本コマンド操作

# git&GitHubの取説

## はじめに
初学者ですが、gitコマンドに慣れていないためまとめました。
間違えた記述がありましたら、教えていただけると大変助かります。

## 1 Gitの基本
Gitの基本的な流れ
```
[ワークツリー]        ← 変更を加える（編集・削除・追加）
    |
    | git diff（ワークツリーとステージングエリアの差分の確認）
    |
    V
[ステージングエリア]    ← git add（変更を一時保存）
    |
    | git diff --cached（ステージングエリアとリポジトリの差分を確認）
    |
    V
[ローカルリポジトリ]    ← git commit（バージョンを確定）
    |
    | git log（履歴を確認）
    |
    V
[リモートリポジトリ]    ← git push（リモートに反映）
    |
    | git fetch / git pull（リモートの最新状態を取得）
    |
    V
```
## 2 Gitの基本操作
### 2.1 Gitの初期設定
まず、[Git](https://git-scm.com/)をインストールしたら、最初にユーザー名とメールアドレスを設定します。

この設定により、誰がコミットしたのか記録されます。

※今回は、Git Bashで操作することを想定しています。開き方は、Windowsキー + bash　と入力し 【Git Bash】を開いてください。

```bash
git config --global user.name 【ユーザー名】
git config --global user.email 【メールアドレス】

// 登録されているユーザー名とメールアドレスを確認するコマンド
git config --global --list
```

### 2.2 Gitリポジトリの作成
新しく Git の管理を始める場合、リポジトリを作成します。

実行すると、現在のディレクトリに .git フォルダが作成され、Git で管理できるようになります。

※git initを行った際のカレントディレクトリがローカルリポジトリとして使用されます。
```
// リモートリポジトリが無い場合
git init

// すでにリモートリポジトリが存在する場合
git clone 【リモートリポジトリのURL】
```

### 2.3 ファイルの追加とコミット
変更をコミットする前にステージングエリアに追加する必要があります。
```
// ファイルをステージングエリアに追加
git add 【ファイル名】

// 全ての変更をステージングエリアに追加
git add .
```

ローカルリポジトリにコミットする際は、`-m "【コミットメッセージ】" `でメッセージを追加する必要があります。
```
git commit -m "【コミットメッセージ】"

// すでにgitの追跡対象になっている場合
git commit -a -m "【コミットメッセージ】"
```

*よく使うコミットメッセージ*


その後、正常にコミットされたか、履歴を表示して確認します。
```
git log

// 1行ずつ簡潔にログを表示
git log --oneline

// 視覚的にブランチの分岐を表示
git log --graph

// 変更されたファイルと行数を表示
git log --stat

// 全てのブランチのログを表示
// ※git logは原則HEADより過去のコミット情報しか表示しない
git log --all

// 特定のユーザーのコミット情報のみ表示
git log --author="【特定のユーザー名】"

// 各コミットの変更内容(差分)を表示
git log -p
```

### 2.4 Gitの状態を確認する
Gitのファイルの状態を確認する
```
git status
```

Git管理下のファイルを一覧表示する
```
// Gitに管理されている全てのファイルを表示(.gitignoreで無視されているファイルは表示されない)
git ls-files

// Git管理外のファイルを表示
git ls-files --others

// .gitignoreで無視されているファイルを表示
git ls-files --ignored 
```

### 2.5　ファイルの変更を確認する
ワークツリーとステージングエリア、ローカルリポジトリの差分を確認する
```
// ワークツリー（作業領域）とステージングエリアの差分を表示
git diff

// ステージングエリアとローカルリポジトリの差分を表示
git diff --cached

// ワークツリーと最新のコミット（ローカルリポジトリ）の差分を表示
git diff HEAD

// 指定した2つのコミット間の差分を表示
git diff 【コミット1のID】 【コミット2のID】
```

### 2.6 ファイルの削除
Gitの管理下にあるファイルを削除する
```
// ワークツリーとステージングエリアから削除する
git rm -f 【ファイル名】

// ワークツリーには残すが、Gitの管理から外す
git rm --cached 【ファイル名】

// ディレクトリをgit管理下から削除する
git rm -r --cached 【ディレクトリ名】
```

## 3 チーム開発
### 3.1 ブランチで作業の流れを分ける
ブランチとは、作業を並行して進めるための機能 です。

例えば、新機能開発をしながら、バグ修正を別のブランチで行うことができます。

```
// ブランチ一覧を表示する
git branch

// 【新規ブランチ】というブランチを作成
git branch 【新規ブランチ】

// 【新規ブランチ】に切り替え
git checkout 【新規ブランチ】

// 【新規ブランチ】を作成しつつ切り替え
git checkout -b 【新規ブランチ】

// 過去のコミット時にHEADを移動させる
git checkout 【コミットID】

// 過去のコミット時のファイル内容を現在のワークツリーにコピーする
git checkout 【コミットID】　【ファイル名】

// 【ブランチ名】を削除
git branch -d 【ブランチ名】

// ブランチ名を変更
git branch -m 【旧ブランチ名】 【新ブランチ名】
```

### 3.2 作業を統合する
開発中のブランチの変更を、現在のブランチに統合することをマージ（merge） といいます。

※mergeする際は必ず取り込む側のmasterブランチに移動する必要がある(master ← add-featureならmainに移動することが大切)
```
// 【ブランチ名】の変更を現在のブランチに統合
git merge 【ブランチ名】
```


### 3.3 競合を解決する
`code 【競合したファイル名】`でファイルを手動で開き、該当の競合箇所を修正する。
これを適切に修正し、不要な <<<<<<< や >>>>>>> を削除。

```html
<<<<<<< HEAD
現在の変更内容
=======
マージ対象の変更内容
>>>>>>> feature-branch
```

修正後、ステージングに追加し、競合を解決したことをコミットする

### 3.4 早送りマージと3点マージ
早送りマージ（Fast-Forward Merge）は、ブランチの履歴が一直線になっている場合に適用されるマージ方法で、新しいコミットを作らずにブランチのポインタを単純に移動させるため、履歴がシンプルになる
```
// マージ前
main ブランチ
  ↓
A -- B -- C  (feature-A)


// マージ後
main ブランチ (マージ後)
  ↓
A -- B -- C  (main)
```

 三点マージ（Three-Way Merge）は、ブランチが分岐し、それぞれ変更が加えられた場合に適用され、共通の祖先コミットを基に新しいマージコミットを作成するため、履歴が分かりやすくなるがコミット数が増える。

```
// マージ前
main:
  A -- B -- C
    \
     D -- E  (feature-B)

// マージ後
main (マージ後)
  A -- B -- C -- M
    \          /
     D -- E  (feature-B)
```

ffマージでは、マージしたことがコミット履歴に残らず誰がどのタイミングで統合したかわかりにくくなるので、必ず三点マージをする必要がある。

```
git merge --no-ff 【ブランチ名】
```

### 3.5 リモートへ変更を反映させる
ローカルで作業した変更を リモートリポジトリ（GitHubなど） に送ることをプッシュ（push） といいます。

```
// 【ブランチ名】の変更内容をリモートリポジトリに反映させる
git push origin 【branch名】

// 【ブランチ名】の変更内容をリモートリポジトリに反映し、上流ブランチとして設定する
git push -u origin 【branch名】

```

### 3.6 最新の変更内容を取得する
リモートリポジトリの最新の変更を ローカルに取り込む 操作をプル（pull） といいます。

```
git pull origin 【branch名】
```
※git pull したときに 競合 が発生すると、手動で修正する必要があります。

### 3.7 タグで管理する
タグは、コミットにわかりやすい名前を付ける機能です。

```

// 全てのタグを表示する
git tag

// 注釈を含めて全てのタグを表示する
git tag -n

// 最新のコミットに【タグ名】を作成する
git tag 【タグ名】 

// 最新のコミットに注釈付きタグを作成
git tag -a 【タグ名】 -m "【注釈】"

// 過去のコミットに【タグ名】を作成する
git tag 【タグ名】 【コミットID】

// 過去のコミットに注釈付きタグを作成
git tag -a 【タグ名】 -m "【注釈】　【コミットID】"

// タグを削除する
git tag -d 【タグ名】

// 【タグ名】の詳細情報を表示
git show 【タグ名】

// 【タグ名】をリモートにプッシュする
git push origin 【タグ名】
```

### 3.8 リモートリポジトリの管理
```
// リモートリポジトリの最新情報を取得
git fetch

// 設定されているリモートリポジトリの一覧を表示
git remote

// URL付きでリモートリポジトリの一覧を表示
git remote -v

// リモートリポジトリを追加
git remote add 【名前】【リモートリポジトリURL】

// リモートリポジトリを削除
git remote remove 【名前】

//リモートリポジトリの名前を変更
git remote rename 【旧名】 【新名】
```

### 3.9 Gitの操作管理
```
// 操作履歴を表示する
git reflog

// reflogで参照したgit操作番号の変更を破棄する
git reset --hard 【操作履歴番号】

// 【ファイル名】の更新履歴を表示する
git blame 【ファイル名】


```


## 4 各エディターでGithubと連携する
### 4.1 eclipseでリポジトリをクローンする
1. Eclipseを開く
2. [Window] → [Perspective] → [Other] から「Git」を選択
3. Gitリポジトリビューを開く（[Window] → [Show View] → [Other] → 「Git Repositories」）
4. 「Clone a Git repository」ボタンをクリック
5. GitHubのリポジトリURLを入力
 - GitHubのリポジトリにアクセスし、「Code」ボタンをクリック → HTTPSのURLをコピー
 - 例: https://github.com/username/repository.git
 - 「Next」をクリック
6. GitHubの認証情報を入力（アクセストークンをパスワードとして使用）
 - ユーザー名：GitHubのアカウント名、または、メールアドレス
 - パスワード：GitHubのアクセストークン
 - 認証エラーが発生した場合