はじめに
この実験では、ローカルの Git ブランチが対応するリモートブランチよりも遅れているかどうかを判断する方法を学びます。これを達成するための必須の手順を説明します。まずは git fetch を使用してリモートリポジトリから最新の変更を取得します。
取得後、git status を使用してブランチがリモートよりも遅れているかどうかをすばやく確認します。最後に、git log HEAD..@{u} を使用して、リモートブランチに存在するがローカルブランチには存在しない特定のコミットを表示する方法を学び、差分を詳細に理解します。
git fetch でリモートを取得する
このステップでは、リモートの Git リポジトリから変更を取得する方法を学びます。他の人と共同作業をしており、彼らがプロジェクトに変更を加えたと想像してみてください。git fetch は、それらの変更をローカルマシンにダウンロードするが、現在の作業にマージしないために使用するコマンドです。
まず、リモートリポジトリを持っている状況をシミュレートしましょう。デモンストレーションのために、ローカルで簡単なリポジトリを作成します。
cd ~/project
mkdir remote-repo
cd remote-repo
git init --bare
これにより、「ベア」リポジトリが作成されます。これは通常、中央のリモートリポジトリとして使用されます。次に、my-time-machine リポジトリに戻り、これをリモートとして追加しましょう。
cd ~/project/my-time-machine
git remote add origin ../remote-repo
origin という名前のリモートを、シミュレートしたリモートリポジトリに向けて追加しました。次に、リモートリポジトリに変更を加え、それを取得しましょう。
cd ~/project/remote-repo
echo "This is a remote change." > remote_file.txt
git add remote_file.txt
git commit -m "Add remote file"
次に、my-time-machine リポジトリに戻り、リモートから変更を取得しましょう。
cd ~/project/my-time-machine
git fetch origin
Git がリモートリポジトリから変更をダウンロードしたことを示す出力が表示されるはずです。次のような内容です。
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (2/2), 258 bytes | 258.00 KiB | elapsed 0.00s.
From ../remote-repo
* [new branch] master -> origin/master
git fetch コマンドは、リモートリポジトリからコミット、ファイル、参照をローカルリポジトリにダウンロードします。ただし、これらの変更を現在の作業ブランチに自動的にマージすることはありません。これにより、変更を統合する前に検査することができます。
git fetch をニュースフィードから最新の更新を取得するようなものと考えてください。見出しや要約が表示されますが、まだ記事全体を読んでいません。後でどの記事(変更)を読む(マージする)かを決めることができます。
git status を使って遅れ状態を確認する
前のステップでは、リモートリポジトリから変更を取得しました。次に、git status を使って、ローカルリポジトリとリモートリポジトリを比較しましょう。
~/project/my-time-machine ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
次に、git status コマンドを実行します。
git status
以下のような出力が表示されるはずです。
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
この出力からいくつかの重要な情報がわかります。
- "On branch master": 現在
masterブランチにいます。 - "Your branch is behind 'origin/master' by 1 commit": これが重要なメッセージです!ローカルの
masterブランチがoriginリモートのmasterブランチより 1 コミット分遅れていることを示しています。つまり、リモートにはあるがローカルにはまだ存在しないコミットがあるということです。 - "(use "git pull" to update your local branch)": Git はローカルブランチを最新状態にする方法をヒントとして教えてくれます。
git status コマンドは、リポジトリの状態を確認するための重要な手段です。現在どのブランチにいるか、未コミットの変更があるか、現在のブランチが上流ブランチ(この場合は origin/master)とどのように比較されるかを教えてくれます。
git status の出力を理解することは、Git を効果的に使用するために不可欠です。リモートから変更を取得する必要があるか、コミットする変更があるか、作業ディレクトリがクリーンかどうかを把握するのに役立ちます。
遅れているコミットを確認するために git log HEAD..@{u} を実行する
前のステップで、git status を使ってローカルブランチがリモートブランチより遅れていることがわかりました。では、具体的にどのコミット分遅れているのかを確認するにはどうすればいいでしょうか?
git log コマンドに特殊な構文を使うことで、リモートブランチにはあるがローカルブランチにはないコミットのみを表示できます。構文 HEAD..@{u} は、現在のブランチ (HEAD) とその上流ブランチ (@{u}、この場合は origin/master) を比較します。
~/project/my-time-machine ディレクトリにいることを確認してください。
cd ~/project/my-time-machine
次に、以下のコマンドを実行します。
git log HEAD..@{u}
ステップ 1 でリモートリポジトリで行ったコミットのログエントリが表示されるはずです。
commit <commit-hash> (origin/master)
Author: Your Name <your.email@example.com>
Date: <Date and Time>
Add remote file
このコマンドは、リモートから変更を取得したときに具体的にどのような変更が加わるかを確認するのに非常に便利です。リモート追跡ブランチ (origin/master) にはあるが、まだローカルブランチ (master) にはないコミット履歴を表示します。
遅れているコミットを確認する方法を理解することは、共同作業者の作業を最新の状態に保ち、マージを計画するために重要です。
ログビューを終了するには、q を押してください。
まとめ
この実験では、ローカルの Git ブランチがリモートブランチより遅れているかどうかを確認する方法を学びました。まず、リモートリポジトリをシミュレートし、git remote add を使ってローカルプロジェクトに追加しました。次に、git fetch を使ってリモートから変更をダウンロードし、マージせずにローカルリポジトリを最新のリモート情報で更新する方法を実践しました。
fetch の後、通常は git status を使って現在のブランチがリモート追跡ブランチより遅れているかどうかを確認し、git log HEAD..@{u} を使ってリモートにはあるがまだローカルブランチにはない特定のコミットを表示します。これらの手順をまとめることで、ローカルの作業とリモートリポジトリの差分を明確に把握することができます。



