はじめに
この実験では、ローカルの Git ブランチにまだリモートリポジトリにプッシュされていないコミットがあるかどうかを確認する方法を学びます。これらの未プッシュのコミットを特定するためのさまざまな方法を探ります。まずは、git status コマンドを使って、ブランチがリモートより進んでいるかどうかを確認します。
次に、特定の引数を指定して git log コマンドを使用し、ローカルに存在するがリモート追跡ブランチには存在しないコミットをリストする方法を学びます。最後に、ローカルブランチとリモートリポジトリを比較することで、この情報を検証する方法について説明します。この実験の終わりまでに、ローカルの変更をプッシュする必要があるかどうかを簡単に判断するスキルを身につけることができます。
git status を使用して進んでいるコミットを確認する
このステップでは、git status コマンドを使って、ローカルブランチにリモートブランチより進んでいるコミットがあるかどうかを確認する方法を学びます。これは、ローカルで変更を加えて、まだリモートリポジトリにプッシュしていないときによく見られるシナリオです。
まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、my-time-machine ディレクトリに移動します。
cd ~/project/my-time-machine
次に、新しいファイルを作成し、それにいくつかの内容を追加しましょう。このファイルを future_plans.txt と呼びます。
echo "Plan for world domination." > future_plans.txt
次に、この新しいファイルをコミットの準備としてステージングエリアに追加する必要があります。
git add future_plans.txt
では、変更内容を説明するメッセージ付きでコミットを作成しましょう。
git commit -m "Add future plans"
新しいコミットが作成されたことを示す、次のような出力が表示されるはずです。
[master abcdefg] Add future plans
1 file changed, 1 insertion(+)
create mode 100644 future_plans.txt
これで、ローカルの master ブランチに新しいコミットが作成されました。ただし、このコミットはローカルにのみ存在し、まだリモートリポジトリに送信されていません。
git status を使って、リポジトリの現在の状態を確認しましょう。
git status
出力には、ローカルブランチがリモートブランチより 1 つのコミット分進んでいることが表示されるはずです(この基本的な例ではリモートブランチを設定していませんが、Git はそのヒントを提供します)。
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: future_plans.txt
nothing to commit, working tree clean
ここで重要な行は Your branch is ahead of 'origin/master' by 1 commit. です。これは、ローカルの master ブランチに、origin/master ブランチ(Git が期待するリモートブランチのデフォルト名)に存在しない 1 つのコミットがあることを示しています。
これは非常に有用な情報です。まだ他の人と共有されていないローカルの変更があることを知らせてくれます。実際のリモートリポジトリがあるシナリオでは、これは git push で変更を送信する必要があることを示します。
git log --oneline @{u}..HEAD を実行する
前のステップでは、git status がローカルブランチがリモートブランチより進んでいるかどうかを教えてくれる方法を見ました。今度は、特別な構文を使った git log コマンドを使って、具体的にどのコミットが進んでいるのかを確認しましょう。
まだ ~/project/my-time-machine ディレクトリにいることを確認してください。
使用するコマンドは git log --oneline @{u}..HEAD です。このコマンドを分解してみましょう。
git log:これはコミット履歴を表示するコマンドです。--oneline:このオプションは、各コミットを 1 行で表示し、出力を簡潔で読みやすくします。@{u}:これは、上流ブランチ(upstream branch)を参照する特別な構文です。この場合、明示的に上流ブランチを設定していないので、Git はデフォルトでorigin/masterを使用します(originがリモートの名前で、masterがブランチ名であると仮定します)。..HEAD:これは範囲指定の表記です。HEADは現在のブランチ(ここではローカルのmaster)の先頭を指します。@{u}..HEADの範囲は、「HEADから到達可能で、@{u}からは到達不可能なコミットを表示してくれ」という意味です。簡単に言えば、ローカルブランチにあるが、上流のリモートブランチにはないコミットを表示します。
では、コマンドを実行しましょう。
git log --oneline @{u}..HEAD
次のような出力が表示されるはずです。
abcdefg (HEAD -> master) Add future plans
この出力は、前のステップで作成したコミット(Add future plans)を示しています。一意の識別子(abcdefg)はあなたのターミナルでは異なる可能性がありますが、コミットメッセージは一致するはずです。
このコマンドは、リモートリポジトリにプッシュしようとしている具体的なコミットを確認するのに非常に便利です。まだ共有されていないローカルで行った変更の明確なリストを提供してくれます。
この出力を前のステップの git status の出力と比較すると、git status は何個のコミットが進んでいるかを教えてくれるのに対し、git log @{u}..HEAD は具体的にどのコミットが進んでいるかを教えてくれることがわかります。どちらのコマンドも、ローカルリポジトリとそのリモートリポジトリの状態に関する貴重な情報を提供します。
リモート比較で確認する
実際のシナリオでは、通常、ローカルリポジトリが接続されているリモートリポジトリ(GitHub、GitLab、または Bitbucket など)があります。この実験環境では、プッシュ先の実際のリモートリポジトリがありません。しかし、学んだコマンドを使って、ローカルブランチとリモートブランチを比較する概念をシミュレートすることができます。
すでに git status と git log --oneline @{u}..HEAD を使って、ローカルブランチにあるが、シミュレートされた上流ブランチ(origin/master)にはないコミットを確認しました。
再度 git status の出力を見てみましょう。
git status
ブランチが進んでいることを示す行がまだ表示されるはずです。
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
... (rest of the output)
そして、git log --oneline @{u}..HEAD の出力は次のとおりです。
git log --oneline @{u}..HEAD
これは、私たちが行った 1 つのコミットを表示するはずです。
abcdefg (HEAD -> master) Add future plans
これら 2 つのコマンドは連携して、ローカルブランチと設定された上流ブランチの違いを明確に示します。git status は概要を提供し、git log @{u}..HEAD は特定のコミットの詳細を提供します。
実際のプロジェクトでは、この出力を見た後、通常、git push を実行して、ローカルのコミットをリモートリポジトリに送信し、他の人が利用できるようにし、リモートブランチを更新します。
この実験ではプッシュ先のリモートがないため、git status と git log を使ってリモートブランチより進んでいるコミットを特定する方法を理解するという目標を達成しました。
このスキルは、他の人とのコラボレーションや、ローカルリポジトリとリモートリポジトリを同期させるために基本的です。定期的に状態とログを確認することで、保留中の変更を把握し、準備ができたらプッシュすることができます。
まとめ
この実験では、Git ブランチに未プッシュのコミットがあるかどうかを確認する方法を学びました。ローカルでコミットを行った後、git status コマンドを使用しました。git status の出力は、ローカルブランチがリモートブランチより「進んでいる」かどうか、および何個のコミット分進んでいるかを明確に示し、未プッシュの変更があるかどうかを直接確認する方法を提供します。
次に、git log --oneline @{u}..HEAD を使用して、ローカルブランチにあるがリモート追跡ブランチにはない特定のコミットの詳細な情報を取得する方法を調べました。このコマンドは、未プッシュのコミットのハッシュとメッセージをリストアップし、保留中の変更を正確に特定する方法を提供します。最後に、ローカルブランチとリモートブランチを比較することでこれを確認する概念について議論し、未プッシュのコミットの存在を確認する方法の理解を深めました。



