Git 入門 リポジトリの活用

# Gitについて駆け出しエンジニアがまとめてみた

Gitの基礎を一通り学習し終えたので、今回学習したことを記事にまとめて投稿させていただきます。
Qiitaの記事を書くのは初めてなので、拙い部分や修正点などあればアドバイスいただけると非常に嬉しいです。
また、本記事はGitのリポジトリ→リポジトリへの記憶方法を焦点に基礎的な活用方法を順にまとめた記事となります。

## Gitとは
- プログラムのソースコードなどの変更履歴をリポジトリに保存して管理することのできるバージョン管理システム
- 保存したリポジトリをGitHub等で複製することで枝分かれの分担作業ができ、チームでの開発に用いることで開発工数の短縮ができる
- 今時の開発で最も使われているバージョン管理システム

## Gitのインストール
本記事ではGitの内容に焦点を合わせていますので、割愛させていただきます。

## Gitリポジトリ
<img width="722" alt="スクリーンショット 2020-06-06 16.56.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613471/783bbd4b-24c2-eeed-5585-0d19ec30e4c5.png">
**大きく４の領域に分けることができる**
1. ワーキングディレクトリ（作業ディレクトリ）
　　ファイルの作成・変更をおこなう領域　≒　コーディング・ファイルの作成や消去
2. ステージングエリア
　　ローカルリポジトリに保存するファイルを集める領域
　　この領域にファイルを集めてからリポジトリに保存しないと、変更履歴は保存されない
3. ローカルリポジトリ
　　ステージングエリアに集めたファイルを保存するリポジトリ
　　変更内容は全てこの領域に保存されており、過去のバージョンに戻るなどの管理ができる
4. リモートリポジトリ
　　インターネット経由(GitHub,Bitbucket...)でアクセスできるリポジトリ
　　ローカルリポジトリをこちらにアップするとインターネット経由でチーム開発等ができる

##基本的なGit活用の流れ
###▪️Gitリポジトリを作成する
「**git init**」コマンドでGitリポジトリを作成する。

```
[] $ git init
```

この時作成されるのは、①〜③の領域でリモートリポジトリは作成されない。
また「git init」を実行したディレクトリには「.git」という隠しディレクトリ生成され、これがGitリポジトリの実体になる

###▪️変更を記録
変更した内容はリポジトリにコミットをすることで保存がされる。
ここで保存した履歴を管理することができます。
(今回は例としてGitSampleディレクトリで行います)
####1.「git status」で変更されたファイルを確認

```
[] $ git status
```
このように実行すると、変更があるファイルがあった場合以下のように教えてくれます。
今回はsample.txtというファイルを作り一行目に「１回目のコミット」と記述して変更を加えたので、sample.txtが表示されます。

```
[] $ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        sample.txt

nothing added to commit but untracked files present (use "git add" to track)
```

####2.「git add ファイル名」で①ワーキングディレクトリから②ステージングエリアへ移動し、リポジトリに保存（コミット）する準備をする

ステージングへの追加方法は複数あり、「**git add ファイル名**」や「**git add ファイル名 ファイル名**」での複数ファイルの指定、「**git add .**」で全てのファイルをステージに一括追加できます。

```
[] $ git add sample.txt
```
変更があったsample.txtをステージに移動しました。
ステージング追加後は再度確認します。

```
[~/Desktop/QiitaCord/GitSample] $ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   sample.txt
```
new file: sample.txtとあり、追加を確認できました。

####3.「git commit -m "コミットメッセージ"」でローカルリポジトリに記録する

commitは「git commit -m 'コミットメッセージ'」と「git commit」で追加する方法があります。
「git commit」ではvim操作が必要になり複雑なので、今回は前者を採用します。

```
[] $ git commit -m 'add sample.txt'
[master (root-commit) ecc2e2f] add sample.txt
 1 file changed, 1 insertion(+)
 create mode 100644 sample.txt
```
これでコミットが完了しました。
今回はコミットメッセージを'add sample.txt'としましたが、場合に応じてわかりやすいメッセージにすると良いです。

###▪️変更履歴を確認
「git log」で変更履歴を確認できます

```
[] $ git log
commit ecc2e2f05eb8db4e3d1cd2d19be2985646c04ce1 (HEAD -> master)
Author: Maru <r51m12a1251@gmail.com>
Date:   Sat Jun 6 18:36:52 2020 +0900

    add sample.txt
```
「sample.txt」がローカルリポジトリにaddされたということが履歴でわかりました。


以上が基本的な流れになります。
以降は少し踏み込んだgitの活用方法をまとめていきます。

## 変更の確認「git diff」
「**git diff ファイル名**」で前回のコミットと現在の変更差分を確認できます。
<img width="389" alt="スクリーンショット 2020-06-06 18.58.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613471/00dbc7ce-f20f-4a2d-a3ac-796502a43681.png"> <img width="389" alt="スクリーンショット 2020-06-06 19.01.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613471/9f785273-bd81-f6dd-c0b0-674c023fb41a.png">
「２回目のコミット」を三行目に追加しました。

```
[] $ git diff sample.txt
diff --git a/sample.txt b/sample.txt
index e8c3915..ebd81e7 100644
--- a/sample.txt
+++ b/sample.txt
@@ -1 +1,3 @@
-1回目のコミット
\ No newline at end of file
+1回目のコミット
+
+２回目のコミット
\ No newline at end of file
```
前回のコミットとの差分を確認できました。
消去内容は-がつき、追加内容には+がつきます。
「git diff」でファイル名を指定しなかった場合は、変更差分のあるファイルを全て一括して確認できます。
「git diff」を実行したあと、次の行へ抜けれないことがありますがキーボードの「Q」を押すと抜け出せます。
また、「git diff」ではステージングしたファイルの変更内容は確認できません。ステージングにあるファイルの変更内容を確認したい場合は「**git diff --cashed**」をすると確認できます。

##ブランチの活用
###▪️ブランチ 　　　branch:木の枝
ブランチとは作業を枝別れして記録・管理をするもの。
別々のブランチで**独立**して作業を進めて一つに統合することができる。
統合されるまではお互いに干渉されることはない。
「git init」をすると「master」というブランチがデフォルトで用意されている。

###▪️ブランチの作成・確認方法
「**git checkout -b ブランチ名**」で作成ができる。
「**git branch**」で現在いるブランチの確認ができる。

```
[] $ git checkout -b develop
M       sample.txt
Switched to a new branch 'develop'

[] $ git branch
* develop
  master
```
developブランチが作成され、developブランチにいることが確認できました。

###▪️ブランチの切り替え
「git checkout ブランチ名」でブランチが切り替わります。

```
] $ git checkout master
M       sample.txt
Switched to branch 'master'

[] $ git branch
  develop
* master
```
切り替えが確認できました。

###▪️全てのブランチの変更履歴を確認
「**git log --oneline --graph --branches**」で全てのブランチの変更履歴が確認できます。 

```
[] $ git log --oneline --graph --branches
* 9267a71 (HEAD -> master) ThirdCommit
| * 40f19a5 (develop) FirstCommit in develop
|/  
* 56dec36 SecondCommit
* c269f75 created sample.txt first commit
```

9267a71(HEAD -> master)と40f19a5(develop)で枝分かれした異なるブランチのログが確認できています。

###ブランチをマージする
「**git merge**」でブランチを統合できます。(Merge:併合する、合併する)
ブランチにわかれて進めた独立作業を一つに統合することでそれぞれのブランチで作った機能などを集約します。

```
[] $ git branch
  develop
* master

[] $ git merge develop
Merge made by the 'recursive' strategy.
 develop.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 develop.txt

[] $  git log --oneline --graph --branches
*   5e1c5c9 (HEAD -> master) Merge branch 'develop'
|\  
| * 40f19a5 (develop) FirstCommit in develop
* | 9267a71 ThirdCommit
|/  
* 56dec36 SecondCommit
* c269f75 created sample.txt first commit

```
masterブランチに統合されました。
このように、今いるブランチに指定したブランチが統合されます。（今回はmasterにいる状態でdevelopを指定した）
「git merge」を実行したあと、次の行へ抜けれないことがありますがキーボードの「Q」を押すと抜け出せます。

###マージ後のコンフリクトを解消する
Conflict:衝突
「marge」後にはそれぞれのブランチの重複部分がコンフリクトすることがあります。
<img width="530" alt="スクリーンショット 2020-06-07 17.40.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613471/9791866c-2ded-9f46-86d8-16cef2689306.png">
このようにお互いのブランチの内容がコンフリクトした場合は、必要な部分を残します。
<img width="530" alt="スクリーンショット 2020-06-07 17.44.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613471/760aff21-8574-a7b0-a4ae-e064354e3135.png">
今回は両方残すことにしたので、不必要な「<<<HEAD」,「===」,「>>>develop」を削りました。
コンフリクト解消後は、コミットをすることで正常にマージが行われます。

##まとめ
長くなるとあまり良くないかと思い、今回はリポジトリの作成→リポジトリへの記憶の方法に焦点を当てて順に説明しました。
gitには他にも過去のバージョンに戻るためのコマンドや便利なコマンドがありますので僕のような駆け出しの方はプログラム勉強の息抜きなど、合間の時間にチョロっと調べるのも良いかもしれません。
ベテランエンジニアや先駆者の方々には拙く雑な文だったかもしれませんが、これからも精進していきますので何卒、何卒暖かい目でお願いします^^;