【初心者向け】Gitってなに？③コミットで１ページ使うくらい詳しく！

では実際に触ってみましょう！

:hatching_chick: このシリーズについて :hatched_chick: 
初心者がGitのしくみと流れを把握することに重点を置いているので、することはコミット、プッシュ、プルに絞っています。まずはとにかく挫折せずに一周動かしてみるのが目標！というスタンスなので、その分コマンドの進め方などに注力した内容になってます。

***

## 新規作成とコミットの準備

さて、はじめる前に、gitを使った作業の流れを再度確認してみましょう。

1. 新規作成、もしくはリモートリポジトリからクローンして手元に自分のローカルリポジトリを作る。
2. それを編集し、ローカルリポジトリにインデックスを経てコミットを作成。
3. これまでの変更履歴をローカルリポジトリからリモートリポジトリにプッシュして、自分の変更をアウトプット。
4. 他の人の変更をインプットするために、リモートリポジトリからプルをして変更履歴をダウンロード、自分のローカルリポジトリで編集を加え、１へ戻る


このページでは1と２を進めていきます。

### リポジトリの新規作成

今回は、クローンではなく新規作成のほうでやります。
まず、空のリポジトリを作る為には、このように打ち込んでいきます。
![commit01.png](https://qiita-image-store.s3.amazonaws.com/0/86088/f9831185-a74c-704a-f102-4606a303787e.png)
:closed_book: 解説
最初の**mkdir my_first**ですが、mkdirというのは'make directory'の略、**「ディレクトリを作る」**という意味のコマンドです。 my_firstは作りたいディレクトリ名なので好きな名前でOK。ここではmy_firstという名前の「作業ディレクトリ」を作っています。

次の**cd my_first**ですが、cdは'change directory'の略、**「そのディレクトリへ移動する」**という意味のコマンドです。さぁ、my_firstの中に入りました。

ディレクトリの中から、このディレクトリに対応するリポジトリを作ります。
**git init**　は、**Gitのリポジトリを作成する**コマンドです。initialize・イニシャライズ（初期化）するという意味。
"Initialized empty Git repository in ～どこどこ"、「どこどこに空のGitリポジトリが初期設定されたよ！」と表示が出ていますね。
無事リポジトリができたようである :relaxed: 
"my_first/.git/"とあるので、my_firstディレクトリの中にあるようです。 


確認してみましょう。
いまは、my_firstの中にいますね。では、このように打ち込んでみて下さい。
![commit02.png](https://qiita-image-store.s3.amazonaws.com/0/86088/c1576279-1359-d950-5403-f757f6333551.png)
:closed_book: 解説
**ls**は、ディレクトリ内の**ファイル一覧を確認する**コマンド、**-a**は「特殊なものも全て表示する」という意味です。
すると、その次の行に".git" と表示されましたね。".git"というディレクトリが存在していることが確認できました。
この **".git" が、リポジトリの正体**です。"my_first"に対応するリポジトリは、"my_first/.git" ということです。

### コミットの準備

コミットするには、まず内容が必要ですね。では、my_firstの中になんでもいいのでファイルを作ってみましょう。これはどんな方法でもOKです。

今回はsublime textで作ってみます。（これはGitとは関係ない豆知識です :seedling:）
 "subl 任意のファイル名"はsublime textでファイルを作成するコマンドで、打つと自動的にsublimeが立ち上がり、その題名で新規ファイルが開きます。なにか本文を書き、保存しましょう。
今回はhello.txtを作りました。

そしてもう一度ls -a で中身を確認してみると‥
hello.text が増えましたね。
![commit03.png](https://qiita-image-store.s3.amazonaws.com/0/86088/47a68d0b-46aa-3855-5c70-b99f6e6fbff8.png)

ではこの変化を、**git status**という**リポジトリと作業コピーの状態を確認する**コマンドで確認してみましょう。
![commit04.png](https://qiita-image-store.s3.amazonaws.com/0/86088/8d3375a1-5642-b38b-b43c-aeff0c376018.png)
:closed_book: 解説
"Initial（最初の） commit"とありますね、「これをコミットするなら最初のコミットになるよ」という意味です。
続く"Untracked files:（いろいろ)～hello.txt"は、「トラックされていないファイルは下記です:hello.txt」という意味です。Gitはこのファイルを追いかけていない、つまり**まだインデックスのステージには達していない**ということです。
先程、(いろいろ)とスルーした（）の中を見てみると、「**コミットするもの（つまりインデックス）に追加したければ、git addを使ってね** 」と教えてくれています。

### インデックスに追加

では**git add**してインデックスに追加、そして再度"git status"で確認してみましょう。
![git-add01.png](https://qiita-image-store.s3.amazonaws.com/0/86088/4273c91a-f8e8-0360-76f0-c1fdfce17bb0.png)
今度は少し違う文面になりました。 「Changes to be committed（コミットされる変更は以下の通り）」の下に、「new file: hello.txt」とあります。
前回のstatusの時は赤字でしたが、緑になりましたね。hello.txtに行った変更が、**コミットできる段階まで来たようです**！

## コミット

さあ、ついにコミットです。コマンドは、**git commit**です。
えい！！ :fu: :boom: 

ん‥？
![commit-vim.png](https://qiita-image-store.s3.amazonaws.com/0/86088/0df2cbdf-3622-c7d9-8013-b8ce3015e4db.png)
:closed_book: 解説
画面がvimエディタに切り替わり、入力を求めてきています。
「変更するにあたって、コミットメッセージを入力してください。#で始まる行は無視します。メッセージが空だった場合は、このコミットは中止されます。」と言っています。

### コミットメッセージ
Gitの特徴の一つに、誰がいつ何をしたかを残せるというのがありましたね。
「誰がいつ」は記録として残ります。
「何をしたか」については、Gitが履歴として持てるのは「どのファイルを編集した」という情報なので、具体的に例えば「どの場所にどの文章を入れた」等というのは、その人がメモとして残しておくのです。 
メモを残しておくことで、あとで他の人が履歴を見ても、すぐに内容がわかります。

この時、入力しようとしても画面に入れないことがあるかもしれません。その場合は"i"を押すと中に入れます。（なお、ここの入力で迷った場合はgitではなくvimで検索すると良いです。）
![comitted01.png](https://qiita-image-store.s3.amazonaws.com/0/86088/5716e360-5651-cb63-6d7a-a0db3fcc08d1.png)
「本文にhelloと追加」がコミットメッセージです。
さあ、これでコミット完了！！やっとできたー！ :raised_hands: :sparkles: 

### 履歴の確認

もうひとふんばりして、履歴を確認してみましょう。履歴をみるコマンドは**git log**です。
<img width="730" alt="gitlog.png" src="https://qiita-image-store.s3.amazonaws.com/0/86088/6e0bd1a7-aed3-1068-2275-cffa9d5782fe.png">

:closed_book: 解説
ばっちり、誰がいつ何をしたか、履歴が残っていますね！
さて、コミットは履歴としてリポジトリに格納されていくというお話がありましたね。そのため、コミットオブジェクトにはひとつひとつ**id**がついています。上記の黄色い長い文字列がそれにあたります。ここに変更差分を保存し、いつでも戻れるようになっているのです。

こちらのリンクがわかりやすく、今回も参考にさせて頂きました。
[Gitをはじめからていねいに](https://github.com/Shinpeim/introduction-to-git)
[Git の基礎勉強 Gitによるバージョン管理](http://tracpath.com/bootcamp/learning_git_firststep.html)
ありがとうございました！ :sparkles: 


次は、プッシュとプルについて学んでいきます！