Git リポジトリがリモートと同期しているかどうかを確認する方法

GitGitBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、ローカルの Git リポジトリがリモートリポジトリと同期しているかどうかを確認する方法を学びます。ローカルブランチがリモートブランチと比べて最新であるか、遅れているか、進んでいるかを判断する実用的な方法を探ります。

この実験では、リモートリポジトリから変更を取得し、git status を使用して同期状態を評価する手順を案内します。また、git log を使用してローカルの HEAD とリモート追跡ブランチ (@{u}) を比較し、コミット履歴の違いを特定する方法も学びます。最後に、分岐したリポジトリの状態をシミュレートして調べ、Git における同期問題の特定と管理方法を包括的に理解します。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL git(("Git")) -.-> git/CollaborationandSharingGroup(["Collaboration and Sharing"]) git(("Git")) -.-> git/BasicOperationsGroup(["Basic Operations"]) git(("Git")) -.-> git/BranchManagementGroup(["Branch Management"]) git/BasicOperationsGroup -.-> git/add("Stage Files") git/BasicOperationsGroup -.-> git/status("Check Status") git/BasicOperationsGroup -.-> git/commit("Create Commit") git/BranchManagementGroup -.-> git/log("Show Commits") git/CollaborationandSharingGroup -.-> git/fetch("Download Updates") subgraph Lab Skills git/add -.-> lab-560100{{"Git リポジトリがリモートと同期しているかどうかを確認する方法"}} git/status -.-> lab-560100{{"Git リポジトリがリモートと同期しているかどうかを確認する方法"}} git/commit -.-> lab-560100{{"Git リポジトリがリモートと同期しているかどうかを確認する方法"}} git/log -.-> lab-560100{{"Git リポジトリがリモートと同期しているかどうかを確認する方法"}} git/fetch -.-> lab-560100{{"Git リポジトリがリモートと同期しているかどうかを確認する方法"}} end

リモートリポジトリからの変更取得と git status の確認

このステップでは、リモートリポジトリから変更を取得し、ローカルリポジトリの状態を確認する方法を学びます。

他の人と一緒にプロジェクトを進めているシチュエーションを想像してみてください。彼らがプロジェクトに変更を加え、中央の場所(リモートリポジトリ)に保存することがあります。あなたはそれらの変更を自分のプロジェクトのコピー(ローカルリポジトリ)に取り込む方法が必要です。ここで git fetch が役に立ちます。

まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、次のコマンドを入力します。

cd ~/project/my-time-machine

次に、リモートリポジトリをシミュレートしましょう。実際のシナリオでは、これは GitHub や GitLab のようなプラットフォーム上にあります。この実験では、ローカルディレクトリを「リモート」として使用します。

git remote add origin ../my-time-machine-remote

このコマンドは、現在のプロジェクトの外のディレクトリを指す origin という名前の「リモート」を追加します。

では、git fetch を使用して、このシミュレートされたリモートから変更を取得しましょう。

git fetch origin

新しい変更がない場合、出力はあまり表示されないかもしれませんが、このコマンドはリモートリポジトリに接続し、コミットやブランチなどの新しい情報をダウンロードしますが、現在のブランチにマージすることはありません。

変更を取得した後は、常にローカルリポジトリの状態を確認し、リモートから取り込んでいない変更があるかどうかを確認することをおすすめします。

git status

git status の出力は、ローカルブランチがリモートブランチと「最新」であるか、またはプルできる変更があるかを示します。たとえば、次のような出力が表示されることがあります。

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

または、リモートに変更があった場合:

On branch master
Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean

git fetch の後に git status の出力を理解することは非常に重要です。これは、ローカルブランチとリモートリポジトリ上の対応するブランチとの関係を示します。これにより、変更をプルする必要があるか、またはローカルコピーがすでに最新であるかを判断するのに役立ちます。

git log を使って HEAD と @{u} を比較する

このステップでは、git log コマンドを使って、ローカルブランチ (HEAD) とその上流ブランチ (@{u}) の状態を比較します。これは、変更を取得した後の差分を視覚化する強力な方法です。

まず、プロジェクトディレクトリにいることを確認しましょう。

cd ~/project/my-time-machine

Git において、HEAD は現在のブランチが指しているコミットを指します。これは現在の作業の先端を表します。@{u} (または @\{upstream\}) は、現在のローカルブランチが追跡している上流ブランチを指します。これは通常、取得元のリモートリポジトリ上の対応するブランチです。

ローカルブランチ (HEAD) に含まれているが、上流ブランチ (@{u}) に含まれていないコミットを表示するには、次のコマンドを使用できます。

git log HEAD..@{u}

このコマンドは、@{u} から到達可能だが HEAD からは到達不可能なコミットを表示します。言い換えると、リモートブランチにはあるが、まだローカルブランチにはないコミットを表示します。そのようなコミットがない場合(つまり、ローカルブランチが最新または進んでいる場合)、このコマンドは何も出力しません。

次に、上流ブランチ (@{u}) に含まれているが、ローカルブランチ (HEAD) に含まれていないコミットを表示しましょう。これは、ローカルブランチにあるが、まだリモートにプッシュされていないコミットを示します。

git log @{u}..HEAD

このコマンドは、HEAD から到達可能だが @{u} からは到達不可能なコミットを表示します。そのようなコミットがない場合(つまり、ローカルブランチが最新または遅れている場合)、このコマンドは何も出力しません。

.. 表記を使って git log を使用することで、リポジトリ内の 2 つの異なるポイント(たとえば、ローカルブランチとその上流ブランチ)の履歴を簡単に比較できます。これは、リモートに対するリポジトリの状態を理解し、変更をプルまたはプッシュする準備をするために非常に役立ちます。

分岐したリポジトリのテスト

このステップでは、ローカルリポジトリとリモートリポジトリの両方に、相手にない新しいコミットがあるシナリオをシミュレートします。これは「分岐(diverged)」状態と呼ばれます。

まず、プロジェクトディレクトリにいることを確認しましょう。

cd ~/project/my-time-machine

ローカルリポジトリに新しいコミットを作成しましょう。

echo "Adding a local change" > local_change.txt
git add local_change.txt
git commit -m "Add a local change"

次に、「リモート」リポジトリに直接コミットが行われるシナリオをシミュレートします。リモートディレクトリに移動してコミットを行い、その後元のディレクトリに戻ります。

cd ../my-time-machine-remote
echo "Adding a remote change" > remote_change.txt
git add remote_change.txt
git commit -m "Add a remote change"
cd ../my-time-machine

これで、ローカルリポジトリにコミットを作成し、シミュレートしたリモートリポジトリに別のコミットを作成しました。リポジトリは現在分岐しています。

再度 git fetch を使用して、リモートリポジトリの情報を更新しましょう。

git fetch origin

次に、ローカルリポジトリの状態を確認します。

git status

ブランチが分岐していることを示す出力が表示されるはずです。次のような内容です。

On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean

このステータスメッセージは、ローカルブランチ (master) とリモート追跡ブランチ (origin/master) が、前回同期して以来それぞれ新しいコミットで進んでいることを示しています。また、リモートの変更をマージするために git pull を使用することを提案しています。

分岐状態を理解することは重要です。なぜなら、これは他の人と共同作業する際によく見られるシナリオだからです。これは、自分の変更をプッシュする前に、リモートの変更をローカルブランチに統合する必要があることを意味します。

まとめ

この実験(Lab)では、ローカルの Git リポジトリがリモートリポジトリと同期しているかどうかを確認する方法を学びました。まず、リモートリポジトリをシミュレートし、git remote add を使用してローカルプロジェクトに追加しました。リモートから変更を取得してマージせずに済ませる重要なステップは、git fetch origin を使用して行いました。取得後、git status を使用して、ローカルブランチとリモートブランチの同期状態を判断し、ブランチが最新であるか、遅れているかを示す出力を確認しました。

さらに、git log を使用してローカルの HEAD とリモート追跡ブランチを比較する方法を探索し、分岐したリポジトリのシナリオを調べることで、リポジトリの同期について包括的な理解を深めます。