コンテンツにスキップ

Gitを使ってみよう

Gitリポジトリとは

リポジトリとは、データや情報を保存・管理する場所やシステムを指す言葉です。 Gitリポジトリとは、プロジェクトのソースコードやファイル、変更履歴を保存しておく場所で、プロジェクトの一番上のディレクトリの project/.git という隠しディレクトリがその本体です。

基礎的なGitコマンドの一覧

  • リポジトリの作成: git init
  • ファイルの追加: git add <files>
    • 空ディレクトリは無視される
  • 変更されたファイルの確認: git status
  • 変更されたファイルの差分: git diff
  • 履歴の記録: git commit <files>
    • 環境変数の設定: EDITOR
  • 履歴の閲覧: git log
  • 履歴の比較: git diff [<hash>]

プロジェクトの作成

# project/ というディレクトリを作成
$ mkdir project
$ cd project

# 中にいくつかファイルを作成
$ echo "# My Project" > README.md
$ echo "print('Hello, world!')" > main.py
$ mkdir libs # 空のディレクトリも作成してみる

# 現在のディレクトリ構成を確認
$ ls -A
README.md main.py libs/

Gitリポジトリの作成 git init

# カレントディレクトリにGitリポジトリを初期化 (.git ディレクトリが作成される)
$ git init
Initialized empty Git repository in /path/to/project/.git/

この時点ではまだどのファイルも登録されておらず、バージョン管理は始まっていません。 Gitの管理化に置かれた作業用のディレクトリ(上の例ならproject/)をワーキングディレクトリと呼びます。

Gitリポジトリへファイルを登録 git addgit statusgit commit

# ファイルの追加 (ステージング)
# README.md と main.py をステージングエリアに追加
$ git add README.md main.py
# 注意: git add . とするとカレントディレクトリ以下の変更を全て追加できる
# 注意: 空のディレクトリ (libs/) はGitの管理対象にならず、addしても無視される

# 変更されたファイル(ステージングされたファイル)の確認
# Gitリポジトリの状態を確認
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   README.md
        new file:   main.py

# 履歴の記録 (コミット)
# ステージングされた変更をコミット (変更履歴を記録)
# -m オプションでコミットメッセージを直接指定できる
$ git commit -m "最初のコミット: READMEとmain.pyを追加"
[main (root-commit) abc1234] 最初のコミット: READMEとmain.pyを追加
 2 files changed, 2 insertions(+)
 create mode 100644 README.md
 create mode 100644 main.py

なお、-m を付けずに git commit を実行すると、環境変数 EDITOR で指定されたエディタが起動し、より詳細なコミットメッセージを入力できます (例: export EDITOR=vim)

履歴の閲覧 git log

# さらにファイルを変更
$ echo "A library file" > libs/utils.py
$ echo "print('Goodbye!')" >> main.py

# 変更したファイルをステージング
$ git add libs/utils.py main.py
# Tips: git add . や git add -A で変更・追加されたファイルをまとめてステージングできる

# 状態を確認
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   libs/utils.py
        modified:   main.py

# 2回目のコミット
$ git commit -m "ユーティリティファイルを追加し、main.pyを更新"
[main def5678] ユーティリティファイルを追加し、main.pyを更新
 2 files changed, 2 insertions(+)
 create mode 100644 libs/utils.py

# コミット履歴を表示 (新しい順)
$ git log
commit def567890abcdef1234567890abcdef1234567 (HEAD -> main)
Author: Your Name <your.email@example.com>
Date:   Wed Apr 9 13:38:00 2025 +0900

    ユーティリティファイルを追加し、main.pyを更新

commit abc1234567890abcdef1234567890abcdef12 (最初のコミット)
Author: Your Name <your.email@example.com>
Date:   Wed Apr 9 13:37:00 2025 +0900

    最初のコミット: READMEとmain.pyを追加

履歴の比較 (差分表示) git diff

# 直前のコミット (HEAD^) とその前のコミット (HEAD^^) の差分を表示
# HEAD は最新のコミットを指す
$ git diff HEAD^ HEAD
# またはコミットハッシュを指定 (最初の7文字程度で十分な場合が多い)
$ git diff abc1234 def5678
diff --git a/libs/utils.py b/libs/utils.py
new file mode 100644
index 0000000..9e81a38
--- /dev/null
+++ b/libs/utils.py
@@ -0,0 +1 @@
+A library file
diff --git a/main.py b/main.py
index 3a1bca1..f8c0d9f 100644
--- a/main.py
+++ b/main.py
@@ -1,2 +1,3 @@
 print('Hello, world!')
 print('Hello, Git!')
+print('Goodbye!')

# 特定のコミット (例: 最初のコミット) と現在のワーキングディレクトリの差分を表示
$ git diff abc1234
diff --git a/libs/utils.py b/libs/utils.py
new file mode 100644
index 0000000..9e81a38
--- /dev/null
+++ b/libs/utils.py
@@ -0,0 +1 @@
+A library file
diff --git a/main.py b/main.py
index e7179c1..f8c0d9f 100644
--- a/main.py
+++ b/main.py
@@ -1 +1,3 @@
 print('Hello, world!')
+print('Hello, Git!')
+print('Goodbye!')

# ワーキングディレクトリを少し変更してみる
$ echo "add new line" >> README.md

# 最新コミット(HEAD)とワーキングディレクトリの差分を表示
$ git diff HEAD
diff --git a/README.md b/README.md
index df079ab..6a3a5d2 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,2 @@
 # My Project
+add new line