実体験から学ぶ、Gitを使う意義

この記事は [Ateam Lifestyle Inc. Advent Calendar 2021](https://qiita.com/advent-calendar/2021/ateam-lifestyle) 2日目の記事です。

# はじめに

私が初めてGitを知ったのは、学生時代にプログラミングを勉強し始めて、少し時間が経ってからでした。Gitの使い方自体はWeb上にわかりやすい記事があり、使い始めることは難しくないことだと思います。（↓おすすめの学習サイト↓）

https://prog-8.com/courses/git

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

私は便利なツールなんだろうなーと思いつつ利用し始めましたが、初めは、どんなメリットがあって、何のためにGitを使うのかという意義をあまり意識しておらず、有効活用ができていませんでした。ここではGitを使ってみようとしている方、使い始めたばかりの方を対象に、意義を意識してGitを使えるようになっていただけることを目指しています。（***ここでは個人でGitを使う場合にフォーカスしています。***）

僕のプログラミング初心者時代の体験談も含んでおりますので、若干回りくどいところもありますが、ご了承ください。

# Gitを使うことで得られるメリット

Gitを使うことで得られるメリットは大きく以下の2点です。

- わざわざファイルなどをコピーして管理する無駄な手間がなくなる
- どんな変更をしたかを把握しやすくなる

他にも挙げ始めたらきりがありませんが、入門書でメリットとしてよく紹介されているのはこの2点だと思います。
それぞれについて少し説明します。

## わざわざファイルなどをコピーして管理する無駄な手間がなくなる

これから話すことは、私がGitを使う前にコードを書いていたときの話です。

ゲームを作ってみたいと思い、ネットの情報を頼りに必死でコードを書いていました。
うまく動くような状態になってから、機能を追加したくなりました。
コードを追加・修正すると、さっきまで動いていたコードが全く動かなくなっていたのでした。
もちろんこれは間違ったコードを書いていたからでした。
どの部分が動いていないのかわからないので、うまく動く状態まで一旦戻したくなりました。
しかし、気づいてみると大量のコードを書いており`Ctrl+z`で戻せるような状況ではありません。
詰みました。終わりです。

![ctrlz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/7f1c588d-504a-8bee-5ff2-71a561ea7987.png)

この失敗を経験し、次はうまく動く状態までコードをかけたらファイルをコピーしておく手段を取りました。これでいくらコードを変えようがちゃんと動く状態まで戻せます。完璧です。

![copy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/77e6f0c3-dba9-94db-45ab-ac220bbf4347.png)

しばらくこのやり方を続けてみると、新たな問題が発生しました。
ファイルが増えまくり、管理がとてもめんどくさくなったのです。

![copy_end.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/7d0af2c7-b00f-ecbf-4d99-b994c68ed13b.png)

僕が書いていたのは、Unityと呼ばれるゲームエンジンで動くプログラムでした。
Unityはプロジェクトと呼ばれる単位（ディレクトリ程度の認識で大丈夫です）で管理する必要があります。
コピーも時間がかかるし、Unityでプロジェクトを開くのにも時間がかかります。
やっているうちに面倒くさくなり、結局コピーせずにコードを書いてしまう自体になりました。

Gitはこの問題を解消してくれます。
Gitではファイル等の変更履歴をコミットとして保存することができます。
うまく動く状態になったらコミットとしてこれまでの変更履歴を保存しておきます。
コードを書いてうまく動かなくなったら、そのコミットの状態まで戻すことが簡単に可能です。

![folder_git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/0a058411-05af-d480-3041-ba873a5e8aa8.png)

## どんな変更をしたかを把握しやすくなる

先程の体験談で、「うまく動く状態に戻したい」という場面がありました。
これは、「うまく動かなくなった原因となったコードの変更を特定して修正し、うまく動く状態にしたい」というのが目的です。（根本的に追加したコードが間違っていて元に戻したいこともあります。）そのため、うまく動いていた状態からどんな変更をしたかがわかればよいのです。

Gitを使う前の私は、コピーしておいたうまく動く状態のコードと、追加・修正したコードを見比べようとしました。ただし、変更が大量にあったり、複数のファイルにまたがっていたり、わけがわからなくなりました。もう無理です。

![diff.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/630ba34f-6817-d5ca-8274-e820962cd2f1.png)

Gitはこの問題を解消してくれます。
Gitでは最新のコミットからどんな追加・修正をしたか差分を見ることができます。
自分で何を追加・修正したかを覚えていなくても大丈夫なのです。
最新のコミットだけでなく、様々な対象同士の差分を見ることが可能です。

![diff-git.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/4cf19956-42eb-476c-3f28-f3eb335401ca.png)

# Gitを使うことで身につく力

ここまでで話したメリットは、コードを書く際の効率を上げる、いわば便利なツールとしてのメリットでした。しかし、便利なツールとしてのメリットが最大のメリットではないと私は考えています。Gitを利用することで、***「必要なプロセスを適切に細分化する力が身につく」***ことが最大のメリットであり、これが私にとっての、何のためにGitを使うかの回答です。

## 必要なプロセスを適切に細分化する力が身につく

Gitを使うだけで、「うまく動く状態に戻すことができる」「どんな変更をしたか把握できる」という要望を完全に満たすことはできません。

Gitを使い始めて間もない私は、「この処理も追加したい」「これも変更しよう」と、ついつい一つのコミットに色々な追加・修正を含めていました。一つのコミットが肥大化することで大きく2つの問題が起こります。
1つ目は、一部の追加・修正を元に戻したいのにも関わらず、他の変更もまとめて元に戻す必要が発生してしまうことです。元に戻したあとに、また先程書いたコードを書く必要があります。これではコードを書くのに時間がかかってしまいます。
2つ目は、追加・修正の差分が把握しづらくなってしまうことです。追加・修正したコードがうまく動かない場合に、差分を見てもその量が多く、原因がどこにあるのかがわかりづらくなってしまいます。

実装するために必要な追加・修正を、適切に細分化してコミットにすることで、「うまく動く状態に戻すことができる」「どんな変更をしたか把握できる」という要望を満たすことができるのです。

![commit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215011/23260a11-079f-3871-6b82-da35e5ff55b0.png)

適切に細分化したコミットをつくることを意識することで、必要なプロセスを適切に細分化する力が身につきます。この力はプログラミング以外の場面でも役立つ力になります。たとえば、達成したい大きな目標があったとします。大きな目標を適切に細分化すると、小さな目標の集まりにすることができます。小さな目標のうち、自分が達成できた/できていないものに分けることで、自分には何が足りないのかを今までよりも具体的に捉えることができます。目標を達成するためにも、細分化の力は役立つのです。

# 最後に

この記事では、Gitを使う意義についてお話しました。
ぜひツールを使う意義を意識しながら利用し、有効活用していきましょう！