CH 07 / 75第2部 Gitの基礎 ── 手元で完結する操作

リポジトリを作る(git init)

このページで分かること

  • git init でフォルダをリポジトリにできる
  • .git フォルダが何で、なぜ消してはいけないかが分かる
  • git init を実行してはいけない場所が分かる
  • 自分が今リポジトリの中にいるかを確かめられる
このページの目次10 items

第2部の06で、練習用のフォルダ ~/git-practice を作りました。今の時点では、これはまだただのフォルダです。このページでは、このフォルダを Git が履歴を記録できるリポジトリに変えます。

ただのフォルダでは、Git は何もしない#

まず、変える前の状態を確かめます。

text5 lines
cd ~/git-practice
git status

# 出力:
# fatal: not a git repository (or any of the parent directories): .git

「リポジトリではない(親のフォルダをたどっても .git が見つからない)」と言われました。Git は、.git という名前のフォルダがある場所だけをリポジトリとして扱います。どのフォルダでも勝手に記録を始めるわけではありません。

git init でリポジトリにする#

text4 lines
git init

# 出力:
# Initialized empty Git repository in /Users/taro/git-practice/.git/

「空の Git リポジトリを初期化した」というメッセージです。表示されるパスは、自分のフォルダの場所に読み替えてください。

もう一度 git status を打つと、今度は答えが返ってきます。

text8 lines
git status

# 出力:
# On branch main
#
# No commits yet
#
# nothing to commit (create/copy files and use "git add" to track)

1行目の On branch main は、第2部の06で設定した既定のブランチ名が使われていることを示します。No commits yet は「記録はまだ1つもない」という意味です。リポジトリは作られましたが、中身の履歴は空っぽです。

何が増えたのか:.git フォルダ#

git init が実際にしたことは、.git というフォルダを1つ作ったことだけです。名前が . で始まるフォルダは隠しフォルダなので、ls -a(-a は隠しファイルも表示する指定)で確かめます。

text6 lines
ls -a

# 出力:
# .
# ..
# .git

. は今いるフォルダ、.. は1つ上のフォルダを表す記号で、どのフォルダにもあります。増えたのは .git だけです。

text7 lines
git-practice/          ← 作業するフォルダ。ここに自分のファイルを置く
└── .git/              ← リポジトリの本体。履歴と設定がすべてここに入る
    ├── HEAD
    ├── config
    ├── objects/
    ├── refs/
    └── …

ここが Git を理解するうえで大事な点です。「リポジトリ」の実体は .git フォルダで、その外側の git-practice/ は、ファイルを編集するための作業場所にすぎません。これからコミットするたびに、記録は .git の中に積み上がっていきます。

.git の中のファイルを手で書き換えることはありません。それぞれの役割は第3部の20(.git フォルダの中身ツアー)で1つずつ開けて確かめます。今は「履歴は全部ここにある」とだけ覚えておけば十分です。

git init を実行してはいけない場所#

git init は、今いるフォルダをリポジトリにします。実行する前に、どこにいるかを必ず確かめてください。今いる場所は pwd で表示できます。

text4 lines
pwd

# 出力:
# /Users/taro/git-practice

ホームフォルダで実行しない#

いちばん多い事故は、ターミナルを開いた直後のホームフォルダ(~)で git init してしまうことです。ホームフォルダ全体がリポジトリになり、その下にあるすべてのフォルダが「どこかのリポジトリの中」とみなされます。git status を打つたびに、デスクトップや書類フォルダの中身が大量に表示されるようになります。

リポジトリの中に、もう1つ作らない#

Git は、今いるフォルダに .git がなければ、親のフォルダを上へたどって探します。そのため、リポジトリの中のサブフォルダでは git init をしなくても Git が使えます。

text7 lines
mkdir notes
cd notes
git status

# 出力:
# On branch main
# …

ここでさらに git init すると、リポジトリの中に別のリポジトリができ、外側のリポジトリからは中身が記録されなくなります。1つのプロジェクトには、いちばん上のフォルダに .git が1つだけ、が原則です。

どのフォルダがリポジトリのいちばん上かは、次のコマンドで確かめられます。

text4 lines
git rev-parse --show-toplevel

# 出力:
# /Users/taro/git-practice

既存のフォルダにも使える#

git init は空のフォルダ専用ではありません。すでにファイルが入っているフォルダで実行しても、ファイルは1つも変更・移動されません。.git が増えるだけです。

ただし、この時点ではまだ何も記録されていません。どのファイルを記録するかを選んで、初めて履歴に入ります。その手順は第2部の09で扱います。

よくある疑問#

Q. ホームフォルダで git init してしまいました。
A. ホームフォルダにできた .git を消せば元に戻ります。ホームフォルダで ls -a を打ち、.git があることと、それが今作ってしまったものであることを確かめてから、rm -rf ~/.git で消します。

Q. 同じフォルダで2回 git init するとどうなりますか?
A. Reinitialized existing Git repository(既存のリポジトリを再初期化した)と表示されますが、履歴は消えません。足りないファイルを補うだけです。

まとめ#

  • git init は、今いるフォルダに .git フォルダを作り、リポジトリにする
  • リポジトリの実体は .git フォルダ。消すと履歴はすべて失われる
  • Git は、今いるフォルダから親へたどって .git を探す
  • ホームフォルダや、既存のリポジトリの中で git init しない
  • 既存のファイルは git init では何も変わらず、まだ記録もされない

次のページ#

08. Gitの3つのエリア ── ファイルは「作業する場所」から「記録」へ、どういう経路で入っていくのか。Git を使ううえで最も重要な図を見ます。