git init – 新しいリポジトリを作成するコマンド

リポジトリ管理

git init コマンドは、指定したディレクトリに新しい Git リポジトリを初期化するためのコマンドです。
バージョン管理を開始するときに最初に実行される基本コマンドです。

Gitで使用されるコマンドなので、あらかじめ「Git」や「Bash」での操作方法を理解しておくことをおススメします。

  1. git init の概要と用途
    1. 何が起こるか(.git ディレクトリ生成・メタデータ格納)
    2. いつ使うか・どのような場面で必要か
  2. 構文(Syntax)
  3. 主なオプション一覧
    1. 応用オプション(知っていると便利)
      1. --template=<dir>:テンプレート適用
      2. --separate-git-dir=<gitdir>:.git を別ディレクトリに分離
      3. --shared[=<perm>]:共有権限のプリセット
      4. --object-format=<fmt>:オブジェクト形式の選択(環境依存)
    2. どれをいつ使う?クイック指針
  4. 実行例とユースケース
    1. カレントディレクトリをリポジトリ化
    2. 新しいディレクトリで初期化
    3. 初期ブランチ名を main に指定
    4. ベアリポジトリを作成して共有リポジトリとして使う
    5. 既存ディレクトリで git init(誤って初期化した場合)
    6. サブモジュールとの関係:git submodule update --init --recursive との使い分け
  5. よくある間違い・トラブル対応
    1. git init を誤って実行してしまったときの対処(取り消し/バックアップ)
    2. 存在しないパスを指定したときのエラーと対処
    3. 既に Git リポジトリが存在するディレクトリで再実行したときの挙動
    4. リモートリポジトリを後から紐付ける方法
  6. 内部処理と注意点(少し深掘り)
    1. .git/ ディレクトリの構造(ざっくり把握)
    2. デフォルトブランチ(master vs main)の扱いと変更
    3. 設定の優先順位と init.defaultBranch の影響
    4. 権限・ファイルシステム依存性(パーミッション/シンボリックリンク など)
  7. コマンド比較・関連操作
    1. git clone との違い
    2. git config による初期設定
    3. git status / git add / git commit の流れ
    4. git submodule init / git submodule update など
  8. FAQ(よくある質問)
    1. Q1. git init とは何ですか?
    2. Q2. git init の初期化を取り消すには?
    3. Q3. git init した後にリモートリポジトリを設定するには?
    4. Q4. bare リポジトリと通常リポジトリの違いは?
    5. Q5. サブモジュールと git init はどう連携するの?
  9. まとめ・実践チェックリスト
  10. 参考リンク / 関連記事
    1. 外部リファレンス
    2. 関連記事(Bash道 内)
  11. 関連記事

git init の概要と用途

git init は、実行したディレクトリを Git リポジトリとして初期化します。具体的には、カレント(または指定)ディレクトリ直下に .git/ が作成され、以下のようなバージョン管理に必要なメタデータが配置されます。

何が起こるか(.git ディレクトリ生成・メタデータ格納)

  • objects/:コミットやツリー、ブロブなど、履歴の実体(オブジェクト)を保存
  • refs/:ブランチやタグが指す参照(ポインタ)
  • HEAD:現在チェックアウトしているブランチを指す参照(初期は未コミット状態)
  • config:このリポジトリ固有の設定(ユーザー名・メールは通常はグローバル設定)
  • hooks/:コミット時などに走らせるフックを配置できるディレクトリ
  • info/:グローバルではない除外設定などを置ける場所(exclude など)

この .git/履歴・設定・参照のすべてを担う心臓部です。

作業ツリー(ワークツリー)は .git/ の外側にある普段のファイル群で、git addgit commit によって変更が履歴(objects/)として保存されていきます。
なお、初期ブランチ名は環境設定(例:init.defaultBranch)に従い、main などで開始できます。

すばやく確認:

git init
ls -a        # .git/ ができている
git status   # まだコミットがない初期状態

いつ使うか・どのような場面で必要か

git init「今あるディレクトリをその場で Git 管理下に置きたい」 ときに使います。代表的なケースは次のとおり。

  • 新規プロジェクトを始めるとき
    空のフォルダを作って git init → 最初のファイルを作成 → add/commit で履歴化。
  • 既存コードを後からバージョン管理したいとき
    既に動いているプロジェクトや配布物(ZIP 展開など)に対して、後追いで履歴管理を開始。
  • テンプレートやスキャフォールド直後
    フレームワークの雛形を生成した後、すぐに履歴化して変更追跡を始める。
  • 共有サーバーで “裸の履歴” を置きたい(概念理解)
    作業ツリーを持たない ベアリポジトリgit init --bare)はチームの“受け皿”として使うことがある(詳細は後述セクションで解説)。

一方で、既存のリモートを複製して始めたい場合は git clone を使うのが基本です。

clone は初期化だけでなく 履歴の取得・初期ブランチのチェックアウト・origin の設定まで自動で行います。ローカルから始めたい/手元のフォルダをそのまま履歴化したいなら git init、既存リポジトリから受け継ぎたいなら git clone、という使い分けが実務では定番です。

ありがちな注意点:

  • ホームディレクトリ等で誤って git init すると、配下すべてが管理対象候補になり混乱の元に。場所を確認してから実行しましょう。
  • 既にリポジトリの中で git init を再実行しても通常は害はありませんが、目的なく繰り返す必要はありません。
  • 初期ブランチ名を main に揃えたい場合は、事前に
    git config --global init.defaultBranch main
    を設定しておくと毎回指定せずに済みます。

構文(Syntax)

git init [オプション] [ディレクトリ]

主なオプション一覧

オプション説明使用例
(なし)カレントディレクトリにリポジトリを作成git init
ディレクトリ指定ディレクトリにリポジトリを作成git init myproject
--bare作業ツリーを持たないベアリポジトリを作成git init --bare project.git
--initial-branch=NAME初期ブランチ名を指定(デフォルトは master または設定値)git init --initial-branch=main
-q, --quiet出力を抑制して実行git init -q

応用オプション(知っていると便利)

--template=<dir>:テンプレート適用

指定ディレクトリにある hooks/info/attributes などを新規リポジトリへコピーします。社内共通のフック・属性・除外設定を配布するのに便利。

git init --template=/opt/git-templates

--separate-git-dir=<gitdir>:.git を別ディレクトリに分離

作業ツリー内ではなく、.git(実体)を別の場所に置きたいときに使用。大規模モノレポや特殊な配置要件に。

git init --separate-git-dir=/var/lib/git/meta my-worktree

--shared[=<perm>]:共有権限のプリセット

新規リポジトリのファイルモード(パーミッション)を、共同利用に向けて緩めに設定します。group(または true)、allworld)、umask、数値(0xxx)などが指定可。

# 同一グループで共同運用しやすい権限に
git init --shared=group /srv/git/shared-repo.git
  • 使いどころ:同一サーバー上で複数ユーザーが同一リポジトリを操作する運用
  • 注意:実際のアクセス可否は OS 側のユーザー/グループ設定にも依存

--object-format=<fmt>:オブジェクト形式の選択(環境依存)

オブジェクトハッシュ形式(例:sha1 / sha256)を指定します。利用可否は Git のバージョンやビルド設定に依存します。

# 例:SHA-256 形式で初期化(対応環境のみ)
git init --object-format=sha256
  • 注意:異なるオブジェクト形式間の互換や運用は要理解。既存ツール群との相性も確認を

どれをいつ使う?クイック指針

  • ローカルで普通に始めたいgit init(必要なら -b main
  • 共有サーバーに“受け皿”を作るgit init --bare [--shared=group]
  • チームルールやフックを配りたいgit init --template=...
  • .git を別ディレクトリに置きたいgit init --separate-git-dir=...
  • 将来のハッシュ形式を試す/要件があるgit init --object-format=...(対応環境のみ)

実務では -b main--bare--shared--template あたりの出番が多め。スクリプティング時は -q を添えてログを静かにする、が定番です。

実行例とユースケース

カレントディレクトリをリポジトリ化

いま居るフォルダをそのまま Git 管理にします。

# プロジェクト直下で
git init
# 例: Initialized empty Git repository in /path/to/project/.git/
git status         # まだコミットなし(Untracked が表示される)
git add .
git commit -m "initial commit"

確認ワンライナー

git rev-parse --is-inside-work-tree  # true が返ればリポジトリ内

新しいディレクトリで初期化

指定名のフォルダを作って、その中を初期化します。

git init myapp        # myapp/.git が作成される
cd myapp
touch README.md
git add README.md
git commit -m "chore: bootstrap repo"

初期ブランチ名を main に指定

プロジェクト開始時から main を既定にしたいケース。

# その場で指定
git init -b main              # = --initial-branch=main
# 以後常に main で始めたい(推奨)
git config --global init.defaultBranch main

ベアリポジトリを作成して共有リポジトリとして使う

作業ツリーなしの“受け皿”リポジトリ(サーバー側)を用意 → ローカルから push。

# サーバー側(共有用)
mkdir -p /srv/git
git init --bare --shared=group /srv/git/myrepo.git

# クライアント側(作業用)
mkdir myrepo && cd myrepo
git init -b main
git commit --allow-empty -m "initial"
git remote add origin ssh://user@server/srv/git/myrepo.git
git push -u origin main
  • ポイント--shared=group で共同運用しやすい権限に。実際のアクセスは OS のユーザー/グループ設定も必要。

既存ディレクトリで git init(誤って初期化した場合)

間違って関係ない場所(例:ホーム直下)で git init してしまったら…

取り消し(最も簡単)

# 初期化直後など、履歴が不要なら .git を消す
rm -rf .git

既に履歴が付いている/消すのが怖い場合

# まず場所を特定
git rev-parse --show-toplevel   # どのディレクトリがリポジトリの最上位か
# バックアップしてから .git を移動 or 削除
mv .git ../git-backup-$(date +%Y%m%d-%H%M%S)

既存リポジトリ内で再度 git init を実行したとき

  • ふつうは致命的な問題は起きません(設定の再生成など)が、不要なら実行しないのが吉。

サブモジュールとの関係:git submodule update --init --recursive との使い分け

git init は「このディレクトリをリポジトリ化」するコマンド。
一方サブモジュールは、親リポジトリに紐づく子リポジトリを取得・初期化します。

よくあるフロー

# 既存の親リポジトリを取得
git clone https://example.com/parent.git
cd parent

# 親に定義されたサブモジュールを初期化して取得
git submodule update --init        # 1階層だけ
git submodule update --init --recursive  # ネストも含めてすべて

使い分けの目安

  • 新規プロジェクト開始/手元フォルダを履歴化git init
  • 親リポジトリに定義済みのサブモジュールをセットアップgit submodule update --init [--recursive]
  • サブモジュールを新規追加 → 親側で git submodule add https://example.com/lib.git external/lib git commit -m "add submodule lib"

ヒント:サブモジュールは別リポジトリなので、サブモジュール内で作業する時はその中に入ってから通常どおり git add/commit/push を行います。

よくある間違い・トラブル対応

git init を誤って実行してしまったときの対処(取り消し/バックアップ)

「場所を間違えて初期化した」「ホーム直下でやってしまった」などのときは、.git を消せば取り消せます。消す前に場所と状態を確認しましょう。

場所の確認

git rev-parse --show-toplevel   # そのリポジトリの最上位ディレクトリ
git rev-parse --git-dir         # .git の実体パス

最も簡単な取り消し(初期化直後・履歴不要なら)

rm -rf .git              # Windows: rmdir /S /Q .git

バックアップしてから取り消す(安全策)

tar czf ../git-backup-$(date +%Y%m%d-%H%M%S).tar.gz .git
rm -rf .git

注意:.git を削除すると “そのディレクトリ内の Git 履歴と設定” は失われます。消す前に必要な内容がないか確認を。

存在しないパスを指定したときのエラーと対処

git init <dir>最終ディレクトリが無ければ作成 しますが、親ディレクトリが存在しない と失敗します。

例:親パスが無い

git init /path/not/exist/myrepo
# fatal: cannot mkdir '/path/not/exist/myrepo': No such file or directory

対処

mkdir -p /path/not/exist
git init /path/not/exist/myrepo   # 成功

既に Git リポジトリが存在するディレクトリで再実行したときの挙動

既に .git/ がある場所で git init を実行すると、再初期化(Reinitialized) されます。
通常は履歴や設定は保持され、致命的な影響はありません。

git init
# Reinitialized existing Git repository in /path/to/repo/.git/
  • 不要に繰り返す意味はあまりありません。設定の見直しなら .git/config を編集するか git config を使う方が安全です。
  • .git の場所を分離・変更したい用途は --separate-git-dir を検討。

リモートリポジトリを後から紐付ける方法

git init で始めたローカルリポジトリに、のちほどリモート(例:GitHub/GitLab)を設定する手順です。

1) リモートを登録

git remote add origin git@github.com:USER/REPO.git
# すでに origin がある場合は
# git remote set-url origin git@github.com:USER/REPO.git

2) 初回の push(ブランチ追跡を設定)

# 例:main ブランチを使っている場合
git push -u origin main
# 以後は git push / git pull だけで OK(追跡設定済み)

3) 既定の初期ブランチを揃える

# 新規プロジェクトを常に main で始めたい(グローバル設定)
git config --global init.defaultBranch main

補足:ベア(受け皿)側に後から接続する場合

# サーバー側(受け皿)
git init --bare --shared=group /srv/git/myrepo.git
# ローカル作業側
git remote add origin ssh://user@server/srv/git/myrepo.git
git push -u origin main

ヒント:既存の “clone 前提” のワークフローに合わせたい場合は、git clone を使う方が初期設定(origin 登録・初回チェックアウト)まで自動で整います。

内部処理と注意点(少し深掘り)

.git/ ディレクトリの構造(ざっくり把握)

git init が作る .git/ は、履歴・設定・参照の“心臓部”です。代表的な中身は次のとおり。

  • objects/:コミット・ツリー・ブロブ・タグ等のオブジェクト本体
    • pack/(多数のオブジェクトをまとめた packfile)
  • refs/:ブランチやタグの参照名 → オブジェクトID の対応
    • refs/heads/<branch>refs/tags/<tag>refs/remotes/<remote>/<branch>
  • HEAD:現在の作業先を指すシンボリック参照(通常 ref: refs/heads/main など)
  • configリポジトリ単位の設定(後述の優先順位参照)
  • index:ステージング領域(git add の結果がここに反映)
  • hooks/:フックスクリプト(pre-commit など)を置く場所
  • info/info/excludeそのリポジトリ限定の除外が書ける
  • packed-refs:refs が多い場合にまとめて格納されるファイル

位置関係(超要約):作業ツリー(あなたのファイル群) ←→ index(ステージ) ←→ objects(永続化された履歴)
参照(refs/*HEAD)は「どの履歴を指しているか」を記録します。

デフォルトブランチ(master vs main)の扱いと変更

新規リポジトリの初期ブランチ名は、環境や設定で決まります。最近は main を採用するチームが多く、以下のいずれかでコントロールできます。

A. その場だけ指定

git init -b main                # = --initial-branch=main

B. 以後ずっと main で始める(推奨)

git config --global init.defaultBranch main

既存リポジトリを mastermain に変えたい(ローカル)

git branch -m master main       # ブランス名のリネーム

リモート併用時は、リモートのデフォルトブランチ切り替え・追跡設定の更新・古いブランチ削除(必要なら)などを合わせて行います。

git push -u origin main         # 新ブランチを既定として追跡
# プラットフォーム側(GitHub/GitLab等)で default branch を main に変更
# その後、不要ならリモート master を削除
git push origin :master

設定の優先順位と init.defaultBranch の影響

git 設定は概ね システム → グローバル(ユーザー) → ローカル(リポジトリ) の順に上書きされます。

  • システム/etc/gitconfig(環境全体)
  • グローバル~/.gitconfig(そのユーザー全体)
  • ローカル.git/config(そのリポジトリだけ)

git init の初期ブランチ名は、init.defaultBranch に従います。未設定ならツールやディストリの既定に依存します。
確認と設定例:

git config --show-origin --get init.defaultBranch
git config --global init.defaultBranch main

権限・ファイルシステム依存性(パーミッション/シンボリックリンク など)

複数人・複数OSで運用する際にハマりやすいポイントをまとめます。

1) 共有権限(サーバー側運用)

  • 共有サーバーでベアリポジトリを置くなら、初期化時に --shared を検討。 git init --bare --shared=group /srv/git/repo.git
  • 実際の可否は OS のユーザー/グループ設定、親ディレクトリのグループ/SGID ビット、umask にも依存します。
  • 既存リポジトリの既定権限は core.sharedRepository で確認・変更可能。

2) 実行ビット・パーミッションの扱い

  • Git は通常、実行ビットの違い(+x)を追跡します。ネットワークドライブや OS により挙動がぶれる場合、core.filemode を調整。 git config core.filemode false # 実行ビットの変化を無視(環境依存時の逃げ)

3) 改行コード(EOL)と文字コード

  • Windows と Linux/Mac を跨ぐ場合は core.autocrlf.gitattributes による text eol=lf 指定で揺れを抑制。
    例:プロジェクトの .gitattributes * text=auto eol=lf

4) シンボリックリンク

  • Windows 環境ではシンボリックリンクの作成に管理者権限や開発者モードが要る場合がある。Git の core.symlinks(既定は true)でリンク扱いを調整可能。

5) .git の分離・外部配置

  • .git 実体を別パスに置きたい場合は --separate-git-dir。バックアップ方針や大規模モノレポで有効。 git init --separate-git-dir=/var/lib/git/meta my-worktree

まとめ:

  • 共有なら --shared と OS 側権限の整備をセットで。
  • クロスプラットフォームなら EOL と filemode、symlink の方針を最初に決める。
  • 初期ブランチinit.defaultBranch を整えて全員の体験を統一。
  • .git の中身を理解しておくと、トラブル時の切り分けが速くなります。

コマンド比較・関連操作

git clone との違い

  • git init:空のディレクトリを Git 管理にする。履歴は空っぽで、そこからファイルを追加していく。
  • git clone:既存リポジトリをコピーして新しいディレクトリに展開。履歴・ブランチ・リモート設定(origin)まで自動で揃う。

目的別には以下の違いになります

  • ゼロから始めたい → git init
  • 他人やリモートのリポジトリを利用したい → git clone

git config による初期設定

git init のあと、そのリポジトリ固有の設定は .git/config に記録されます。ユーザー名やメールアドレスが未設定だとコミット時にエラーになるため、事前に git config で設定しておきましょう。

# グローバル(全リポジトリ共通)
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

# ローカル(そのリポジトリ限定)
git config user.name "Project Specific"
git config user.email "proj@example.com"

設定ファイルの優先順位:
システム(/etc/gitconfig) < グローバル(~/.gitconfig) < ローカル(.git/config)

git status / git add / git commit の流れ

git init 後に続けて行う基本操作は以下のとおり。

git status              # 現在の状態確認(初期化直後はコミットなし)
echo "# MyProject" > README.md
git add README.md       # 変更をステージ(index に追加)
git commit -m "first commit"  # 履歴として保存
  • git status:変更やステージ状態を確認
  • git add:変更をステージングエリアに登録
  • git commit:ステージの内容を履歴に保存

この「status → add → commit」が、git init 直後の最初の一歩になります。

git submodule init / git submodule update など

サブモジュールは 親リポジトリの中で別リポジトリを管理する仕組みgit init 自体とは用途が違いますが、初期化フローの一部でよく混同されます。

  • git submodule init:親に登録済みのサブモジュールを「有効化」する(URL 情報を .git/config に書き込む)
  • git submodule update:そのサブモジュールのリポジトリを実際に取得し、親で指定されたコミットに checkout する

よく使う組み合わせ:

# サブモジュールをすべて初期化して取得
git submodule update --init --recursive

違いの整理

  • git init:ディレクトリを新規リポジトリ化
  • git submodule init:サブモジュールの設定だけを準備
  • git submodule update:中身を実際に取得

実務の感覚:

  • ゼロから始めるときgit init
  • 既存プロジェクトを clone したときgit submodule update --init を忘れずに

FAQ(よくある質問)

Q1. git init とは何ですか?

git init は、指定したディレクトリを Git リポジトリに初期化するコマンドです。
実行すると .git/ ディレクトリが作られ、以後そのフォルダ内の変更をバージョン管理できるようになります。
新規プロジェクトを始めるときや、既存のソースコードを履歴管理下に置きたいときに最初に使います。

Q2. git init の初期化を取り消すには?

初期化直後であれば、.git/ ディレクトリを削除すれば取り消せます。

rm -rf .git          # Windows: rmdir /S /Q .git

既に履歴がある場合や消すのが不安な場合は、.git/ をリネームやバックアップしてから削除するのがおすすめです。

mv .git ../git-backup-$(date +%Y%m%d-%H%M%S)

Q3. git init した後にリモートリポジトリを設定するには?

リモート URL を追加して、最初の push を行います。

git remote add origin git@github.com:USER/REPO.git
git push -u origin main
  • origin がリモートのデフォルト名
  • -u で追跡設定を行うため、以後 git push / git pull だけで同期可能

Q4. bare リポジトリと通常リポジトリの違いは?

  • 通常リポジトリ(デフォルト)
    • 作業ツリーあり
    • ファイルを編集して add/commit できる
    • 個人作業やローカル開発向け
  • ベアリポジトリ(–bare)
    • 作業ツリーなし
    • 履歴だけを保持(中で編集はできない)
    • 共有サーバーや中央リポジトリとして利用する

例:GitHub や GitLab 上のリポジトリはベアリポジトリの一種です。

Q5. サブモジュールと git init はどう連携するの?

  • git init:新しいリポジトリを作成するコマンド
  • git submodule init:親リポジトリに登録済みのサブモジュール設定を有効化
  • git submodule update --init --recursive:サブモジュールの中身を取得して、親で指定された状態に揃える

つまり サブモジュールを使うときは git init 自体ではなく、submodule 系コマンドを追加で実行します。
親リポジトリを clone した後に submodule update --init を忘れると、サブモジュールが空ディレクトリのままになる点に注意してください。

まとめ・実践チェックリスト

git init を調べているということは、これから自分の手元でコードやファイルを「履歴管理していきたい」という段階にいるはずです。

まず大切なのは、Git は単なるコマンド集ではなく「変更を記録して再現する仕組み」だという理解です。git init はその入り口であり、「ここからはこのディレクトリの中身を全部記録していくよ」という宣言にあたります。

心構えとして覚えておきたいのは、次の2点です。

  • 履歴を残すこと自体が資産になる
    → 後から「どの時点で」「誰が」「なぜ」変更したのかを追えるのは、チーム開発でも個人学習でも大きな力になります。
  • 小さく区切ってコミットする習慣をつける
    → 最初は「動いたから一回コミット」「README を追加したからコミット」で十分。細かく積み上げることで後で見返す価値が高まります。

次に学ぶべきステップは、以下の流れです。

  1. git status を習慣にする
    → いまの状態(変更があるか、ステージ済みか)を確認するクセをつけましょう。
  2. git addgit commit のセットを身につける
    → 変更を選んで履歴に残す、という Git の基本操作です。
  3. リモートリポジトリを設定して push/pull
    → GitHub や GitLab を使えば、バックアップや共有の仕組みが一気に広がります。
  4. ブランチを活用する
    → main とは別に試したいコードを書けるのが Git の大きな強み。

git init を実行して終わり」ではなく、そこから バージョン管理の流れを実感することが次の学習テーマです。小さな練習でもよいので、自分のプロジェクトを一つ Git 管理に置いてみると理解が早まります。

👉 一歩進んだ学習へのおすすめ

git init はスタートラインです。ここから「状態を確認する」「変更を記録する」「履歴を残す」という一連の流れを体験していけば、Git の理解は自然と深まっていきます。

参考リンク / 関連記事

外部リファレンス

関連記事(Bash道 内)

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント