16

だからここに状況があります:

$ git status
#ブランチマスター上
#ブランチは[x]commitsによって'origin/master'より進んでいます。

SOについてはすでにいくつかの質問がありますが、私が持っているシナリオのタイプに具体的に対処しているものはないようです。質問の1つに対するこの回答は最も近いものですが、詳細には触れていません。

私はそれを逐語的に引用します:

「gitpullremotebranch」を実行した後にこのメッセージが表示された場合は、「gitfetch」でフォローアップしてみてください。

Fetchは、リモートブランチのローカル表現を更新するようです。これは、「gitpullremotebranch」を実行するときに必ずしも発生するわけではありません。

そのヒントは確かに機能します。しかし、「必ずしも起こるとは限らないのですか?」なぜだめですか?私はこれを理解する必要があります。プルが行わないのは何ですか?

私はその質問を引き継ぎたくないので、ここに私のシナリオの詳細があります:

関係する3台のコンピューター。私が開発しているMac、gitリポジトリ(つまりorigin / master)が存在するホームサーバー、およびそのサーバーからプルするWebfactionアカウント。

私はコミットをgit push origin master行い、Macでのみ行います。通常のワークフローの一部としてWebfactionで実行される唯一のコマンドは、git pull origin master(Fabricデプロイメントスクリプトの一部として)です。そこでコードを変更しません。私は一人の開発者なので、他の誰もしません。

時々、私はWebfactionにログインして、を含むものをチェックしgit statusます。必然的に、私は常に「あなたのブランチは先にあります...」というメッセージを受け取ります。実行git fetchするとメッセージが消えます。

この問題を処理するためにFabricスクリプトに追加git fetchしようとしていますが、特にオリジン/マスターのプルオンリークローンで、なぜそれを実行する必要があるのか​​を知りたいです。毎日基本的な機能を使っていますが、Gitに精通していないので、初心者向けの説明をいただければ幸いです。

要求に応じて、関連するビットを更新configします。

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*
    url = git@[server_address]:[path/to/repo.git]
[branch "master"]
    remote = origin
    merge = refs/heads/master
4

5 に答える 5

11

さて、最初から、あなたはすべてを正しくやっています。以前に追加したコメントはかなり良い説明だと思います。

簡単に言うと、「gitpull」は「gitfetch」に続いて「gitmerge」を実行します

そう思います。git fetchしたがって、ストレートアップの後にaを呼び出す必要はありませんがgit pull、ほぼ保証できます。これは、masterブランチ以外のすべてで完全に機能します。

リンクされた投稿の1つで、次の行を削除すると言われています。

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/* <--- Remove this

そして、それはこの問題を修正するはずです-しかし、私はこれがなぜ機能するのかについての説明を提供することはできません。調査するのは非常に難しいですが、を呼び出すfetchと、gitconfigが実際に何を取得するかを指定していると思います。あなたが走っているとき、それが同期されpullていると思うかどうかはわかりません。master

マスター以外の別のブランチからこれを実行した場合、この問題は発生しないことを保証できます。うまくいけば、gitの達人の1人がfetchconfigの行を詳細に説明できます。

さらに、代わりに次のコマンドを実行して、リモートリポジトリのHEADを設定し、ローカルリポジトリと同期していることを確認することをお勧めします。git push -u origin master


別の興味深い質問があります:

git-fetchを理解するのに苦労している


さて、これをワークフローの1つでテストしたところ、次のことがわかりました。

git pull origin masterリモートサーバーでを実行する.git/と、HEADがどこにあるかを参照するファイルがディレクトリにあります。注意すべき2つのファイル:

ORIG_HEAD

FETCH_HEAD

FETCH_HEADが正しいことに気付くでしょうが、ORIG_HEADは古いコミットを示しているため、を取得している理由ですAhead by x。を実行するgit fetchと、実際にで参照が修正されORIG_HEAD、すべてが正常に戻ります。fetchこの動作を修正するために、構成の行を変更する方法を調べています。

于 2011-09-09T18:29:03.747 に答える
8

git pull originの代わりにを実行すると、メッセージgit pull origin masterに問題は発生しません。Your branch is ahead of 'origin/master' by ... commits.

于 2013-09-15T06:33:13.560 に答える
2

注:この質問は最近Gitからリンクされました:リモートとローカル/サーバーを同じにすることができません。元の質問の日付は2011年9月であることに注意してください。当時の最新バージョンのGitは1.7.10でした。Gitはバージョン2.26.2になりました。

Git 1.8.4より前のバージョンのGitでは、実行するとローカル名の更新がgit pull origin master 抑制されorigin/masterます。(実行も同様git fetch origin masterです。)

追加の引数なしでを実行git fetchすると、Gitのすべてのバージョン(1.8.4の前後)で、を含むすべてのリモート追跡名が更新されorigin/masterます。これが、この謎の背後にある本当の説明です。

于 2020-05-11T19:17:16.950 に答える
1

この質問を参照してください:「gitpull」と「gitfetch」の違いは何ですか?

AFAIK git pullは、元のブランチを調べて、変更をプルダウンします。ただし、ブランチのローカルインデックスは最新ではありません。git fetchはブランチのインデックスを更新するので、そこに何があるべきかを理解します。(基本的に、リンクした回答で参照されたもの)

私は常にgitpullの前にgitfetchを実行します。本当に私はリモートブランチで何かをするつもりならいつでもgitfetchをします。

また、上記の質問にリンクされているのは、git fetch、pull、mergeのこの非常に優れた説明です。 http://longair.net/blog/2009/04/16/git-fetch-and-merge/

于 2011-09-09T17:47:52.393 に答える
0

私の場合、Originに2つのブランチがあり、git pullをプルするたびに、xだけorigin/masterよりも進んでいることが示されました。ローカルリポジトリブランチのリセットに示されているように、オリジン/マスターにハードリセットした後でも、リモートリポジトリHEADのようになります

解決策は、単に実行git fetchしたときに発生し、開発ブランチが本番サーバーに移動しました。

于 2015-09-15T13:28:35.767 に答える