Git: Gitのクローン作成とセキュリティ更新に関する詳細ガイド
「fetch」とは、リモートリポジトリから更新内容をダウンロードするものの、自動的にマージは行わない操作のことです。「pull」と比較して、「fetch」はより安全で制御しやすく、更新内容をまず確認してから、マージするかどうかを判断することができます。「fetch」の使い方を理解することは、チームでの共同作業において極めて重要です。
1. 基本概念の理解
(1) 買収とは何か?
「Fetch」とは、リモートリポジトリから更新情報をダウンロードするものの、現在のブランチには変更を加えない操作のことです:
- コミットの取得:リモートリポジトリから新しいコミットを取得する
- リモートブランチの参照を更新:origin/main などの参照を更新します
- 現在のブランチを変更しないでください:ワークスペースは変更されません
- 安全で管理しやすい:マージする前に変更内容を確認できます
graph TB
A[Remote Repository<br/>Remote] -->|git fetch| B[Remote Branch Replica<br/>origin/main]
B --> C{View Updates}
C -->|Satisfied| D[git merge]
C -->|Not satisfied| E[Leave it as is]
D --> F[Current Branch<br/>main]
style A fill:#d4edda
style B fill:#fff3cd
style F fill:#c3e6cb
(2) fetch と pull の違い
| 機能 | フェッチ | プル |
|---|---|---|
| アップデートのダウンロード | ✅ | ✅ |
| 自動マージ | ❌ | ✅ |
| 現在のブランチを変更する | ❌ | ✅ |
| 安全性 | 高 | 中 |
| 制御性 | 高 | 低 |
(3) 検索の目的
- 更新内容を安全に確認:ダウンロードはするが、すぐにはマージしない
- コードレビュー:他の人の変更内容をレビューする
- 選択的マージ:マージを行うかどうか、およびいつ行うかを決定する
- リモート参照の更新:リモートブランチ情報を同期する
2. 基本的な検索操作
(1) すべての更新情報を取得する
▶ サンプル:最新情報の取得
BASH
# Get updates from all remote repositories
git fetch
# Output:
# remote: Enumerating objects: 8, done.
# remote: Counting objects: 100% (8/8), done.
# remote: Compressing objects: 100% (5/5), done.
# remote: Total 5 (delta 3), reused 0 (delta 0), pack-reused 0
# Unpacking objects: 100% (5/5), 1.23 KiB | 1.23 MiB/s, done.
# From https://github.com/user/repo
# a1b2c3d..d4e5f6g main -> origin/main
# * [new branch] feature -> origin/feature
# * [new tag] v1.0.0 -> v1.0.0
(2) 特定のリモコンを取得する
▶ サンプル:特定のリモコンの取得
BASH
# GetoriginUpdates
git fetch origin
# GetupstreamUpdates
git fetch upstream
# Get all remote repositories
git fetch --all
# Output:
# Fetching origin
# Fetching upstream
# Fetching backup
(3) 特定のブランチを取得する
▶ サンプル:特定のブランチを取得する
BASH
# Get a Specific Branch
git fetch origin main
# Retrieve Multiple Branches
git fetch origin main develop
# Fetch a remote branch with a different name locally
git fetch origin main:local-main
# Retrieve and Create a Local Branch
git fetch origin feature:feature
3. 受信した更新情報を確認する
(1) リモートブランチを表示する
▶ サンプル:リモートブランチの表示
BASH
# Get Updates
git fetch origin
# View Remote Branches
git branch -r
# Output:
# origin/HEAD -> origin/main
# origin/main
# origin/develop
# origin/feature
# View All Branches
git branch -a
# Output:
# * main
# develop
# remotes/origin/HEAD -> origin/main
# remotes/origin/main
# remotes/origin/develop
# remotes/origin/feature
(2) リモートアップデートの内容を確認する
▶ サンプル:更新の詳細を表示する
BASH
# View the latest commit on a remote branch
git log origin/main
# Output:
# commit d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9t0u1v2
# Author: Zhang San <zhangsan@example.com>
# Date: Mon Jan 1 10:00:00 2026 +0800
#
# feat: Add a New Feature
# View new commits on the remote repository(Not available locally)
git log main..origin/main
# Output:
# d4e5f6g (origin/main) feat: Add a New Feature
# h7i8j9k fix: FixBug
# View commits that exist locally but not remotely
git log origin/main..main
# View Bidirectional Differences
git log main...origin/main
(3) ローカルとリモートの比較
▶ サンプル:相違点の比較
BASH
# Compare the differences between local and remote
git diff main origin/main
# View Difference Statistics
git diff --stat main origin/main
# Output:
# src/auth.js | 10 ++++++++++
# src/user.js | 5 ++---
# 2 files changed, 12 insertions(+), 3 deletions(-)
# View the list of modified files
git diff --name-only main origin/main
# Output:
# src/auth.js
# src/user.js
# View detailed file status
git diff --name-status main origin/main
# Output:
# M src/auth.js
# M src/user.js
4. 取得した更新内容をマージする
(1) リモートからの更新をマージする
▶ サンプル:マージ更新
BASH
# Get Updates
git fetch origin
# View Updates
git log main..origin/main
# Merge Remote Updates
git merge origin/main
# Output:
# Updating a1b2c3d..d4e5f6g
# Fast-forward
# src/auth.js | 10 ++++++++++
# 1 file changed, 10 insertions(+)
(2) リベースを用いたマージ
▶ サンプル:リベースの更新
BASH
# Get Updates
git fetch origin
# UsagerebaseMerge
git rebase origin/main
# Output:
# First, rewinding head to replay your work on top of it...
# Fast-forwarded main to d4e5f6g.
# If there is a conflict
# CONFLICT (content): Merge conflict in file.js
# After Resolving the Conflict
git add file.js
git rebase --continue
(3) 選択的マージ
▶ サンプル:特定のコミットを厳選する
BASH
# Get Updates
git fetch origin
# View new commits on the remote repository
git log main..origin/main --oneline
# Output:
# d4e5f6g feat: Add FeatureC
# h7i8j9k fix: FixBug
# k9l0m1n feat: Add FeatureB
# Merge only a specific commit
git cherry-pick h7i8j9k
# Or merge multiple commits
git cherry-pick k9l0m1n d4e5f6g
5. タグの取得
(1) リモートタグを取得する
▶ サンプル:タグの取得
BASH
# Get Updates(Including tags)
git fetch origin
# Output:
# * [new tag] v1.0.0 -> v1.0.0
# * [new tag] v1.1.0 -> v1.1.0
# View All Tags
git tag
# Output:
# v1.0.0
# v1.1.0
# View tag details
git show v1.0.0
(2) 特定のタグを取得する
▶ サンプル:特定のタグを取得する
BASH
# Get a specific tag
git fetch origin refs/tags/v1.0.0:refs/tags/v1.0.0
# Get all tags
git fetch --tags
# Delete Local Tags(Remotely Deleted)
git fetch --prune-tags
# Or
git fetch -p --prune-tags
6. オプションの詳細な説明
(1) 一般的な検索オプション
| オプション | 説明 | 利用例 |
|---|---|---|
--all |
すべてのリモートを取得 | すべてのリモートを更新 |
-p |
Clean up stale references | Remote branch deleted |
--tags |
Get All Tags | Sync Tags |
--prune-tags |
Clean up expired tags | Tags have been deleted |
--dry-run |
Simulate retrieval | Preview retrieved content |
--verbose |
Detailed Output | Debug |
▶ Example: Using the "Get" option
BASH
# Clean up expired remote branch references
git fetch -p
# Output:
# From https://github.com/user/repo
# x [deleted] (none) -> origin/old-feature
# Delete Expired Tags
git fetch --prune-tags
# Simulated Acquisition
git fetch --dry-run
# Detailed Output
git fetch --verbose
# Gain Insight(Shallow Cloning)
git fetch --depth=1
# Get a single branch
git fetch --single-branch
(2) 期限切れの参照を整理する
▶ サンプル:リモート参照のクリーンアップ
BASH
# View the branches that need to be cleaned up
git remote prune origin --dry-run
# Output:
# * origin/deleted-branch would be pruned
# Perform Cleanup
git remote prune origin
# Or usefetch -p
git fetch -p
# Output:
# From https://github.com/user/repo
# x [deleted] (none) -> origin/deleted-branch
7. フェッチのワークフロー
(1) セキュリティ更新プログラムのワークフロー
sequenceDiagram
participant Developer
participant Local Warehouse
participant Remote Branch
participant Remote Repository
Developer->>Remote Repository: git fetch origin
Remote Repository->>Remote Branch: Updateorigin/main
Developer->>Remote Branch: git log main..origin/main
Developer->>Remote Branch: git diff main origin/main
Developer->>Local Warehouse: git merge origin/main
(2) 実世界の適用シナリオ
▶ サンプル:フェッチワークフロー
BASH
# Scene1:Check for Updates Before Starting Work
git fetch origin
git log main..origin/main --oneline
# Output:
# d4e5f6g feat: New Features
# h7i8j9k fix: BugFix
# View Specific Changes
git diff main origin/main
# Decide whether to merge
git merge origin/main
# Scene2:There is unsubmitted work,Get it first, then decide
git fetch origin
git status
# Output:
# On branch main
# Your branch is behind 'origin/main' by 2 commits.
# View Updates
git log HEAD..origin/main
# Save the current work
git stash
# Merge Updates
git merge origin/main
# Return to Work
git stash pop
# Scene3:ForkWorkflow
git fetch upstream
git log main..upstream/main
git merge upstream/main
git push origin main
(3) 定期的な同期スクリプト
▶ サンプル:自動同期スクリプト
BASH
#!/bin/bash
# sync.sh - Regularly Synchronize Remote Updates
# Get all remote updates
git fetch --all
# Check the status of each branch
for branch in $(git branch --format='%(refname:short)'); do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [ -n "$upstream" ]; then
behind=$(git rev-list --count $branch..$upstream 2>/dev/null)
ahead=$(git rev-list --count $upstream..$branch 2>/dev/null)
if [ "$behind" -gt 0 ] || [ "$ahead" -gt 0 ]; then
echo "$branch: behind $behind, ahead $ahead"
fi
fi
done
# Ask if it's synced
read -p "Sync main branch? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
git checkout main
git merge origin/main
fi
❓ よくある質問
Q
fetch と pull、どちらを使うべきですか?A
fetchの使用をお勧めします。fetchは、マージするかどうかを決める前に変更内容を確認できるため、より安全です。pullは自動的にマージされるため、予期せぬ競合が発生する可能性があります。マージする前にfetchを行う習慣をつけることをお勧めします。Q
fetch はローカルコードを変更しますか?A いいえ。
fetch は、リモートブランチへの参照(origin/main など)の更新のみをダウンロードします。現在のブランチや作業ディレクトリを変更することはありません。ローカルのコードを変更するには、手動でマージまたはリベースを行う必要があります。Q Fetchがダウンロードした内容を確認するにはどうすればよいですか?
A
git log HEAD..origin/main を使用するとリモート上の新しいコミットを確認でき、git diff HEAD origin/main を使用すると差分を確認でき、git diff --stat HEAD origin/main を使用すると統計情報を確認できます。Q フェッチ後にマージするにはどうすればよいですか?
A
git merge origin/main を使用してリモートからの更新をマージするか、git rebase origin/main を使用してリベースによるマージを行ってください。履歴を線形に保つため、リベースの使用をお勧めします。Q 削除されたリモートブランチへの参照をどのようにクリーンアップすればよいですか?
A
git fetch -p または git remote prune origin を使用して、ローカルマシン上の期限切れのリモートブランチ参照をクリーンアップしてください。これはリモートリポジトリには影響せず、ローカルの参照のみをクリーンアップします。📖 まとめ
- 「Get」は、リモートソースから更新情報をダウンロードする操作ですが、それらを自動的にマージすることはないため、より安全で制御しやすくなります。
- 基本的な取得:
git fetchすべての更新プログラムをダウンロード;git fetch origin特定のリモートを取得 - 更新内容の確認:
logおよびdiffを使用して、リモートリポジトリの新しいコミットや変更点を確認します - 更新の統合:手動でマージまたはリベースを行うか、特定のコミットをチェリーピックする
- タグの取得:
--tagsですべてのタグを取得し、--prune-tagsで有効期限が切れたタグを削除します - フェッチのワークフロー:まずフェッチして内容を確認し、その後マージするかどうかを決める――その方が安全です。
📝 練習問題
-
基本演習:リモートリポジトリに新しいコミットを作成し、ローカルで
fetchを使用して更新内容を取得し、リモート上の新しいコミットと差分を確認してから、手動でマージしてください。 -
応用演習:フォークのワークフローをシミュレートします。
originとupstreamの 2 つのリモートを追加し、upstreamから更新を取得して、変更点を確認し、それらをローカルリポジトリに選択的にマージした後、originにプッシュします。 -
課題:すべてのリモートリポジトリを定期的に取得し、各ブランチとリモートリポジトリとの相違点を確認し、同期レポートを生成し、同期が必要なブランチを特定するスクリプトを作成してください。