1. ホーム
  2. git

[解決済み] リモートの <ブランチ名> とマージするように設定されていますが、そのような参照は取得されませんでしたか?

2022-01-25 10:45:03

質問

pullでこのエラーが発生します。

設定により、ref 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

解決方法は?

これは何を意味するのか

あなたの上流-あなたが呼び出すリモート origin -という名前のブランチはもう存在しないか、あるいはもともと存在しなかったかもしれません (この情報だけでは判断できません)。 feature/Sprint4/ABC-123-Branch . それは、誰かが (おそらくあなたではない、あるいは覚えているはずの) 他の Git リポジトリのブランチを削除してしまったからです。

どうすればいいのか

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

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

ディスカッション

を実行している必要があります。 git pull (もし、あなたが git merge を実行すると、別のエラーメッセージが表示されるか、エラーメッセージがまったく表示されないでしょう。)

を実行すると git fetch に基づいて、あなたのGitは別のGitに連絡します。 url の下にある行を [remote "origin"] というセクションを作成します。 そのGitはコマンドを実行します( upload-pack を送信します。 あなたの Git に全ブランチのリストを送信します。 この機能を使うには git ls-remote がどのように動作するかを確認することができます(試してみてください、勉強になりますよ)。 の Git リポジトリでこれを実行したときのスニペットを以下に示します。 git そのものです。

$ 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/ のエントリは、リモートに存在するすべてのブランチをリストアップします。 1 と共に、対応するコミット ID ( refs/tags/ エントリでは、IDはコミットではなくタグオブジェクトを指すことがあります)。

あなたのGitは、これらのブランチ名それぞれを 変更 に従って fetch の行は、その同じ remote セクションを作成します。 この場合、あなたのGitは refs/heads/masterrefs/remotes/origin/master といった具合に。 Gitは、出てきたすべてのブランチ名に対してこれを行います。

また、元の名前も特別なファイルに記録します。 FETCH_HEAD (このファイルは、ご自身の .git ディレクトリにあります)。 このファイルには、取得した名前とIDが保存されています。

git pull コマンドは便利なショートカットとして用意されています。 git fetch を適切なリモートで実行し、その後 git merge (または、そのように指示された場合。 git rebase によって指示されたとおりにマージ (あるいはリベース) するために必要なあらゆる引数を指定します。 [branch ...] セクションを作成します。 この場合、あなたの [branch "feature/Sprint4/ABC-123-Branch"] セクションによると origin という名前の下に見つかった ID と結合します。 refs/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 がすべての可能な名前に興味を持っている場合は、ここにすべての名前が表示されます。