MENU

【git addの意味とは?】必要性と便利なオプション[-A,-p…]を調査しました

2020 4/12
【git addの意味とは?】必要性と便利なオプション[-A,-p...]を調査しました

一般的なweb系企業では、gitを使う企業も多いですよね。

僕もチーム開発をする中で本格的にgitを触るようになりましたが、学習を進める中で以下のような疑問を持ちました。

「git addって意味ある?addなしでcommitできた方が楽だし早くない?」

しかし、gitの概念を理解していくと「git addはコミットログを綺麗にするためにも必須のコマンド」と認識するようになってきました。

今回は、学習の備忘録もかねて、

  • git addの意味と必要性
  • git addの便利なオプション一覧

について解説していきます。

目次

git addの意味は「コミットログを綺麗にすること」

いきなり結論ですが、git addは「コミットログを綺麗にすること」という結論に落ち着きました。

なぜ、そのように考えたか?を理解するためには、gitのステージングという概念について理解する必要があります。

詳しく解説していきます。

gitにおける3つの作業エリア

gitにはステージという概念があります。gitの公式ページを引用してまとめると以下のようになります。

  • 作業ディレクトリ・・・現在編集を行っているファイルの集まり
  • ステージング・エリア・・・何をcommitするか選ばれたファイルの集まり
  • Gitディレクトリ・・・commitされたファイルの集まり。remoteにpushすると反映される。

これを図解すると以下のようになります。

上記の図からわかりますが、リモートリポジトリに反映することができるのは、「add」「commit」の両方が完了された変更のみです。

つまり、git add(+ git commit)はリモートに反映したい変更を選ぶコマンドということができます。

git add で必要な修正のみcommitを行う

とはいえ、「今回行った修正は全て本番に反映する」なら、git add は不要なように思われます。

なぜなら、以下の図のように直接 git commit してpushして反映しても問題なく実現できるためです。

そこで、必要になってくる考え方が、「commit log を綺麗にする」という考え方です。

ここで話す綺麗なコミットログとは、1つのcommitに含まれる修正は1つだけの状態のことです。

しかし、実際の業務をしていると「このファイルを編集するなら、ついでにバグも直してしまおう」と修正を加えたくなりますよね。

仮にこのとき別のバグが発生しまうと、1つのcommitに2つの編集が加えられているのでcommitを戻す処理が難しくなります。

そこでgit addをすることによって、1つのコミットに必要な分だけコミットだけをすることで、コミットログを綺麗にすることができるのです。

git addはcommitログをきれいにするための手段

git addを加えることによってcommitの粒度を明示的に決めることができます。

remoteに自分の編集を反映させるという意味では確かにaddは不要です。

しかし、commit logがきれいであればサービスを運用するにあたって後から見直したときに「どこで」「どういう処理を」加えているのか明確になります。

そのためにaddコマンドがあるというわけなのです。

実際にgit addがコンソールでどう動くかを確認する

概念はなんとなくわかってきたものの、実際にコンソールを通してどのように見えるかも確認していくことにしましょう。

ステージング・エリアのディレクトリ状況を確認する

ステージング・エリアにおいて、作業ディレクトリと比較してどれほどファイルが反映されているか確認するためには、

git status

コマンドを実行します。

上記のコマンドを打ち、緑色で表記されている index.html が自分の作業ディレクトリと同じ状態にあるファイルです。

赤い文字で modified: と書かれているファイルは自分の作業ディレクトリのみで変更されている内容で、ステージング・エリア以降には含まれていない修正になります。

Gitディレクトリの状況を確認する

Gitディレクトリの反映状況を確認するのは少し面倒な方法になります。Gitディレクトリの変更状況を調べるためには、

git log

で過去のcommitログを見ます。

その上で、自分が変更を見たいcommit idを見つけた上で

git diff [commit id] [その直前のcommit id]

を打つことで自分が以前のcommitから、どのファイルに変更を加えたかを見ることができます。

【おまけ】git add の便利なオプション一覧 [-A, -p, -u, -i, -f]

「git addの理解はコミットログを綺麗にすること」とお話しましたが、git addにはコミットログを綺麗にする様々なオプションがあります。

今回はその中でも、よくgit addに出てくる5つのオプションについて調べました。

git add -A

リポジトリ内に変更のあったファイル全てをステージング・エリアに移動します。

特に補足などは不要かと思います。

git add -u

新規で作られたファイルを除いてリポジトリ内にあったファイル全てをステージング・エリアに移動します。

git add -Aと混同されやすいですが、「新規で作られたファイルはaddされない」というのがポイントです。

git add -p

おそらく数あるgit addのオプションの中でも、最も実務で使うオプションかと思います。

git add -p では、自分の意図した変更かどうか?を確認しながら、ステージング・エリアに移動することができます。

試しに git add -p コマンドを実行してみましょう。

git add -p <file名>

そうするとファイルの変更箇所に加え、以下の文言が出てくるでしょう。

Stage this hunk [y,n,q,a,d,/,s,e,?]?

ここで、「y」と打ち実行すると対象箇所が add され、「n」と打ち実行すると対象箇所は add されません。

このようにしてそれぞれの変更箇所を addする/しないを決めることができるのです。

より詳しい解説は以下の記事にもあるので、合わせてご覧ください。

git add -i

インタラクティブモードにして git add するファイルを変更することができるコマンドです。

正直、こちらは使えると便利かもしれませんが、あえて学習する必要もないので覚えなくていいかと思います。

git add -f

gitにはAWSのパスワード情報や外部ライブラリなどをステージングに上げないために .gitignore を設定することができます。

.gitignoreに書かれたファイルは基本的に git status などのコマンドでも表示されることはありません。

しかし、git add -f を使えばそれらのファイルも強制的にステージング・エリアに移動できます。

とはいえ、秘匿情報をわざわざ git add することはないので、使い所のないコマンドといえます。

まとめ

今回はgit addの意味について調べてみました。

1年実務をやった今ならgit addの重要性もわかりますし、綺麗なcommit logを残すことがいかに重要かも理解できます。

この記事を読んでgitのさらに理解が深まればと思います。

この記事を読んで理解が深まった!という方は、ぜひTwitterやはてぶでのシェアをお願いします!

- 3ヶ月でエンジニア転職を目指そう -

  • 解決できないエラーに心が折れた
  • 転職に必要なレベルがわからない
  • 本当に今の学習で転職できるか不安

そんな悩みを持っている人に

現役エンジニアが教える3ヶ月でエンジニア転職を実現する方法

を解説しています。

コメント

コメントする

目次
閉じる