1. ホーム
  2. ギット

[解決済み】上流に変更があるのに、git status がブランチを最新と表示するのはなぜですか?

2022-03-30 08:34:32

質問

上流のtrackedブランチに変更があるにもかかわらず 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

解決方法は?

ステータスが教えてくれるのは、あなたが「ref」という名前の後ろにいることです。 origin/master これは、あなたのローカルリポジトリのローカルリファレンスである . この場合、この参照は、あるリモートのブランチを追跡することになります。 origin しかし、このステータスはリモートのブランチについて何も教えてくれません。しかし、ステータスはリモートのブランチについて何も教えてくれません。これは、ローカルのファイルシステムに保存されているコミット ID を教えてくれるものです (この場合、通常は .git/refs/remotes/origin/master を使用します)。

git pull は2つの操作を行います。 git fetch を更新し、リモートリポジトリのコミットを最新にします)。 origin/master を実行した後、ローカルレポの git merge を実行して、それらのコミットを現在のブランチにマージします。

を実行するまでは fetch ステップ(単体または git pull ) 上流に追加コミットがあることをローカルリポジトリが知る術はありません。 git status はローカルの origin/master を参照してください。

いつ git status というのは、現在のブランチが追跡しているブランチが最新であることを意味します。 origin/master となります。これは、前回 fetch これは、「上流の最新のライブステータスを反映させる」こととは異なります。

なぜこのような仕組みになっているのでしょうか?それは fetch のステップは、潜在的に遅くて高価なネットワーク操作です。Gitの設計は(そして他の 分散型 バージョン管理システム しかし、以下のコメントで指摘されているように、ここで混乱を引き起こしているGitのquot;リモート追跡ブランチ"のコンセプトは、すべてのDVCSで共有されているわけではありません)。中央サーバーに接続しないオフラインでGitを使うことは完全に可能であり、その場合の出力は git status が反映されます。

Gitにおけるブランチの作成と切り替え(およびその状態の確認)は軽量であるべきであり、中央集権的なシステムに対して遅いネットワーク操作を実行するようなものではありません。Gitを設計するときの前提、そして git status の出力は、ユーザーがこのことを理解していることを前提としていました(Gitの機能の多くは、すでにGitの仕組みを知っている場合にのみ意味をなすのです)。DVCSに馴染みのない多くのユーザーがGitを採用することで、この仮定は必ずしも有効ではありません。