Git: Gitのクローン作成とセキュリティ更新に関する詳細ガイド

「fetch」とは、リモートリポジトリから更新内容をダウンロードするものの、自動的にマージは行わない操作のことです。「pull」と比較して、「fetch」はより安全で制御しやすく、更新内容をまず確認してから、マージするかどうかを判断することができます。「fetch」の使い方を理解することは、チームでの共同作業において極めて重要です。

1. 基本概念の理解

(1) 買収とは何か?

「Fetch」とは、リモートリポジトリから更新情報をダウンロードするものの、現在のブランチには変更を加えない操作のことです:

100%
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) セキュリティ更新プログラムのワークフロー

100%
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 fetchpull、どちらを使うべきですか?
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 を使用して、ローカルマシン上の期限切れのリモートブランチ参照をクリーンアップしてください。これはリモートリポジトリには影響せず、ローカルの参照のみをクリーンアップします。

📖 まとめ


📝 練習問題

  1. 基本演習:リモートリポジトリに新しいコミットを作成し、ローカルで fetch を使用して更新内容を取得し、リモート上の新しいコミットと差分を確認してから、手動でマージしてください。

  2. 応用演習:フォークのワークフローをシミュレートします。originupstream の 2 つのリモートを追加し、upstream から更新を取得して、変更点を確認し、それらをローカルリポジトリに選択的にマージした後、origin にプッシュします。

  3. 課題:すべてのリモートリポジトリを定期的に取得し、各ブランチとリモートリポジトリとの相違点を確認し、同期レポートを生成し、同期が必要なブランチを特定するスクリプトを作成してください。

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%