上流に変更があるのに、git status でブランチが最新であると表示されるのはなぜですか? 質問する

上流に変更があるのに、git status でブランチが最新であると表示されるのはなぜですか? 質問する

追跡されたブランチの上流に変更が存在します。しかし、入力するとgit statusローカル ブランチが最新であると表示されます。これは新しい動作ですか、構成設定を変更したのですか、それとも何か問題があるのですか?

ubuntu@host:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


ubuntu@host:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

ベストアンサー1

ステータスが示しているのは、origin/master ローカル リポジトリ 内のローカル参照である という参照の背後にいるということです。この場合、その参照は というリモートのブランチを追跡していますoriginが、ステータスはリモートのブランチについて何も示していません。ステータスが示しているのは ref であり、これはローカル ファイル システムに保存されているコミット ID にすぎません (この場合、通常は.git/refs/remotes/origin/masterローカル リポジトリ内の というファイル内にあります)。

git pullは 2 つの操作を実行します。まず、git fetchリモート リポジトリのコミットを最新の状態にするために を実行し (これにより、origin/masterローカル リポジトリの ref が更新されます)、次に を実行してgit mergeそれらのコミットを現在のブランチにマージします。

fetchステップを(単独で、または 経由で)実行するまで、git pullローカル リポジトリはアップストリームに追加のコミットがあることを知ることができず、git statusローカルorigin/masterref のみを参照します。

git status最新とは、「現在のブランチが追跡しているブランチと同程度」という意味で、この場合は「 というローカル参照と同程度」という意味です。origin/masterこれは、「 を最後に実行したときに取得されたアップストリーム ステータスと同程度」という意味に過ぎず、fetch「アップストリームの最新のライブ ステータスと同程度」という意味ではありません。

なぜこのように動作するのでしょうか? このfetchステップは潜在的に遅くてコストのかかるネットワーク操作です。Git (および他の分散バージョン管理システム) は、不必要なネットワーク操作を回避するためのもので、多くの人が慣れている典型的なクライアント サーバー システムとはまったく異なるモデルです (ただし、以下のコメントで指摘されているように、ここで混乱を招く Git の「リモート トラッキング ブランチ」という概念は、すべての DVCS で共有されているわけではありません)。Git をオフラインで使用して、集中サーバーに接続しないことは完全に可能であり、 の出力はgit statusこれを反映しています。

Git でのブランチの作成と切り替え (およびそれらのステータスの確認) は軽量であるべきであり、集中型システムに対して低速のネットワーク操作を実行するものではありません。Git の設計時およびそのgit status出力では、ユーザーがこれを理解していることが前提でした (Git の機能が多すぎると、Git の仕組みをすでに知っている場合にのみ意味をなします)。DVCS に精通していない多数のユーザーが Git を採用しているため、この前提は必ずしも有効ではありません。

おすすめ記事