第3章 最初のリポジトリを作る
リポジトリを作る
Git のリポジトリは「ただのフォルダに .git/ という隠しディレクトリを足したもの」と考えて差し支えない。
作るのは git init 一発である。
mkdir my-project
cd my-project
git init
# => Initialized empty Git repository in /path/to/my-project/.git/
出力の通り、空の Git リポジトリが初期化された。ls -la してみると .git フォルダが生成されているはずである。
ls -la
# => .git/ ...
ls .git/
# => HEAD config description hooks/ info/ objects/ refs/ ...
.git/ の中身は Git がコミット履歴やオブジェクトを管理するために使っている実体。
勉強目的で覗くのは大いに結構だが、中のファイルは決して手で書き換えないこと。壊すとリポジトリが復旧不能になることもある。
最初のファイルを置いてみる
まだ空っぽのリポジトリなので、何か適当なファイルを作ってみよう。README でも main.py でもなんでもいい。
echo "# My Project" > README.md
git status の読み方
Git を使っていて一番よく打つコマンドは間違いなく git status である。
「いまの作業ツリーとステージングがどんな状態にあるか」を全部教えてくれる。
git status
典型的な出力はこんな感じになる。
On branch main
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
Git が認識するファイルの状態には大きく次の 3 つ (加えて「追跡外」) がある。git status の文面はこのどこに該当するかを教えている。
- Untracked files: Git がまだ追跡していないファイル。今作った
README.mdはここ - Changes not staged for commit: 追跡中のファイルで、作業ツリーで編集されたがまだステージングに入っていない
- Changes to be committed: ステージング済み。次の
git commitで履歴に入る変更
第 1 章で見た「作業ツリー / ステージング / リポジトリ」の三層と、上の 3 つの状態は完全に対応している。 「追跡外 → 作業ツリー → ステージング → リポジトリ」という流れをイメージして読むと、出力のどの区分を眺めているか迷わなくなる。
.gitignore で追跡したくないものを除外する
プロジェクトフォルダの中にはコミットすべきでないファイル — たとえば node_modules/、.env、ビルド成果物、エディタ設定 — がたいてい混ざっている。
これらを毎回 git status に表示されると邪魔だし、うっかり git add . で全部コミットに入れてしまう事故も起こる。
そこで、リポジトリ直下に .gitignore という名前のファイルを置き、そこに無視したいパターンを 1 行ずつ書く。
.gitignore 自体は Git で追跡してコミットしてよい (チーム全員に同じ除外ルールを適用するため)。
# 依存パッケージ
node_modules/
# 環境変数 (秘匿情報を含む)
.env
.env.local
# ビルド成果物
dist/
build/
# OS / エディタ設定
.DS_Store
.vscode/
.idea/
# から始まる行はコメント。/ で終われば「ディレクトリ配下すべて」という意味になる。
ファイル名そのままを書けば、プロジェクト内のその名前のファイルはすべて対象である。
言語やフレームワークごとに推奨される .gitignore の雛形は github/gitignore リポジトリにまとまっている。
Node.js なら Node.gitignore、Python なら Python.gitignore をそのまま下敷きにして、必要な行を足し引きするのが楽である。
まとめ
git initを 1 回叩けば、そのフォルダは Git リポジトリになる.git/は Git 自身の管理領域。存在は意識するが、中身は触らないgit statusは作業ツリーとステージングの現状を教えてくれる万能コマンド。常にこまめに打つ.gitignoreに追跡不要なものを書いて、コミットしていいものだけに集中できる状態を保つ