Gitコマンド入門::add,reset,rm,status,log「第二十八回」

5 min read読了の目安(約4800字

さあ、今日も昨日に引き続き、基本中の基本から始めていきましょう!
最初の一歩は、add、commit、diff、reset、rmですね。
今回から始めても分かる内容にしたいので、復習も兼ねてやっていきますけど、時間に余裕のあるかたは、第一回など、バックナンバーからどうぞ!

前回の記事は、こちら!

https://zenn.dev/shiozumi/articles/78512af82b9732

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

まずは、新しいリポジトリーを作成!

echo "# A" >> README.md
git init
git add README.md
git commit -m "1st"
git branch -M main
git remote add origin https://github.com/user-name/202103.git
git push -u origin main

まずは、こちらの定番スクリプトですね。GitHubでリポジトリーを作成すると、表示されているものですね。ちょっとだけ、私も変更してありますが、みなさんは、ご自由にどうぞ!

$ echo "# A" >> README.md
$ git init
initialized empty Git repository in /home/shiozumi/mygit/202103/.git/

$ git add README.md
$ git commit -m "1st"
[master (root-commit) 53d39e0] 1st
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

$ git branch -M main
$ git remote add origin https://github.com/shiozumi-makoto/202103.git
$ git push -u origin main
Username for 'https://github.com': shiozumi-makoto
Password for 'https://shiozumi-makoto@github.com':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 219 bytes | 219.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/shiozumi-makoto/202103.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

$ git status -s
// -s は簡易表示なので、何も出力されない。

git status コマンドで現在の状態を確認!

nothing to commit, working tree clean

復習になりますが、gitは差分管理をしてくれますので、このステータスコマンドの表示内容から、その状態を把握することになります。

要するに、status コマンドは、使用者に対して、次にどうすれば良いのか、指示することが、あれば、それを表示してくれるんです。

-s オプションを付けて実行すると簡易表示となり、git側から特にする必要がない状態ならば、メッセージは、何も出力されません。

git log コマンド -p は差分も表示

$ git log -p --oneline --reverse

53d39e0 (HEAD -> main, origin/main) 1st

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..7f3b95d
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# A
  1. -p は、前後のコミットとの差分を表示します。
  2. --oneline コミットをmシンプルに一行にまとめて表示
  3. --reverse 新しい順に表示します。

git add README.md

これによって、README.md ファイルが、作業ディレクトリーから、ステージングエリアに登録されますね。基本中の基本ですけど、もう一度、試してみます!

新しいファイル a.txt を作成して、git status

$ echo "a.txt" > a.txt // <-- ファイル作成

$ ls
README.md  a.txt  // <-- ファイル確認

$ git status
On branch main
Your branch is up to date with 'origin/main'.

Untracked files: // <-- アントラックファイルズに、a.txt が表示!
  (use "git add <file>..." to include in what will be committed)
        a.txt

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

$ git status -s // -s オプションを付けて、簡易表示
?? a.txt

新しくファイルを作成すると、Untracked files リストに表示されます。「簡易表示、-s を付けると、?? a.txt と表示されます。」この状態では、a.txtは、gitからの管理外であり、追跡されていない状態です。従って、gitは、a.txtに対しては何もしません。

Google翻訳
コミットするために何も追加されていませんが、追跡されていないファイルが存在します(追跡するには「git add」を使用してください)

ここが最初の一歩! git add

さあ~、もう誰もが分かりきった既知の情報ですけど、ここで既に落とし穴、罠があります。誰もがそうとは思わない事でしょうけどね。実は、git add って、2段階の複合的な処理を実行するコマンドなんですよね~[1]

  1. 新規登録のファイル、つまり管理外のファイルを、管理下に置く!
  2. 管理下に置いたファイルと、ステージングエリアとの間に差分が合ったら登録する。

本家本元のサイトでも、add コマンドに対しての解釈について補足説明をしています。

[※gitの本家本元からの抜粋]:指定したファイルをプロジェクトに追加(add)する コマンド、というよりは、指定した内容を次のコミットに追加(add)する コマンド、と捉えるほうがわかりやすいかもしれません。[2]

この図の add コマンドの長さ!(笑)

  1. Untracked から、Staged へ 1番と2番同時処理!
  2. Unmodified から、Staged へ 2番の処理のみ![3]
  3. Modified から、Staged へ 2番の処理のみ!

さらに問題発生、更新していないファイル、Unmodified から、Stagedへの登録って、必要あるのかな?

ここで、もうひとつの落とし穴が、あったんですよね~ まあ、そもそも、gitの特徴なのですが、、、CSVやSubverstionなどのソフトとは異なって、すべてのスナップショットを記録するようです。ということで、未更新ファイル、Unmodifiedも、ステージングエリアに登録するのです。というか最初のaddコマンドで、gitの管理下に置き、ステージングエリアには、ファイルの内容を登録するので、次回からも、更新していないファイル、Unmodifiedの状態でも、毎回ステージングから、リポジトリーにコミットできますけどね。

自分で説明しておいてなんですが、図のイメージから予測する処理なので、あくまでも、ここまでの認識ということで、ご理解くださいね。要するに、また新しい情報を仕入れたら、認識も変わりますのであしからず。

Unmodifiedのファイルもコミットされる!

こちらもgit本家本元のマニュアルに記載されている図です。FILE Bが更新されていなくても、、、Version 2に、存在しています。実際は、ファイルそのものではなく、Version 1の参照ポインターのみです。[4]

まとめ

最初の一歩とはいえ、git add を調べていくと、結構、説明内容が膨れてしまいました。又、ワーキングディレクトリの中でも、gitは、ファイル状態を管理しています。
Untracked、Unmodified, Modifiedの3つが存在することは、しっかり覚えて置きましょう。そうしないと、このあとに学習する、reset コマンドなどの理解が難しくなっていくので、add コマンドの理解、gitの仕組みの理解は大切です。

次回は実際に、add しましょう!

今回は、その前段階の説明で終わってしまい、ごめんなさい! なんか、いろいろ調べていると、どんどん伝えたい情報が見つかるんですよね。(苦笑)

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/6688f213b3a76b
https://twitter.com/esmile2013
脚注
  1. 第二回、add の反対の処理で、頭が混乱することになりました。 ↩︎

  2. ちょっと上記とは、やや外れた説明なので、混乱してしまうかもしれませんが、addコマンドは、単純じゃないよ!ってことですね。(苦笑) ↩︎

  3. 更新していないファイルを、Stagingに登録する時は、ファイルの実態は保存していないようで、その前のコミット時のポインター、インデックス参照のようです。 ↩︎

  4. Unmodifiedは、Version2と3のB、Version4のC2ですね。分かりずらいですが、破線で囲まれています。 ↩︎