Gitがわからないと話にならない!! 基本操作をマスターしよう!!

##はじめに
インターン先でプログラミングを勉強中の文系学生。
お世話になっている会社ではGitを使っているみたい。
作業している様子を軽く見せてもらったけど、何をしているかまったく分からん…。
今一度、勉強しなおすか。

##Gitとは
Gitはバージョン管理システムの一種。
組織でアプリケーションやシステムを共同で開発するのには欠かせないツール。
プログラマーの作業を分担したり、分担した作業を統括したりすることができる。
これだけでもバージョン管理システムの重要性が伝わってくる。

勿論、Gitの他にもバージョン管理システムは多数存在している。
その中でもGitが多くの会社から選ばれる理由は2つ。
1つ目は、他のバージョン管理システムより使いやすいこと。
GitはLinuxの開発者が作成したから、プログラミングの基礎が分かっている人であれば十分に使いこなせるはず。
2つ目は、フリーライセンスであること。
使いやすいだけでなく、無料で利用することができる。
選ばない理由を探すほうが難しいくらいかも。

##Gitの基本用語
[Git編：一歩踏み出すフロントエンド入門](https://liginc.co.jp/series/gitbasic)のGitに関する連載記事を基に、情報をまとめておこう。

####リポジトリ
Gitのようなバージョン管理システムは、時系列に沿ってファイルが記録される仕組み。
その記録を保管されるデータベースが`リポジトリ`。
アルバムをイメージしてもらうのが分かりやすいかな？
後になればなるほど、最新のアプリやシステム、コードが保存される。
また、Gitは不可視フォルダでリポジトリを保管する。
Gitでの操作をしなければ、リポジトリのデータを変更、削除することができない。
セキュリティとかに効果があるのかな?
リポジトリと併用されるワードは次の2つ。
**クローン**
**イニット**
`クローン`は言葉のとおり、複製を指す。
`リポジトリのクローン`で以前のリポジトリをコピーすることの意味。
`git clone (リポジトリのパス)`でクローンができる。
`イニット`は初期化かな?
既にあるリポジトリを初期化するのではなく、自分で空っぽのリポジトリを作成することを指す。
`リポジトリのイニット`って言われたときには、「自分でリポジトリを作るんだ」ってことだね。
コマンドは`git init`。

####コミット
リポジトリに今取り組んでいる仕事のコードやファイルを記録することを**コミット**と言う。
上書き保存みたいなイメージでいいのかな?
Gitでは複数のファイルを一気にコミットしたり、1つのファイルを丁寧にコミットすることもできる。
コミットしなければ、ファイルは変更されないから、かなり重要な用語だね。

Gitでコミットすると、自動的にコミットしたユーザー名が記録されて、コミットメッセージを残すことが求められる。
コミットメッセージを簡単に言えば、注釈。
どういう変更を行ったのかを他の人に逐一説明せずに済むのは効率的で良いね。
誰が見ても分かりやすいコミットメッセージを書けるようにしておこうっと。

####ワークツリー
`ワークツリー`は普通のフォルダ構成と同じ。
違うのは、Gitがフォルダの変更を記録していることぐらいかな。
自分が作業しているファイルが、Gitのリポジトリと異なった場合、ファイルごとに行単位で違う箇所を教えてくれる。
コミットをしない限り、リポジトリの内容は変更されないから、忘れないようにしないと。
`ワーキングディレクトリ`やワーキングコピー`とかいう別名もあるみたいだから、分からない単語を聞いたらちゃんと聞くようにしないとね。

###ステージングエリア
ワークツリーとリポジトリの間にあるのが、このステージングエリア。
作業しているファイルの変更はステージングエリアに登録されてから、コミットでリポジトリのファイルに変更が加えられる。
用語として用いることは少ないだろうけど、仕組みとして覚えておいたほうがよさそうだね。
ちなみに、コマンドは`git add`

####ブランチ、マージ
これが冒頭に出した作業を分担する為に不可欠な存在。
Aさん、Bさんがホームページを作るとしよう。
AさんがHTML、BさんはCSSを作ってもらうとするときには、それぞれのブランチを作成して作業を分担する。
Aさん、Bさんの両方が仕事を終えて、1つのファイルにまとめるのがマージ。
つまり、ブランチで仕事を分けて、マージでまとめる。
人数が多くなればなるほど、この機能は重要になるだろうから、絶対に覚えておかないと。
ブランチの作成は、`git branch (ブランチ名)`。
ブランチの一覧は、`git branch`。
ブランチ`git checkout (ブランチ名)`で、指定したブランチに移動。
これらのコマンドも覚えておこうっと。

####リモートリポジトリ
複数人で作業する以上、1つのファイルやリポジトリを共有することもある。
そのファイル、リポジトリのことを`リモートリポジトリ`という。
時間が空くと、誰かがリモートリポジトリを更新しているかもしれないから、適宜更新する癖をつけておかないとね。
更新は`git push origin (ブランチ名)`。

####ローカルリポジトリ
プログラマー1人1人が手元のマシン上に配置するリポジトリのこと。
ローカルリポジトリで仕事をして、リモートリポジトリにアップロードする感じかな。
ローカルリポジトリはリモートリポジトリをクローンするか、イニットするかのどちらかで作成するみたいだから、覚えておこう。

####リベース
リベースはマージとは異なる統合の仕方かな?
マージは分割したものをまとめる。
リベースは分割したものを、後に持ってくる。
とりあえず、リベースをすると直線になるイメージで良いんじゃないかな?

なんでリベースをするかと言えば、履歴を見るときにわかりやすくなるから。
1人や2人くらいにブランチするならともかく、何十、何百人も居る会社で作業を分けて、マージするとなれば分かりづらくなるよね。
誰がどの作業をやってもらっているのかもわかりにくいし。
そのような分岐をなくして、一直線で分かりやすくするのがリベースかな?
詳しい説明は[初心者でも分かる！リベースの使い方を解説します](http://liginc.co.jp/web/tool/79390)を見て欲しい。

####reflag
当然、作業していれば間違いを起こすこともある。
「作業前の状態に戻したい!!」と言うときには、`reflag`というコマンドを使う。
さっきも説明したようにGitは履歴を詳細に残してくれている。
`git reflag`で履歴の確認。
`git reflag --hard`で復元。
これも重宝する操作だろうし、覚えておかないと。

####HEAD
現在使用しているブランチが先頭であることを表す。
それより前のブランチは`HEAD~○`と言う風に表される。
1つ前のブランチなら`HEAD~1`、3つ前のブランチなら`HEAD~3`と言った感じ。
ちなみに、`~`はチルダと呼ばれる。
また、ブランチをマージされていて、複数の親が存在する場合は、何番目の親かが`HEAD^○`で表される。

####stach
作業中のファイルをコミットせずに、ブランチのチェックアウトを行うと、移動先のブランチにそのファイルが着いてくる。
ただ、移動先のブランチで、そのファイルに変更が加えられていた場合、チェックアウトはできない。
その場合は、ファイルをコミットするか、`stash`でファイルを一時的に退避させておく必要がある。
`stash`することで、ファイルを別の領域に保存でき、後から取り出せるようになる。
便利なコマンドだから、これも覚えておこう。

####プルリクエスト
**プルリクエスト**とは、実装前に使用の確認をする工程。
自分が書いたコードを他の人に見てもらうことで、よりわかりやすいコードにしたり、ミスを減らしたりすることができる。
そのほかにも、それぞれの仕事を可視化することで、不明なところを相談したり、より良い仕事にしたりすることができるようになっている。
この工程は忘れないようにしないと…

####コンフリクト
みんなが嫌うエラーのこと。
原因としては、同じファイルを複数の人が変更してしまい、マージした際に、どちらの情報を優先するべきか分からなくなってしまう状態。
コンフリクトになると、マージができなくなる。
せっかくの作業がまとめられなくなるから、不備なくマージできるようにしておかないと。

####コミットメッセージの書き換え
この作業は`git commit --amend`で行える。
このコマンドを打つと、エディターが起動して、コミットメッセージを書き換えられる。
必要になる場面は多そうだし、覚えておこうっと。


####revertとreset
どちらもコミットを書き換える為のコマンド。
`revert`は打消し。
`reset`は削除。
勉強でたとえると、`revert`は二重線、`reset`は消しゴムかな。
つまり、`revert`だと無効にされたという表示が出て、`reset`はそれすらも消える感じだね。


##ブランチを操作してみる
ここで参考にするのは[サルでも分かるGit入門](https://backlog.com/ja/git-tutorial/)

まずは作業ファイルを作って、空のローカルリポジトリを作成。

```
$ mkdir sample
$ cd sample
$ git init
```

そしたら、作業ファイルである`sample`の中にテキストファイルを作って、コミット。

```hello_git.txt
Hello,World!!
```

```
$ git add hello_git.txt
$ git commit -m "first commit"
```

これが終わったら、ブランチの作成。

```
$ git branch branch1
```

`git branch`でブランチがあるかどうかの確認。

```
$ git branch
  branch1
* master
```

続いて、ブランチの切り替え。

```
$ git checkout branch1
```

ちなみに、以下のコマンドで、ブランチの作成と切替が一度にできる。

```
$ git checkout-b branch1
```

ここまできたら、`hello_git.txt`に文章を追加。

```hello_git.txt
Hello,World!!
add change World
```

そして、`branch1`に`hello_git.txt`の追加。

```
$ git add hello_git.txt
$ git commit -m "input add"
```

次は、ブランチのマージ。
ブランチを`master`に切り替えて、

```
$ git checkout master
```

`hello_git.txt`の確認。

```hello_git.txt
Hello,World!!
```

`branch1`の`hello_git.txt`と違うことが確認できたら、マージを行う。

```
$ git merge branch1
```

ちゃんと`branch1`の`hello_git.txt`に内容が変わっているかを確認する。

```hello_git.txt
Hello,World!!
add change World
```

最後にブランチの削除。
無事に変更が適用されていれば、`branch1`はもういらないよね。

```
$ git branch -d branch1
```

ちゃんと削除できているか確認。

```
$ git branch
* master
```

##まとめ
仕事で扱うGitの知識としては、これくらい押さえておけば大丈夫かな?
それでも実際に触ってみないと、不安はぬぐえないだろうしね。
もっとサイトや本を読んで、Gitの知識を身に付けようっと

##参考資料
[Git編：一歩踏み出すフロントエンド入門](https://liginc.co.jp/series/gitbasic)
[初心者でも分かる！リベースの使い方を解説します](http://liginc.co.jp/web/tool/79390)
[サルでも分かる!Git入門~バージョン管理を使いこなそう~](https://backlog.com/ja/git-tutorial/)