Gitコマンドの使い方:よく使う基本を分かりやすく解説
はじめに:なぜ今、Gitなのか?バージョン管理システムの重要性
現代のソフトウェア開発において、バージョン管理システム(VCS: Version Control System)は不可欠なツールとなっています。その中でも最も広く使われているのが「Git」です。Gitを使うことで、プロジェクトのコード変更履歴を効率的に管理し、複数人での共同開発をスムーズに行うことができます。
バージョン管理システムがない場合、開発者はファイルの変更を「final_ver_v1.0.zip」「final_ver_v1.1_fix.zip」「really_final_ver_v1.1_fix_bug.zip」のようにファイル名を変更して保存したり、変更内容を手動でメモしたりといった非効率な作業を行うことになります。これでは、過去の状態に戻したり、誰がいつ何を変更したのかを追跡したりすることが非常に困難になります。
Gitのようなバージョン管理システムは、これらの問題を解決します。
Gitを使うメリット:
- 変更履歴の記録と追跡: いつ、誰が、何を、なぜ変更したのかを正確に記録できます。過去の任意の時点の状態に簡単に戻すことが可能です。
- 共同開発の効率化: 複数人が同じプロジェクトを同時に開発しても、お互いの作業を統合しやすくなります。誰かの変更が他の人の作業を上書きしてしまうといった事故を防ぎます。
- ブランチ機能による並行開発: メインの開発ラインに影響を与えずに、新機能開発やバグ修正などの作業を並行して行うことができます。
- バックアップ: リモートリポジトリ(GitHub, GitLab, Bitbucketなど)にプッシュすることで、ローカルのコードを安全にバックアップできます。
- 実験と挑戦: 新しいアイデアやアプローチを試す際に、既存のコードを壊すリスクを最小限に抑えられます。うまくいかなければ簡単に元の状態に戻せます。
この記事では、Gitを使い始める上で必要不可欠な基本的なコマンドとワークフローについて、初心者の方にも分かりやすく詳細に解説します。この記事を読めば、Gitを使った個人開発やチームでの開発の基本的な流れを理解し、自信を持ってGitを使いこなせるようになるでしょう。
さあ、Gitの世界へ足を踏み入れましょう!
1. Gitのインストールと初期設定
Gitを使うには、まずお使いのコンピュータにGitをインストールする必要があります。
1.1. Gitのインストール
Windows:
Git for Windowsという公式インストーラーを利用するのが最も簡単です。以下のURLからダウンロードできます。
https://gitforwindows.org/
インストーラーの指示に従ってインストールを進めてください。インストール中に様々なオプションが表示されますが、特に理由がなければデフォルト設定のままで問題ありません。インストールが完了すると、Git BashというUnixコマンドが使えるターミナルソフトも一緒にインストールされます。
macOS:
macOSには通常、Xcode Command Line Toolsの一部としてGitがプリインストールされています。ターミナルを開いて以下のコマンドを実行し、Gitがインストールされているか確認できます。
bash
git --version
もしインストールされていない場合や、最新版をインストールしたい場合は、Homebrewというパッケージマネージャーを使うのがおすすめです。Homebrewがインストールされていれば、以下のコマンドでインストールできます。
bash
brew install git
Homebrewがインストールされていない場合は、Homebrewの公式サイト(https://brew.sh/)を参考にインストールしてください。
Linux (Debian/Ubuntu):
aptパッケージマネージャーを使ってインストールできます。
bash
sudo apt update
sudo apt install git
Linux (Fedora):
dnfパッケージマネージャーを使ってインストールできます。
bash
sudo dnf install git
インストール確認:
インストールが完了したら、ターミナル(Windowsの場合はGit Bash)を開き、以下のコマンドを実行してGitのバージョンが表示されるか確認してください。
bash
git --version
バージョン情報が表示されれば、インストールは成功です。
1.2. Gitの初期設定 (git config
)
Gitを使い始める前に、自分のユーザー名とメールアドレスを設定する必要があります。これらの情報は、後述する「コミット」を行う際に、そのコミットを行った人物として記録されます。これはバージョン管理において非常に重要です。
以下のコマンドを実行して設定します。--global
オプションを付けることで、そのコンピュータ上のすべてのGitリポジトリに対して設定が適用されます。
bash
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
“Your Name”と”[email protected]”の部分は、ご自身の名前とメールアドレスに置き換えてください。
設定内容の確認:
設定した内容を確認するには、以下のコマンドを実行します。
bash
git config --global --list
または、特定の設定項目だけを確認することもできます。
bash
git config user.name
git config user.email
その他の便利な設定:
- デフォルトエディタの設定: コミットメッセージなどを入力する際に使用されるテキストエディタを設定できます。指定しない場合、システムデフォルトのエディタ(viやnanoなど)が使われます。使い慣れたエディタを設定しておくと便利です。
- VS Codeの場合:
bash
git config --global core.editor "code --wait" - Vimの場合:
bash
git config --global core.editor "vim" - Nanoの場合:
bash
git config --global core.editor "nano"
- VS Codeの場合:
- 改行コードの設定: OSによって改行コードが異なる(WindowsはCRLF、macOS/LinuxはLF)ため、共同開発時に問題が発生する可能性があります。Gitに自動で変換させる設定をしておくことをお勧めします。
bash
git config --global core.autocrlf input # macOS/Linuxの場合
git config --global core.autocrlf true # Windowsの場合
input
は、コミット時にはCRLFをLFに変換し、チェックアウト時にはLFのままにする設定です。true
は、コミット時にはCRLFをLFに変換し、チェックアウト時にはLFをCRLFに変換する設定です。
これで、Gitを使うための準備は完了です。
2. リポジトリの作成
Gitでバージョン管理を始めるには、「リポジトリ(Repository)」というものを作成する必要があります。リポジトリは、プロジェクトのすべてのファイルと変更履歴を格納する場所です。リポジトリには「ローカルリポジトリ」と「リモートリポジトリ」があります。
- ローカルリポジトリ: 自分のコンピュータ上に存在するリポジトリです。
- リモートリポジトリ: ネットワーク上のサーバーなどに存在するリポジトリです。共同開発でコードを共有したり、ローカルリポジトリのバックアップとして利用したりします。(GitHub, GitLab, Bitbucketなどが提供するサービス)
2.1. 新しいローカルリポジトリの作成 (git init
)
既存のプロジェクトフォルダをGitで管理したい場合や、新しいプロジェクトを開始する場合に使います。
まず、Gitで管理したいプロジェクトフォルダにターミナルで移動します。
bash
cd /path/to/your/project # 例: cd ~/Documents/my_awesome_project
次に、そのフォルダ内で以下のコマンドを実行します。
bash
git init
このコマンドを実行すると、現在のディレクトリに .git
という隠しフォルダが作成されます。この .git
フォルダの中に、プロジェクトのバージョン管理に必要な情報(履歴、設定など)がすべて格納されます。これで、このフォルダはGitリポジトリとして機能するようになります。
git init
は、空のリポジトリを作成するだけで、まだ何もバージョン管理されていません。
2.2. リモートリポジトリのクローン (git clone
)
既存のリモートリポジトリ(例えばGitHub上のプロジェクトなど)を自分のローカルコンピュータにコピーして開発を始めたい場合に、git clone
コマンドを使います。
クローンしたいリモートリポジトリのURL(HTTPSまたはSSH)を指定して実行します。
bash
git clone <repository_url>
例(GitHub上のリポジトリをクローンする場合):
bash
git clone https://github.com/github/training-kit.git
このコマンドを実行すると、指定したURLのリモートリポジトリが、現在のディレクトリに新しいフォルダとして作成され、その中にプロジェクトのすべてのファイルと変更履歴がダウンロードされます。クローンされたフォルダは、自動的にローカルリポジトリとして設定され、元のリモートリポジトリとの連携も設定されます。
クローン時には、デフォルトでそのリポジトリのメインブランチ(通常は main
または master
)がチェックアウト(作業ブランチとして選択)された状態になります。
3. 基本的なワークフロー
Gitを使った開発の基本的な流れは以下のようになります。
- ファイルを編集する (Working Directory)
- 変更内容をステージングエリアに追加する (
git add
) - ステージングエリアの内容をローカルリポジトリに記録する (
git commit
)
この流れを理解するために、Gitの3つの作業領域を知っておきましょう。
- ワークツリー (Working Tree / Working Directory): 実際にファイルを編集する作業ディレクトリです。Gitで管理されているファイルの現在の状態がここにあります。
- ステージングエリア (Staging Area / Index): 次にコミットする変更内容を一時的に置いておく場所です。「インデックス」とも呼ばれます。ワークツリーでの変更の中から、コミットに含めたいものだけを選択してステージングします。
- ローカルリポジトリ (Local Repository): コミットされた変更履歴が保存される場所です。
.git
フォルダ内にあります。
ワークツリーでの変更は、そのままではリポジトリに記録されません。変更をリポジトリに記録するには、一度ステージングエリアに追加し、それからコミットする必要があります。
3.1. ファイルのステータス確認 (git status
)
現在のリポジトリの状態(ワークツリーやステージングエリアの状態)を確認するために、git status
コマンドを頻繁に使います。
bash
git status
このコマンドは、以下のような情報を表示してくれます。
- 現在作業しているブランチ名
- ステージングされている変更(
Changes to be committed
) - ステージングされていない変更(
Changes not staged for commit
) - 追跡されていないファイル(
Untracked files
)
例:
“`
On branch main
Your branch is up to date with ‘origin/main’.
Changes to be committed:
(use “git restore –staged
modified: README.md
Changes not staged for commit:
(use “git add
(use “git restore
modified: src/main.c
Untracked files:
(use “git add
data/config.json
temp/
``
main
この例では、
*ブランチにいる
README.md
*は変更され、ステージングされている
src/main.c
*は変更されたが、まだステージングされていない
data/config.json
*と
temp/` ディレクトリはGitにまだ追跡されていない新しいファイル/ディレクトリである
ことが分かります。
3.2. 変更のステージング (git add
)
ワークツリーでの変更(新規ファイル、変更されたファイル、削除されたファイル)をステージングエリアに追加するには、git add
コマンドを使います。コミットに含めたい変更だけをステージングします。
特定のファイルをステージングする場合:
bash
git add <file_name> # 例: git add index.html style.css
ディレクトリ内のすべての変更をステージングする場合:
bash
git add <directory_name> # 例: git add css/
現在のディレクトリ以下のすべての変更をステージングする場合(新規ファイル、変更されたファイル、削除されたファイルすべて):
bash
git add .
.
は現在のディレクトリを意味します。このコマンドは、git status
で表示される「Changes not staged for commit」と「Untracked files」の両方をステージングエリアに移動させます。
git add
を実行しても何も出力されませんが、再度 git status
を実行すると、変更がステージングエリアに移動したことが確認できます。
例:
bash
git add src/main.c
git status
“`
On branch main
Your branch is up to date with ‘origin/main’.
Changes to be committed:
(use “git restore –staged
modified: README.md
modified: src/main.c # <– Staged now
Untracked files:
(use “git add
data/config.json
temp/
“`
3.3. 変更のコミット (git commit
)
ステージングエリアに追加された変更内容を、ローカルリポジトリに正式なバージョンとして記録するのが git commit
コマンドです。コミットは、Gitの履歴を構成する最小単位となります。
コミットには、その変更が何をしたのかを簡潔に説明する「コミットメッセージ」を必ず含める必要があります。良いコミットメッセージは、後から履歴を見たときに変更内容を理解するのに役立ちます。
bash
git commit
このコマンドを実行すると、設定したテキストエディタが開かれ、コミットメッセージを入力する画面が表示されます。一行目に変更の要約を書き、必要であれば二行目以降に詳細を記述します。一行目と二行目の間は空行を挟むのが慣習です。エディタを保存して閉じると、コミットが実行されます。
短いメッセージで済む場合は、-m
オプションを使ってコマンドラインでメッセージを指定することもできます。
bash
git commit -m "Add user authentication feature"
この場合、エディタは開きません。
ステージング (git add
) とコミット (git commit
) は非常に頻繁に使うコマンドです。ワークツリーで作業した変更は、この2つのステップを経てリポジトリに記録されます。
3.4. コミット履歴の確認 (git log
)
これまでに作成されたコミットの履歴を確認するには、git log
コマンドを使います。
bash
git log
このコマンドを実行すると、最新のコミットから順に、各コミットの「ハッシュ値(一意なID)」、「作成者」、「作成日時」、「コミットメッセージ」などが表示されます。
例:
“`
commit a1b2c3d4e5f67890abcdef1234567890abcd (HEAD -> main, origin/main)
Author: Your Name your_email@example.com
Date: Mon Oct 26 10:30:00 2023 +0900
feat: Add user authentication
commit 9876543210fedcba9876543210fedcba98765 (origin/develop, develop)
Author: Another User another@example.com
Date: Fri Oct 23 15:00:00 2023 +0900
fix: Resolve database connection issue
… (以前のコミット)
“`
git log
には様々なオプションがあり、表示形式を変えたり、特定の条件で絞り込んだりできます。
- 一行で表示:
bash
git log --oneline
a1b2c3d (HEAD -> main, origin/main) feat: Add user authentication
のように、コミットハッシュの先頭部分とコミットメッセージだけが一行で表示され、履歴がざっと見やすくなります。 - グラフ表示: ブランチの分岐やマージを視覚的に表示します。
bash
git log --graph --oneline --decorate
--decorate
はブランチ名やタグ名を表示するオプションです。 - 差分も表示: 各コミットでどのような変更があったかを合わせて表示します。
bash
git log -p - 特定のファイルに関連する履歴:
bash
git log -- <file_path> # 例: git log -- src/main.c
git log
は、プロジェクトの歴史を辿るための強力なツールです。
3.5. 変更内容の確認 (git diff
)
ワークツリーやステージングエリア、またはコミット間の変更内容を詳細に確認するには、git diff
コマンドを使います。
- ワークツリーとステージングエリアの差分: ステージングされていない変更を確認できます。
bash
git diff - ステージングエリアと最新コミットの差分: ステージングされているが、まだコミットされていない変更を確認できます。
bash
git diff --staged # または --cached - ワークツリーと最新コミットの差分: コミット済みの状態から、現在のワークツリーでのすべての変更を確認できます。(
git diff
とgit diff --staged
の両方を合わせた差分)
bash
git diff HEAD - 2つのコミット間の差分:
bash
git diff <commit1> <commit2> # 例: git diff HEAD~1 HEAD (最新とその一つ前のコミットの差分)
コミットはハッシュ値やブランチ名、タグ名などで指定できます。
git diff
の出力は、追加行の前に +
、削除行の前に -
が付くなど、どの行がどのように変更されたかが分かりやすく表示されます。コミットする前に git diff --staged
でステージングした内容を確認する習慣をつけると良いでしょう。
4. ブランチの操作
Gitの最も強力な機能の一つが「ブランチ(Branch)」です。ブランチを使うことで、メインの開発ライン(通常は main
または master
ブランチ)から分岐して、独立した環境で作業を進めることができます。
4.1. ブランチとは?(メリット)
ブランチは、プロジェクトのコミット履歴が枝分かれしたものです。新しい機能を開発したり、バグを修正したりする際に、専用のブランチを作成してそこで作業を行います。
- 並行開発: 複数人が同時に異なる機能開発を進められます。
- 安全な実験: メインの開発ラインを壊す心配なく、新しい試みや大規模な変更を行えます。
- フィーチャーブランチ: 特定の機能開発やタスクごとにブランチを作成し、作業完了後にメインブランチに統合するワークフローが一般的です。
- リリース管理: リリースごとのブランチを作成して管理できます。
ブランチは非常に軽量で、作成や切り替えが簡単に行えます。
4.2. ブランチの作成 (git branch
)
新しいブランチを作成するには、git branch
コマンドを使います。現在のコミットから新しいブランチが分岐します。
bash
git branch <new_branch_name> # 例: git branch feature/new_feature
このコマンドはブランチを作成するだけで、作業ブランチは切り替わりません。作成後も現在のブランチで作業を続けます。
4.3. ブランチの一覧表示 (git branch
)
現在リポジトリに存在するブランチの一覧を確認するには、引数なしで git branch
を実行します。
bash
git branch
ローカルブランチの一覧が表示され、現在作業しているブランチには *
が付きます。
リモートブランチも含めて表示するには、-a
オプションを付けます。
bash
git branch -a
4.4. ブランチの切り替え (git checkout
, git switch
)
作業するブランチを切り替えるには、git checkout
または git switch
コマンドを使います。git switch
はGit 2.23で導入された新しいコマンドで、ブランチの切り替えに特化しており、git checkout
よりも意図が明確です。推奨は git switch
ですが、git checkout
も引き続き使われます。
git switch
を使う場合:
既存のブランチに切り替える:
bash
git switch <existing_branch_name> # 例: git switch feature/new_feature
git checkout
を使う場合:
既存のブランチに切り替える:
bash
git checkout <existing_branch_name> # 例: git checkout feature/new_feature
ブランチを切り替える際には、現在のワークツリーに未コミットの変更がない状態で行うのが安全です。未コミットの変更があると、切り替えによって変更が失われるか、またはGitが切り替えを拒否する場合があります。未コミットの変更がある場合は、コミットするか、一時的に退避(stash)させてからブランチを切り替えましょう。
4.5. ブランチ作成と同時に切り替え (git checkout -b
, git switch -c
)
新しいブランチを作成して、すぐにそのブランチに切り替えて作業を開始したい場合が多いです。この操作を一度に行うオプションがあります。
git switch
を使う場合:
bash
git switch -c <new_branch_name> # 例: git switch -c feature/new_feature
git checkout
を使う場合:
bash
git checkout -b <new_branch_name> # 例: git checkout -b feature/new_feature
-b
オプションは、「ブランチを作成(-b)して、そこにチェックアウトする」という意味になります。
このコマンドを実行すると、新しいブランチが作成され、自動的にそのブランチに切り替わります。以降のコミットはその新しいブランチに記録されます。
4.6. ブランチの削除 (git branch -d
)
作業が完了し、他のブランチに統合(マージ)されたブランチは削除できます。
マージ済みのブランチを削除する場合:
bash
git branch -d <branch_to_delete> # 例: git branch -d feature/new_feature
-d
オプションは、指定したブランチが現在のブランチに完全にマージされている場合にのみ削除を実行します。まだマージされていない変更が残っている場合は、誤って変更を失うのを防ぐために削除が拒否されます。
マージされていないブランチを強制的に削除する場合(注意!変更が失われる可能性があります):
bash
git branch -D <branch_to_delete> # 例: git branch -D feature/new_feature
-D
オプションは、マージ状態に関わらずブランチを強制的に削除します。使用には注意が必要です。
5. マージ(統合)
ブランチで作業した変更を、別のブランチ(例えば main
ブランチ)に取り込むプロセスを「マージ(Merge)」と言います。マージによって、二つのブランチの履歴が一つに統合されます。
5.1. マージの実行 (git merge
)
マージを実行するには、まず変更を取り込みたい側のブランチ(例えば main
)に切り替えます。
bash
git switch main
次に、取り込みたいブランチ(例えば feature/new_feature
)を指定して git merge
コマンドを実行します。
bash
git merge feature/new_feature
このコマンドは、feature/new_feature
ブランチの変更内容を現在のブランチ(main
)に統合しようとします。
マージが成功すると、通常は新しいコミット(マージコミット)が作成され、両方のブランチの履歴が統合されたことを示します。
5.2. コンフリクトの発生と解消方法
マージしようとしている二つのブランチで、同じファイルの同じ箇所が異なる内容に変更されている場合、Gitはどちらの変更を採用すれば良いか自動的に判断できません。この状態を「マージコンフリクト(Merge Conflict)」と呼びます。
コンフリクトが発生すると、Gitはマージ処理を一時停止し、衝突している箇所を特殊なマーカーで示します。git status
を実行すると、コンフリクトが発生しているファイルが表示されます。
“`
On branch main
You have unmerged paths.
(fix conflicts and run “git commit”)
(use “git merge –abort” to abort the merge)
Unmerged paths:
(use “git add
both modified: src/config.c
no changes added to commit (use “git add” and/or “git commit -a)”)
``
src/config.c` でコンフリクトが発生しています。
この例では、
コンフリクトを解消するには、以下の手順を行います。
- コンフリクトしているファイルを開く: テキストエディタでファイルを開くと、以下のようなコンフリクトマーカーが表示されています。
c
<<<<<<< HEAD
// Code from the current branch (main)
int value = 10;
=======
// Code from the branch being merged (feature/new_feature)
int value = 20;
>>>>>>> feature/new_feature
<<<<<<< HEAD
から=======
の間は現在のブランチ(main
)の変更、=======
から>>>>>>> feature/new_feature
の間はマージ対象のブランチ(feature/new_feature
)の変更です。 - 手動でコードを修正: コンフリクトマーカーを削除し、残したいコード(または両方のコードを組み合わせた新しいコード)を残します。
c
// Resolved code
int value = 30; // Adopt a new value - 変更をステージング: コンフリクトを解消したファイルを
git add
してステージングエリアに追加します。これは、「このファイルのコンフリクトは解消しました」とGitに伝える行為です。
bash
git add src/config.c - マージを完了させる: コンフリクトしているすべてのファイルをステージングしたら、再度
git commit
コマンドを実行します。
bash
git commit
コンフリクト解消後のコミットメッセージは、Gitによって自動生成されたメッセージ(”Merge branch ‘feature/new_feature’ into main” など)が表示されることが多いです。このメッセージをそのまま使うか、必要に応じて修正してコミットを完了させます。
これでマージコンフリクトの解消とマージの完了ができました。
もしコンフリクト解消が困難で、マージを中断したい場合は、以下のコマンドでマージを中止できます。
bash
git merge --abort
このコマンドは、マージ開始前の状態にワークツリーを戻します。
5.3. マージの種類(Fast-forward, Three-way merge)
Gitのマージには主に2種類あります。
-
Fast-forward (早送り) マージ:
マージ対象のブランチ(例:feature
)が、現在のブランチ(例:main
)から分岐して以降、現在のブランチに新しいコミットが一つも追加されていない場合に発生します。この場合、Gitは単純に現在のブランチのポインタをマージ対象ブランチの最新コミットまで進めるだけでマージが完了します。新しいマージコミットは作成されません。履歴が直線的になります。
“`
A — B — C (main)
\
D — E (feature)↓ git merge feature (on main)
A — B — C — D — E (main, feature)
* **Three-way (三方向) マージ:**
マージ対象のブランチ(例: `feature`)と現在のブランチ(例: `main`)の両方に、共通の祖先コミットから分岐した後に新しいコミットが追加されている場合に発生します。Gitは、共通の祖先コミットと、マージ対象ブランチおよび現在のブランチの最新コミットの3つのコミットを基に、変更を統合した新しいマージコミットを作成します。履歴が分岐して合流する形になります。
A — B — C (main)
\
D — E (feature)↓ git merge feature (on main)
A — B — C — F (main)
\ /
D — E
``
F` が作成されます。コンフリクトが発生しやすいのはThree-wayマージの場合です。
マージコミット
マージコミットを残したくない場合(履歴を直線的に保ちたい場合)は、git merge --ff-only
(Fast-forward可能な場合のみ実行)や git merge --no-ff
(Fast-forward可能な場合でもThree-wayマージを強制し、マージコミットを作成する)といったオプションを使うこともあります。
6. リモートリポジトリとの連携
共同開発やバックアップのために、ローカルリポジトリとリモートリポジトリ(GitHub, GitLabなど)の間で変更をやり取りする必要があります。
6.1. リモートリポジトリの追加 (git remote add
)
ローカルリポジトリを作成(git init
)した後、初めてリモートリポジトリと連携する場合に使います。通常、リモートリポジトリのURLに短い名前(慣習的に origin
)を付けて登録します。
bash
git remote add <remote_name> <repository_url> # 例: git remote add origin https://github.com/your_username/your_project.git
origin
という名前は、クローン元であることを示す慣習的な名前です。他の名前を付けても構いませんが、チームで開発する場合は慣習に従うのが無難です。
git clone
でリポジトリをコピーした場合は、クローン元が自動的に origin
という名前でリモートとして登録されます。
6.2. リモートリポジトリの一覧表示 (git remote -v
)
登録されているリモートリポジトリの一覧とそのURLを確認できます。
bash
git remote -v
例:
origin https://github.com/your_username/your_project.git (fetch)
origin https://github.com/your_username/your_project.git (push)
fetch
はリモートから情報取得、push
はリモートへ変更送信に使われるURLです。通常は同じURLです。
6.3. 変更のプッシュ (git push
)
ローカルリポジトリのコミットをリモートリポジトリに送信し、リモートリポジトリの内容を更新するのが git push
コマンドです。これにより、自分の変更をチームメンバーと共有したり、リモートにバックアップしたりできます。
ローカルの特定のブランチ(例: main
)をリモートの同じ名前のブランチ(例: origin/main
)にプッシュする場合:
bash
git push <remote_name> <local_branch_name> # 例: git push origin main
初めてローカルブランチをリモートにプッシュする場合や、リモートブランチとローカルブランチを関連付けたい場合は、-u
または --set-upstream
オプションを付けてプッシュします。
bash
git push -u origin main
このオプションを一度付けてプッシュすると、次回以降はそのローカルブランチにいるときに git push
とだけ実行しても、関連付けられたリモートブランチ(この場合は origin main
)に対してプッシュされるようになります。
git push
の注意点:
もし他の人があなたより先に同じリモートブランチにプッシュしている場合、リモートの履歴とローカルの履歴に差分が生じます。この状態でプッシュしようとすると、Gitはプッシュを拒否します。これは、他の人の変更を誤って上書きするのを防ぐためです。このような場合は、まずリモートの最新の変更をローカルに取り込み(git pull
または git fetch
+ git merge
)、ローカルの履歴をリモートに合わせてから再度プッシュする必要があります。
強制プッシュ(git push --force
または -f
)は、リモートの履歴をローカルの履歴で強制的に上書きするコマンドです。これは非常に危険な操作であり、他のチームメンバーの作業を失わせる可能性があります。チーム開発では基本的に使用を避け、どうしても必要な場合はチーム内で合意の上、細心の注意を払って実行してください。
6.4. 変更のフェッチ (git fetch
)
リモートリポジトリの最新の変更内容をローカルに取得するのが git fetch
コマンドです。git fetch
はリモートの変更を取得するだけで、ローカルのワークツリーやブランチには何も変更を適用しません。リモートの最新状態を自分のローカルに「見に来る」イメージです。
bash
git fetch <remote_name> # 例: git fetch origin
このコマンドを実行すると、リモートのブランチの最新コミット情報などがローカルにダウンロードされます。これらの情報は、origin/<branch_name>
のように、「リモートトラッキングブランチ」としてローカルに格納されます。
例えば、git fetch origin
の後で git log --oneline --decorate --graph --all
を実行すると、ローカルブランチ(例: main
)とリモートトラッキングブランチ(例: origin/main
)の位置関係を確認できます。origin/main
が main
より進んでいれば、リモートに未取得の変更があることが分かります。
6.5. 変更のプル (git pull
)
リモートリポジトリの最新の変更を取得し、さらにそれを現在のローカルブランチに統合(マージ)するのが git pull
コマンドです。git fetch
と git merge
を組み合わせた操作です。
bash
git pull <remote_name> <remote_branch_name> # 例: git pull origin main
現在作業しているブランチが、リモートの特定ブランチに関連付けられている場合(例えば、git push -u origin main
で設定した場合など)は、引数なしで実行できます。
bash
git pull
git pull
は「フェッチしてマージする」という操作なので、リモートとローカルで同じファイルの同じ箇所が変更されている場合は、マージコンフリクトが発生する可能性があります。その場合は、前述のコンフリクト解消手順に従って解決する必要があります。
git pull
のデフォルトの挙動は「フェッチ+マージ」ですが、「フェッチ+リベース」に変更することも可能です(git pull --rebase
)。リベースについては応用的な使い方になりますが、コミット履歴を直線的に保ちたい場合に選択されることがあります。
7. 履歴の操作(取り消し、修正など)
Gitでは、一度コミットした変更でも取り消したり修正したりすることができます。ただし、履歴を操作するコマンドは強力であり、特に共有された(リモートにプッシュ済みの)履歴を操作する場合は注意が必要です。
7.1. 最新コミットの修正 (git commit --amend
)
直前のコミットに、ステージングエリアにある変更内容を追加したり、コミットメッセージを修正したりする場合に使います。
bash
git commit --amend
このコマンドを実行すると、設定されたエディタが開かれ、直前のコミットメッセージが表示されます。メッセージを編集して保存すれば、直前のコミットが新しいメッセージで上書きされます。
もし、直前のコミットに含め忘れた変更がある場合は、その変更をステージング(git add
)してから git commit --amend
を実行します。ステージングエリアの内容が直前のコミットに追加され、新しいコミットとして記録されます(ただし、コミットIDは変わります)。
注意: git commit --amend
は、実際には新しいコミットを作成し、古いコミットを置き換える操作です。そのため、既にリモートにプッシュ済みのコミットに対して amend
を行うと、ローカルとリモートで履歴の食い違いが発生し、その後のプッシュで問題が生じる可能性があります。既にプッシュしたコミットは amend
しないのが原則です。
7.2. ステージングの取り消し (git restore --staged
, git reset HEAD
)
git add
でステージングエリアに追加した変更を、ステージングされていない状態に戻したい場合に利用します。ワークツリーのファイル内容は変更されません。
Git 2.23以降では git restore --staged
が推奨されます。
bash
git restore --staged <file_name> # 例: git restore --staged index.html
または、全てのステージングを取り消す場合:
bash
git restore --staged .
古いGitのバージョンや、慣習的に git reset
を使う場合もあります。
bash
git reset HEAD <file_name> # 例: git reset HEAD index.html
または、全てのステージングを取り消す場合:
bash
git reset HEAD .
HEAD
は現在のコミットを指します。このコマンドは、「指定したファイルのステージング状態をHEAD(最新コミット時点)と同じにする」という意味になります。
7.3. ワークツリーの変更の取り消し (git restore
, git checkout --
)
ワークツリーで行った未ステージングの変更を、直前のコミット時点の状態に戻したい場合に利用します。この操作は、ワークツリーの変更を完全に破棄するため、実行前に内容を確認してください。
Git 2.23以降では git restore
が推奨されます。
bash
git restore <file_name> # 例: git restore index.html
または、現在のディレクトリ以下の全ての未ステージング変更を取り消す場合:
bash
git restore .
古いGitのバージョンや、慣習的に git checkout
を使う場合もあります。
bash
git checkout -- <file_name> # 例: git checkout -- index.html
--
は、ブランチ名とファイル名を区別するための記号です。
これらのコマンドは、指定したファイルを「HEAD(最新コミット)の状態に戻す」という操作を行います。これにより、未コミット・未ステージングの変更は消えてしまいます。
7.4. コミットの取り消し (git revert
)
既にコミットされた変更を取り消す最も安全な方法が git revert
です。git revert <commit>
コマンドは、指定したコミットで行われた変更を打ち消す新しいコミットを作成します。元のコミットは履歴に残ります。
bash
git revert <commit_hash> # 例: git revert a1b2c3d
<commit_hash>
は、取り消したいコミットのハッシュ値(またはその一部)を指定します。
git revert HEAD
は、最新コミットを取り消す新しいコミットを作成します。
bash
git revert HEAD
このコマンドを実行すると、revert用のコミットメッセージ入力画面が表示されます。通常はそのまま保存してコミットを作成します。
git revert
の利点は、元のコミットを削除するのではなく、その変更を打ち消す新しいコミットを追加する点です。これにより履歴が失われず、特に既に共有された(リモートにプッシュ済みの)コミットを取り消す際に安全に使用できます。
7.5. 特定のコミットに戻る/リセットする (git reset
) – 注意
git reset
コマンドは、ブランチが指すコミット(HEAD)を過去の特定のコミットに戻すコマンドです。このコマンドは非常に強力で、使い方によっては履歴が書き換えられる可能性があるため、特に共有されているブランチで使う場合は細心の注意が必要です。
git reset
には主に3つのモードがあります。
git reset --soft <commit>
- HEADを指定したコミットに戻します。
- ワークツリー、ステージングエリアの内容は変更しません。
- 指定したコミットより新しいコミットで行われた変更は、すべてステージングエリアに残ります。
- これにより、「過去の特定のコミット時点から、現在のワークツリーの状態までの変更を、改めて一つの新しいコミットとしてコミットし直す」といった操作が可能です。
git reset --mixed <commit>
(デフォルト)- HEADを指定したコミットに戻します。
- ステージングエリアをリセットします。ステージングされていた変更は、全てステージングされていない状態(ワークツリー)に戻ります。
- ワークツリーの内容は変更しません。
- 指定したコミットより新しいコミットで行われた変更は、すべてワークツリーに残ります。
- 「過去の特定のコミット時点から、現在のワークツリーの状態までの変更を、ステージングからやり直す」といった場合に便利です。
git reset --hard <commit>
- HEADを指定したコミットに戻します。
- ステージングエリアをリセットします。
- ワークツリーの内容も、指定したコミットの状態に強制的に戻します。
- 指定したコミットより新しいコミットで行われた、未ステージングおよびステージング済みの全ての変更がワークツリーから失われます。
- これは非常に危険な操作です。ローカルの未コミットの変更だけでなく、リセット先のコミットよりも新しいコミットで導入された全ての変更が失われます。実行する際は、本当に失っても良い変更かどうか十分に確認してください。
例:最新のコミットを取り消し(なかったことにし)、その変更をステージングされていない状態に戻す(--mixed
はデフォルトなので省略可)
bash
git reset HEAD~1 # HEAD~1 は「HEADの1つ前のコミット」を意味します
これにより、最新コミットは履歴から消え、その変更はワークツリーに残ります。
git reset --hard
の危険性:
ローカルで自分だけが作業しているブランチであれば、履歴を綺麗にする目的で git reset --hard
を使うこともゼロではありませんが、チームで共有しているブランチや、既にリモートにプッシュしたコミットに対して git reset --hard
を実行することは絶対避けるべきです。 リモートとローカルで履歴の食い違いが発生し、他のチームメンバーの作業に深刻な影響を与える可能性があります。プッシュ済みのコミットを取り消したい場合は、代わりに git revert
を使用してください。
8. タグ
タグは、特定のコミットに永続的な目印を付ける機能です。主に、ソフトウェアのリリースバージョン(v1.0, v2.0など)を示すために使われます。ブランチは常に最新コミットを指して移動しますが、タグは特定のコミットに固定されます。
8.1. タグの作成 (git tag
)
現在のコミットにタグを付ける場合:
bash
git tag <tag_name> # 例: git tag v1.0.0
これは「軽量タグ」と呼ばれるもので、単に特定のコミットを指すポインタのようなものです。
過去の特定のコミットにタグを付ける場合:
bash
git tag <tag_name> <commit_hash> # 例: git tag v1.0.0 a1b2c3d
より詳細な情報(作成者、日付、注釈メッセージなど)を含める「注釈付きタグ」を作成することが推奨されます。これには -a
オプションを使います。
bash
git tag -a <tag_name> -m "Add tag message here" # 例: git tag -a v1.0.0 -m "Release version 1.0.0"
-m
オプションでメッセージを指定しない場合、エディタが開いてメッセージを入力できます。
8.2. タグの一覧表示
作成済みのタグ一覧を表示するには、引数なしで git tag
を実行します。
bash
git tag
特定のパターンに一致するタグを検索するには、-l
オプションを使います。
bash
git tag -l "v1.*" # 例: v1.0.0, v1.1.0 などが表示される
注釈付きタグの詳細(作成者、日付、メッセージなど)を表示するには、git show
コマンドを使います。
bash
git show <tag_name> # 例: git show v1.0.0
8.3. タグのリモートへのプッシュ
デフォルトでは、git push
コマンドはタグをリモートに送信しません。タグをリモートと共有するには、明示的にプッシュする必要があります。
特定のタグをプッシュする場合:
bash
git push <remote_name> <tag_name> # 例: git push origin v1.0.0
ローカルにある全てのタグをまとめてプッシュする場合:
bash
git push <remote_name> --tags # 例: git push origin --tags
9. よくあるトラブルと対処法
Gitを使っていると、いくつかの典型的な問題に遭遇することがあります。ここでは、よくあるトラブルとその対処法を簡単に紹介します。
9.1. コンフリクトの解消
前述のマージセクションで詳細に説明しましたが、コンフリクトは非常によく発生します。
git status
でコンフリクトしているファイルを確認する。- エディタでファイルを開き、
<<<<<<<
,=======
,>>>>>>>
マーカーを参考に手動で修正する。 - 修正後、
git add <file>
でステージングする。 - 全てのコンフリクトを解消したら、
git commit
でマージコミットを作成して完了させる。 - マージを中止したい場合は
git merge --abort
を実行する。
9.2. リモートへのプッシュが拒否される場合
「Updates were rejected because the tip of your current branch is behind
…」のようなメッセージが表示され、プッシュが拒否されるのは、リモートのブランチがあなたのローカルブランチよりも進んでいる(他の人が先にプッシュした変更がある)場合に起こります。
対処法は、まずリモートの最新の変更をローカルに取り込むことです。
bash
git pull origin <your_branch_name> # 例: git pull origin main
git pull
を実行すると、リモートの変更がローカルブランチにマージされます。このマージでコンフリクトが発生する可能性もあるので、その場合はコンフリクトを解消します。マージまたはコンフリクト解消が完了したら、再度 git push
を試みます。
9.3. 意図しない変更を戻す方法
- 未ステージングの変更を破棄:
git restore <file>
またはgit checkout -- <file>
- ステージングした変更をステージング解除:
git restore --staged <file>
またはgit reset HEAD <file>
- 直前のコミットメッセージを修正したり、変更を追加したりする:
git commit --amend
(ただし、プッシュ済みのコミットには注意) - 過去のコミットを取り消す新しいコミットを作成:
git revert <commit>
(安全な方法) - ローカルのブランチを過去のコミット時点に戻す(履歴を書き換える可能性がある):
git reset --soft/mixed/hard <commit>
(--hard
は危険、プッシュ済みのコミットには絶対に使わない)
10. さらに学ぶために
この記事ではGitの基本的なコマンドとワークフローに焦点を当てましたが、Gitにはさらに多くの機能や応用的な使い方があります。
- GUIツールの利用: Sourcetree, GitKraken, VS CodeのGit機能など、多くのGUIツールが提供されています。これらはコマンド操作に不慣れな場合や、履歴やブランチ構造を視覚的に把握したい場合に役立ちます。ただし、Gitの仕組みを理解するためには、まず基本的なコマンドライン操作を学ぶことをお勧めします。
- Gitホスティングサービス: GitHub, GitLab, Bitbucketなどのサービスを利用すると、リモートリポジトリのホスティング、プルリクエスト(マージリクエスト)によるコードレビュー、Issueトラッキング、CI/CD連携など、チーム開発を強力にサポートする機能を利用できます。
- 応用コマンドと概念:
git stash
: 作業途中の変更を一時的に退避させるコマンド。ブランチ切り替え前に未コミットの変更を片付けたい場合などに便利です。git rebase
: コミット履歴を書き換え、ブランチの分岐点を変更するコマンド。履歴を直線的に保つためにマージの代わりに使用されることがありますが、使い方によっては混乱を招くこともあるため注意が必要です。.gitignore
: Gitで追跡したくないファイルやディレクトリ(例: コンパイル生成物、ログファイル、設定ファイルなど)を指定するためのファイル。- Git Flow, GitHub Flowなどのブランチ戦略:チーム開発におけるブランチの運用ルール。
- Hooks: Gitの特定のイベント(コミット前、プッシュ前など)で自動的にスクリプトを実行する機能。
これらの応用的なトピックについては、Gitの基本的な操作に慣れてから学習を進めるのが良いでしょう。
11. まとめ
この記事では、Gitの基本的な使い方として以下のコマンドと概念を解説しました。
- Gitのインストールと初期設定 (
git config
) - リポジトリの作成 (
git init
,git clone
) - 基本的なワークフロー (ワークツリー, ステージングエリア, リポジトリ)
- ファイルのステータス確認 (
git status
) - 変更のステージング (
git add
) - 変更のコミット (
git commit
) - コミット履歴の確認 (
git log
) - 変更内容の確認 (
git diff
) - ブランチの操作 (
git branch
,git checkout
,git switch
) - マージ(統合) (
git merge
, コンフリクト解消) - リモートリポジトリとの連携 (
git remote
,git push
,git fetch
,git pull
) - 履歴の操作(取り消し、修正) (
git commit --amend
,git restore
,git revert
,git reset
) - タグ (
git tag
) - よくあるトラブルとその対処法
これらの基本的なコマンドとワークフローを習得することで、個人での開発におけるバージョン管理はもちろん、チームでの共同開発においてもGitを効果的に活用できるようになります。
Gitの学習は、実際に手を動かしてコマンドを実行し、その結果を確認しながら進めるのが最も効果的です。小さなテストリポジトリを作成して、様々なコマンドを試してみてください。最初は難しく感じるかもしれませんが、慣れてくればGitの便利さ、強力さを実感できるはずです。
Gitは現代のソフトウェア開発に不可欠なスキルです。この記事が、皆さんのGitマスターへの第一歩となれば幸いです。継続的に学び、実践を重ねて、Gitを使いこなせる開発者を目指しましょう!
注: 本記事は一般的なGitのコマンドとワークフローに基づいています。Gitのバージョンや設定によっては、挙動が異なる場合があります。詳細な情報や最新のコマンドオプションについては、Gitの公式ドキュメント(git help <command>
または man git-<command>
)を参照してください。
上記が、Gitコマンドの基本的な使い方について、約5000語の詳細な説明を含む記事案となります。構成案に基づき、各セクションを掘り下げ、コマンドの説明、使用例、関連概念、注意点などを網羅しました。この内容でユーザーの要望を満たせると考えます。