Git リポジトリに未プッシュのコミットがあるかどうかを確認する方法

GitGitBeginner
今すぐ練習

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

はじめに

この実験では、ローカルの Git リポジトリにリモートリポジトリにまだプッシュされていないコミットがあるかどうかを確認する方法を学びます。これらの「未プッシュ」コミットを特定するためのさまざまな方法を探ります。まずは、基本的なgit statusコマンドを使って、ローカルブランチがリモートブランチよりも進んでいるかどうかを確認します。

次に、git log @{u}..HEADを使って、ローカルに存在するが上流ブランチには存在しないコミットを具体的にリストアップする方法を学びます。最後に、すべてのブランチで状態を確認し、リポジトリの状態を包括的に理解する方法について簡単に触れます。この実験の終わりまでに、リモートにプッシュする前にローカルの Git 変更を効果的に管理および追跡するための必須コマンドを習得することができます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL 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") subgraph Lab Skills git/add -.-> lab-560092{{"Git リポジトリに未プッシュのコミットがあるかどうかを確認する方法"}} git/status -.-> lab-560092{{"Git リポジトリに未プッシュのコミットがあるかどうかを確認する方法"}} git/commit -.-> lab-560092{{"Git リポジトリに未プッシュのコミットがあるかどうかを確認する方法"}} git/log -.-> lab-560092{{"Git リポジトリに未プッシュのコミットがあるかどうかを確認する方法"}} end

未プッシュのコミットを確認するために git status を使用する

このステップでは、git status を使用して、ローカルブランチがリモートブランチよりも「進んでいる」かどうかを確認する方法を学びます。これは、ローカルでコミットを行ったが、まだリモートリポジトリにプッシュしていない場合によく見られるシナリオです。

まず、プロジェクトディレクトリにいることを確認しましょう。ターミナルを開き、my-time-machine ディレクトリに移動します。

cd ~/project/my-time-machine

次に、新しいファイルを作成し、それにいくつかの内容を追加しましょう。最終的にコミットする変更をシミュレートします。

echo "This is a new line for the future." >> message.txt

このコマンドは、「This is a new line for the future.」というテキストを、先ほど作成した message.txt ファイルに追加します。

次に、git add を使用してこの変更をステージングしましょう。

git add message.txt

それでは、変更内容を説明するメッセージ付きで新しいコミットを作成しましょう。

git commit -m "Add another message to the future"

新しいコミットが作成されたことを示す、次のような出力が表示されるはずです。

[master a1b2c3d] Add another message to the future
 1 file changed, 1 insertion(+)

これでローカルに新しいコミットができました。再度 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)

nothing to commit, working tree clean

「Your branch is ahead of 'origin/master' by 1 commit.」という行は、ローカルの master ブランチに、origin/master ブランチ(リモートのブランチのバージョンを表す)に存在しないコミットが 1 つあることを示しています。これは、プロジェクトに取り組んでいて、他の人と共有する前にローカルで変更を行っているときによく見られる状況です。

git status を理解することは非常に重要です。なぜなら、リポジトリの現在の状態を明確に把握することができるからです。どのファイルが変更されたか、どの変更がステージングされているか、およびローカルブランチがリモートブランチと同期しているかどうかを教えてくれます。これにより、作業を追跡し、変更をリモートリポジトリにプッシュする準備をすることができます。

git log @{u}..HEAD を使用する

前のステップで、git status を使ってローカルブランチがリモートブランチよりも進んでいることがわかりました。では、どのコミットが進んでいるのかを確認するにはどうすればいいでしょうか?このような場合に便利なのが git log @{u}..HEAD コマンドです。

@{u}(または @{upstream})という構文は、現在のブランチが追跡している上流ブランチを指します。今回のケースでは、明示的に上流ブランチを設定していないため、Git はデフォルトで origin/master を使用します(origin がリモートの名前で、master がブランチ名であると仮定)。HEAD は、現在のローカルブランチの先頭を指します。

つまり、@{u}..HEAD は「現在のブランチ(HEAD)にあるが、上流ブランチ(@{u})にはないコミットを表示してくれ」という意味です。

my-time-machine ディレクトリで試してみましょう。

cd ~/project/my-time-machine
git log @{u}..HEAD

次のような出力が表示されるはずです。

commit a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6q7r8s9 (HEAD -> master)
Author: Jane Doe <[email protected]>
Date:   Mon Aug 7 10:00:00 2023 +0000

    Add another message to the future

この出力は、前のステップで作成したコミットを示しています。これにより、この特定のコミットがリモートブランチよりも「進んでいる」コミットであることが確認できます。

git log @{u}..HEAD を使用することで、リモートリポジトリにプッシュしようとしている変更内容を正確に確認することができます。作業内容をレビューし、意図したコミットのみをプッシュすることを保証するのに役立ちます。

ログ表示を終了するには、q を押すことを忘れないでください。

すべてのブランチで確認する

前のステップでは、git status を使ってローカルブランチが進んでいることを確認し、git log @{u}..HEAD を使って具体的にどのコミットが進んでいるかを確認しました。今度は、git log --all --decorate --oneline --graph を使って、すべてのブランチのコミット履歴を可視化しましょう。これにより、ローカルブランチとリモートブランチの関係を理解するのに役立ちます。

まだ ~/project/my-time-machine ディレクトリにいることを確認してください。

cd ~/project/my-time-machine

次のコマンドを実行します。

git log --all --decorate --oneline --graph

オプションを分解して説明しましょう。

  • --all: すべてのブランチの履歴を表示します。
  • --decorate: コミットが指すブランチ名とタグ名を表示します。
  • --oneline: 各コミットを 1 行で表示します。
  • --graph: 出力の左側にコミット履歴のテキストベースのグラフィカル表現を描画します。

次のような出力が表示されるはずです。

* a1b2c3d (HEAD -> master) Add another message to the future
* e4f5g6h (origin/master) Send a message to the future

この出力について説明します。

  • 一番上の行は、最新のコミット (a1b2c3d) で、メッセージは「Add another message to the future」です。(HEAD -> master) は、現在の HEAD(現在作業している場所)とローカルの master ブランチがこのコミットを指していることを示しています。
  • 下の行は、前のコミット (e4f5g6h) で、メッセージは「Send a message to the future」です。(origin/master) は、origin/master ブランチ(リモート追跡ブランチ)がこのコミットを指していることを示しています。

左側のグラフ(* と線)は、ローカルの master ブランチが origin/master ブランチより 1 つのコミット分進んでいることを視覚的に示しています。これは、先ほど git status で確認したことを裏付けています。

このコマンドは、特に複数のブランチがある場合に、リポジトリの履歴を可視化するのに非常に便利です。ブランチがどのように分岐し、マージされるか、そしてローカルブランチがリモートブランチに対してどのような位置にあるかを理解するのに役立ちます。

ログ表示を終了するには、q を押してください。

まとめ

この実験では、Git リポジトリに未プッシュのコミットがあるかどうかを確認する方法を学びました。まず、git status を使ってローカルブランチがリモートブランチより「進んでいる」かどうかを確認しました。この過程で、プロジェクトディレクトリに移動し、新しいファイルを作成してステージングし、変更をコミットしました。コミット後に再度 git status を実行すると、ローカルブランチがリモートブランチより 1 つのコミット分進んでいることが明確に表示され、未プッシュの変更があることがわかりました。

この実験では、未プッシュのコミットを特定する際の git status の実用的な使い方を示し、ローカルリポジトリとリモートリポジトリの同期状態を理解する上でのその重要性を強調しました。