設定により、 リモートから、しかしそのような参照は取得されませんでした。質問する

設定により、 リモートから、しかしそのような参照は取得されませんでした。質問する

pull で次のエラーが発生します:

設定では、リモートからの参照「refs/heads/feature/Sprint4/ABC-123-Branch」とマージするように指定されていますが、そのような参照は取得されませんでした。

このエラーは他のブランチでは発生しません。
このブランチの特別な点は、別のブランチの以前のコミットから作成されていることです。

私の設定ファイルは次のようになります。

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[remote "origin"]
    url = <url here>
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "new-develop"]
    remote = origin
    merge = refs/heads/new-develop
[branch "feature/Sprint4/ABC-123-Branch"]
    remote = origin
    merge = refs/heads/feature/Sprint4/ABC-123-Branch

ベストアンサー1

これが意味するもの

アップストリーム (呼び出したリモート) にoriginは、 という名前のブランチがもう存在しないか、あるいはこれまで存在したことがなかった可能性があります (この情報だけでは判断できません) feature/Sprint4/ABC-123-Branch。これには特によ​​くある理由が 1 つあります。それは、他の Git リポジトリで誰かが (おそらくあなたではない、そうでなければ覚えているはずです) ブランチを削除したということです。

何をするか

これは、あなたが何を望んでいるかによって異なります。以下のディスカッション セクションを参照してください。次のことができます。

  • リモートでブランチを作成または再作成する、または
  • ローカルブランチを削除するか、
  • 他に思いつくものなら何でも。

議論

実行中である必要がありますgit pull(実行中の場合は、git merge別のエラー メッセージが表示されるか、エラー メッセージはまったく表示されません)。

を実行すると、Git は設定の セクションの下の行git fetchに基づいて別の Git に接続します。その Git はコマンド ( ) を実行し、とりわけすべてのブランチのリストを Git送信します。 を使用して、これがどのように動作するかを確認できます (試してみてください。教育的です)。以下は、これを Git リポジトリ自体で実行したときに得られる結果の一部です。url[remote "origin"]upload-packgit ls-remotegit

$ git ls-remote origin
From [url]
bbc61680168542cf6fd3ae637bde395c73b76f0f    HEAD
60115f54bda3a127ed3cc8ffc6ab6c771cbceb1b    refs/heads/maint
bbc61680168542cf6fd3ae637bde395c73b76f0f    refs/heads/master
5ace31314f460db9aef2f1e2e1bd58016b1541f1    refs/heads/next
9e085c5399f8c1883cc8cdf175b107a4959d8fa6    refs/heads/pu
dd9985bd6dca5602cb461c4b4987466fa2f31638    refs/heads/todo
[snip]

エントリrefs/heads/には、リモート上に存在するすべてのブランチと、対応するコミット ID がリストされますrefs/tags/(エントリの場合、ID はコミットではなくタグ オブジェクトを指している場合があります)。

Git はこれらの各ブランチ名を取得し、同じセクション内の行に応じて変更します。この場合、Git は、たとえばを に置き換えます。Git は、遭遇するすべてのブランチ名に対してこれを実行します。fetchremoterefs/heads/masterrefs/remotes/origin/master

また、元の名前を特別なファイルに記録しますFETCH_HEAD(自分のディレクトリを覗くとこのファイルを見ることができます.git)。このファイルには、取得された名前と ID が保存されます。

コマンドgit pullは便利なショートカットとして意図されています。git fetch適切なリモートで実行され、その後git merge(または、指示されている場合はgit rebase) セクションの指示に従ってマージ (またはリベース) するために必要な引数が付けられます[branch ...]。この場合、セクションでは からフェッチし、名前 で見つかった ID とマージするよう[branch "feature/Sprint4/ABC-123-Branch"]に指示されています。originrefs/heads/feature/Sprint4/ABC-123-Branch

その名前では何も見つからなかったので、git pull文句を言って止まります。

これを 2 つの別々のステップとして実行し、git fetchその後git merge(またはgit rebase)を実行すると、Git はキャッシュされたremotes/origin/リモート追跡ブランチを参照して、何をマージまたはリベースするかを判断します。かつてそのようなブランチがあった場合、リモート追跡ブランチがまだ存在する可能性があります。この場合、エラー メッセージは表示されません。そのようなブランチが一度もなかったか、 (無効なリモート追跡ブランチを削除する)を実行して対応するリモート追跡ブランチがない場合は、エラー メッセージが表示され、代わりgit fetch--pruneが参照されますorigin/feature/Sprint4/ABC-123-Branch

どちらの場合でも、 はfeature/Sprint4/ABC-123-Branch現在 という名前のリモート上に存在しないと結論付けることができますorigin

おそらく、かつては存在していたでしょうし、リモート追跡ブランチからローカル ブランチを作成した可能性もあります。その場合、リモート追跡ブランチはまだ残っている可能性があります。リモートからブランチを削除した人物とその理由を調べるか、単に何かをプッシュしてブランチを再作成するか、リモート追跡ブランチとローカル ブランチの両方またはいずれかを削除するかのいずれかです。


1まあ、少なくとも認めようとしていることはすべてです。しかし、特に参照を隠していない限り、リストにはすべてが含まれています。

編集、2020 年 7 月:すべてのリスト表示を回避し、Git が探している名前のみをリスト表示できる新しいフェッチ プロトコルがあります。これは、膨大な数のブランチやタグを持つリポジトリに役立ちます。ただし、Git がすべての可能な名前に関心がある場合、ここでもすべての名前が取得されます。

おすすめ記事