gitの基本操作を説明してみた

本記事では、プログラムのソースコードを記録するための分散型バージョン管理システムの一つであるGitの基本的な操作について初学者向けに説明します。

私は入社してすぐの研修でgitの操作が慣れるまで難しく、毎日格闘していました。

というわけでその時の私が見てもわかるように心がけ、説明していきたいと思います。

# 目次
- [分散型バージョン管理システム](#分散型バージョン管理システム)
- [gitのリポジトリ](#gitのリポジトリ)
- [gitの操作](#gitの操作)
    - [事前準備](#事前準備)
        - [usernameとemailの設定](#usernameとemailの設定)
        - [clone（クローン）](#clone（クローン）)
        - [branchの作成](#branchの作成)
    - [作業後の操作](#作業後の操作)
        - [add](#add)
        - [commit](#commit)
        - [push](#push)
    - [その他](#その他)
        - [pull](#pull)
        - [merge](#merge)


# 分散型バージョン管理システム
ファイルの変更を追跡、管理する方法のことをバージョン管理とよんでいます。
その中でも集中型バージョン管理システムと分散型バージョン管理システムの2種類があります。
分散型バージョン管理システムでは各々がパソコン上にリポジトリ（ファイルやディレクトリの状態を記録する場所）を持ち、好きなタイミングで同期をすることができます。

# gitのリポジトリ
gitには以下の2種類のリポジトリがあります。
| リポジトリ | 説明 |
|:-----------|:-----------|
| リモートリポジトリ     |専用のサーバに配置。共有するためのリポジトリ。|
| ローカルリポジトリ|自分のマシン上に配置。自分で使うためのリポジトリ。|

![スクリーンショット 2023-09-08 145032.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/3c965c32-02d2-7c9e-84f7-64418515e97c.png)

ローカルリポジトリで作業をし、リモートリポジトリでソースコードなどを共有することによって
同じリモートリポジトリを共有している人の間で簡単にコードを共有することができます。

# gitの操作
### 事前準備
##### usernameとemailの設定
はじめにnameとemailを以下のように設定します。
ターミナルに入力します。
```terminal
$ git config --global user.name "Your Name"
$ git config --global user.email Your Email
```
`Your Name`と`Your Email`にはそれぞれ自分のものを入れましょう。

##### clone（クローン）
既存のリモートリポジトリをローカルリポジトリに複製します。
以下のコマンドをターミナルに入力します。
```terminal
$ git clone リポジトリURL
```
リポジトリURLはリポジトリによって異なるため、適当なURLを指定します。

##### branchの作成
ブランチとは履歴の流れを分岐して記録するためのものです。
分岐したブランチは他のブランチにの影響を受けないという特徴があります。

基本的にはクローンをしてくる際にメインのブランチをクローンしてくることになります。
メインから自分の作業のブランチを分岐させて作業をすると
メインに影響することなく作業をすることができます。
この時ブランチ名は作業内容が分かるようなブランチ名にしましょう。

現在のブランチの確認をしたい場合は以下のコマンドで確かめることができます。
```terminal
$ git branch
```

ブランチの切り替えをしたいときは以下のコマンドですることができます。
また存在しないブランチへの切り替えを使うと、
新たにブランチを作成し、切り替えることができます。
```terminal
$ git checkout 切り替えたいブランチ名
//存在しないブランチへの切り替え
$ git checkout -b 切り替えたいブランチ名
```
存在しないブランチへの切り替えは`-b`をつけないとエラーになります。

### 作業後の操作
自分のコードを共有したい場合の操作について説明していきます。

Gitではリポジトリとワークツリーの間にはインデックスというものが存在しています。
ワークツリーとは作業を行っている場所、
インデックスとは、リポジトリにコミットする準備をするための場所のことです。

##### add
ワークツリーからインデックスに登録する操作です。
![スクリーンショット 2023-09-08 175352.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/dd0c69ef-8a10-1d1e-ae7c-c857342fcee7.png)

以下のコマンドでaddすることができます。
```terminal
$ git add インデックスに登録したいファイル・フォルダ
```
ファイルやフォルダの指定は相対パスでするようにしてください。
`.`を指定するとファイル全てを登録することができます。

##### commit
インデックスに登録しているファイルをリポジトリに記録する操作です。
以下のコマンドでcommitすることができます。
```terminal
$ git commit -m "コミットメッセージ"
```
基本的にオプションの`-m`でコミットメッセージをつけるようにします。
コミットメッセージは何をしたのか、どんな修正なのかを具体的に記載します。

##### push
ローカルリポジトリの変更をリモートリポジトリへ反映させる操作です。
![スクリーンショット 2023-09-08 175509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/70a54775-7175-1c6a-e3f3-bd225eb217d7.png)

以下のコマンドでpushすることができます
```terminal
//初回のpush
$ git push --set-upstream origin ブランチ名
//2回目以降のpush
$ git push
```
自動的に決まったブランチへのコミットをするのが不安な方は毎回以下のコマンドだと安心です。
```terminal
$ git push origin ブランチ名
```
### その他
##### pull
リモートリポジトリの履歴をローカルリポジトリへ反映させる操作です。
以下のコマンドでpullすることができます。
```terminal
$ git pull
```
実行すると現在のブランチのリモートリポジトリの内容を
ローカルリポジトリに反映させることができます。

##### merge
分岐した履歴を統合する操作です。
以下のコマンドでmergeすることができます。
```terminal
$ git merge 取り込みたいブランチ名
```
<br><br><br>
<br>gitは未経験エンジニアにとって難しいものだと思いますが、
慣れるまでは辛抱です。
この記事が少しでも理解の助けになると幸いです。


##### 参考

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