追跡されたブランチの上流に変更が存在します。しかし、入力すると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/master
ref のみを参照します。
git status
最新とは、「現在のブランチが追跡しているブランチと同程度」という意味で、この場合は「 というローカル参照と同程度」という意味です。origin/master
これは、「 を最後に実行したときに取得されたアップストリーム ステータスと同程度」という意味に過ぎず、fetch
「アップストリームの最新のライブ ステータスと同程度」という意味ではありません。
なぜこのように動作するのでしょうか? このfetch
ステップは潜在的に遅くてコストのかかるネットワーク操作です。Git (および他の分散バージョン管理システム) は、不必要なネットワーク操作を回避するためのもので、多くの人が慣れている典型的なクライアント サーバー システムとはまったく異なるモデルです (ただし、以下のコメントで指摘されているように、ここで混乱を招く Git の「リモート トラッキング ブランチ」という概念は、すべての DVCS で共有されているわけではありません)。Git をオフラインで使用して、集中サーバーに接続しないことは完全に可能であり、 の出力はgit status
これを反映しています。
Git でのブランチの作成と切り替え (およびそれらのステータスの確認) は軽量であるべきであり、集中型システムに対して低速のネットワーク操作を実行するものではありません。Git の設計時およびそのgit status
出力では、ユーザーがこれを理解していることが前提でした (Git の機能が多すぎると、Git の仕組みをすでに知っている場合にのみ意味をなします)。DVCS に精通していない多数のユーザーが Git を採用しているため、この前提は必ずしも有効ではありません。