Gitを学ぼう！【1章】

今回はGitについての記事を書いていきたいと思います。
私自身のアウトプットの場となりますので、よろしくお願いいたします。

#Git
Webサイトなどを作る際に、複数人で協力しながら開発していくことがあります。
Gitを使うことでそのような共同開発をスムーズに進めることができます。それではGitの使い方について説明していきます。

##ローカルでGitを使えるようにする
まずは、自分のPC上でGitでのバージョン管理ができる状態にします。
Gitリポジトリを新たに作成するために、次のコマンドで初期化します。

```ruby:ターミナル
$ git init
```

git initは、リポジトリを新規作成するコマンドです。
バージョン管理をしていない既存プロジェクトをGitリポジトリに登録するときや、新規リポジトリを作って開発を始めるときなどに使います。今回は新規リポジトリを作成して作業を始めていきたいと思います。

Testという名前の作業用ディレクトリを作成します。
cdコマンドでホームディレクトリへ移動し、さらにデスクトップに移動します。
mkdirコマンドでディレクトリを作成しcdコマンドで移動します。

```ruby:ターミナル
$ cd
$ cd Desktop
$ mkdir Test
$ cd Test
```

次にTestディレクトリをGitで管理できるようにします。

```ruby:ターミナル
$ git init
Initialized empty Git repository in /Users/アカウント名/Desktop/Test/.git/
```

「git init」の後、上記のような出力されれば初期化成功です。

ls -aコマンドを実行すると.gitディレクトリが存在することが確認できます。
※ -aはlsコマンドのオプションで、.から始まる隠しファイル・ディレクトリを表示するようにします

```ruby:ターミナル
$ ls -a
```

##ファイルの変更（追加/変更/削除）
状況を確認するときは、下記コマンドを使います。

```ruby:ターミナル
$ git status
```

ファイル・ディレクトリを何も作成していない場合、下記のような表示が出力されます。

```ruby:ターミナル
$ git status
On branch master
No commits yet nothing to commit (create/copy files and use "git add" to track)
```

次にtouchコマンドで、test.txtという空のファイルをTestディレクトリに作成します。

```ruby:ターミナル
$ touch test.txt
$ ls
test.txt
```

作成されたことが確認できました。Gitで状況を確認してみます。

```ruby:ターミナル
$ git status
On branch master

No commits yet

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

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

test.txtがUntracked filesの箇所に記載されており、新しく追加されたということを意味しています。

##変更履歴を残す準備をする
「test.txtを新規作成した」という変更履歴を残す準備をします。
git add の後にファイル名を指定することでそのファイルをインデックスに追加できます。
※ この時、まだ変更履歴は保存されていませんので注意してください。

```ruby:ターミナル
$ git add test.txt
```

git statusコマンドで状況を確認してみましょう。

```ruby:ターミナル
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
    new file:   test.txt
```

new file:    readme.txtの部分が、インデックスに新しく追加されたファイルであることを意味しています。

##変更履歴を保存する
それでは、変更履歴として保存します。
インデックスに登録された状態を、ローカルリポジトリにコミットします。

```ruby:ターミナル
$ git commit

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file:   test.txt
#
```

git commitだけ入力すると、上記のようなコミットメッセージを入力する画面になります。
コマンドに続けてメッセージを入力するため、ここでは「:q」を入力して画面を終了してください。

ここで注意なのですが、git commitコマンドを実行した時、下記のようなメッセージが表示される場合があります。

```ruby:ターミナル
$ git commit

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'username@DESKTOP-1CNDDF8.(none)')
```

この場合、gitコマンドにgithubに登録したメールアドレスとユーザー名を設定する必要があります。下記コマンドで設定して下さい。
※ 例えばメールアドレスがtesttest@gmail.com、ユーザ名がTestTestの場合は以下のようになります。

```ruby:ターミナル
$ git config --global user.email testtest@gmail.com
$ git config --global user.name "TestTest"
```

##コミットメッセージを指定
-mを追加することで、コミットメッセージを一緒に指定することができます。 その後ろの""で囲まれたCommit1が、コミットメッセージです。

```ruby:ターミナル
$ git commit -m "Commit1"
[master (root-commit) 0437e56] Commit1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt
```

これで「test.txtファイルを新規作成した」という変更履歴をコミットできました。
git statusコマンドで状況を確認しましょう。

```ruby:ターミナル
$ git status
On branch master
nothing to commit, working tree clean
```

変更されたファイルはすでにコミット済みなので、 「変更履歴が保存されていないファイルはワーキングツリーにはありません」と表示されています。

##差分を確認する
ファイルを変更して前後の差分を確認してみたいと思います。編集前後の変更内容を確認するには git diffコマンドを使用します。

test.txtにcommentと追記して、内容を変更してみましょう。
echoは、メッセージを出力するコマンドです。 >> は、左の結果を右に追記するコマンドです。

```ruby:ターミナル
$ echo "comment" >> test.txt
```

ワークツリーとインデックスの差分を表示します。

```ruby:ターミナル
$ git diff
diff --git a/test.txt b/test.txt
index e69de29..9daeafb 100644
--- a/test.txt
+++ b/test.txt
@@ -0,0 +1 @@
+comment
```

+commentの部分が、commentという文字を追記したということを意味しています。

では、履歴を保存してみましょう。
先ほどの変更をコミットします。

```ruby:ターミナル
$ git add test.txt
$ git commit -m "Commit2"
[master 246245c] Commit2
 1 file changed, 1 insertion(+)
```

これで「test.txtにcommentと追記した」という変更履歴をコミットできました。

##変更履歴を確認する

ここまでで、2回の変更履歴を保存しました。その履歴を、実際に確認してみましょう。履歴を確認するにはgit logコマンドを実行することで、これまでに作成したコミットの履歴を確認できます。

```ruby:ターミナル
$ git log
commit 246245ce4bc0a3ca2e6ca1bc8aa9c256a49333b0 (HEAD -&gt; master)
Author: ユーザ名 <メールアドレス>
Date:   Fri Jul 12 12:12:59 2020 +0900

    Commit2

commit 0437e563b8e8927dedc20b1f883e1fc5475c70f9
Author: ユーザ名 <メールアドレス>
Date:   Fri Jul 12 12:06:19 2020 +0900

    Commit1
```

commitの後に書かれている英数字が、コミットの識別番号になります。
Author:の後には、コミットを作成したユーザーの名前とメールアドレスが表示されます。
Date:の後には、コミットを作成した日時が表示されます。
さらにその下には、コミットするときに入力したコミットメッセージが表示されます。

##履歴を元に前の状態に戻す
では最後に、履歴から過去の状態に戻してみましょう。 「git reset コミット」とすることで、履歴から過去の状態に戻すことが可能になります。「コミット」の部分にコミットの識別番号や位置を指定することで、そのコミットの状態に戻すことができます。

それでは、変更履歴から直前のコミットに状態を戻します。

```ruby:ターミナル
$ git reset HEAD^
Unstaged changes after reset:
M    test.txt
```

HEAD^は、1つ前のコミットのことを指します。
コミットの識別番号を直接指定することも可能です。

では、履歴を再び表示し、1つ前の状態に戻っているか確認してみましょう。

```ruby:ターミナル
$ git log
commit 0437e563b8e8927dedc20b1f883e1fc5475c70f9 (HEAD -&gt; master)
Author: ユーザ名 <メールアドレス>
Date:   Fri Jul 12 12:06:19 2020 +0900

    Commit1
```

「test.txtというファイルを新規作成した」という履歴のみが表示されています。
1つ前の状態に戻ったため、「test.txtにcommentと追記した」という履歴がなくなったことが確認できればOKです。
しかしながら、git resetコマンドは、リポジトリのコミット状態を戻すコマンドであり、ファイルを元の状態に戻すコマンドではありません。
よってtest.txtにはまだcommentという記述が残っています。注意が必要です。

#まとめ
・ローカルリポジトリでのGitの基本コマンドを理解する。
・変更点を知る
・誰が、なぜ変更したのか記録する
・以前の状態に戻す

今回は上記のような作業を行いました。
最後までご覧いただきまして、ありがとうございます。