質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

Q&A

解決済

1回答

995閲覧

`git fetch <repository> <branch>`しても、リモート追跡ブランチに反映されない

miya_bunta

総合スコア7

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

0グッド

0クリップ

投稿2019/07/26 07:41

編集2019/07/26 07:57

あるlocal作業環境で、リモートブランチのcommitが進んでいる状態でgit fetch origin developしたところ、下記のように"FETCH_HEAD"だけが更新され、リモート追跡ブランチ"origin/develop"に反映されませんでした。

From bitbucket.org:xxxxxxx/xxxxxxx * branch develop -> FETCH_HEAD

私が期待していたのは下記のような結果です。(引数なしでgit fechした場合は問題なくリモート追跡ブランチに反映されました。)

From bitbucket.org:xxxxxxx/xxxxxxx * branch develop -> FETCH_HEAD xxxxxx..xxxxxxx develop -> origin/develop

git fetch <repository> <branch>した時にリモート追跡ブランチにも反映されないのは何故でしょうか?

調べたこと

git fetch origin developgit fetch origin develop:と同じであり、引数として"<dst>"が明示されていない場合、"remote.origin.fetch"の値の"<dst>"が設定されるという認識でおります。

".git/config"を確認すると下記のようになっており、参照が間違っているようにも見えません。

[remote "origin"] url = git@bitbucket.org:xxxxxxx/xxxxxxx fetch = +refs/heads/*:refs/remotes/origin/* [branch "develop"] remote = origin merge = refs/heads/develop

補足

git version 1.8.3.1 (バージョンが古いのが気になります...)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoorwm

2019/07/26 08:12

日本語がおかしいか、理解が間違っている気がします。 > 引数なしでgit fechした場合は問題なくリモート追跡ブランチに反映されました。 fetchはリモートに作用しませんよ?
miya_bunta

2019/07/26 09:12

ご指摘ありがとうございます。 > fetchはリモートに作用しませんよ? 念の為確認させていただきたいのですが、リモートとは「リモートブランチ」ではなく「リモート追跡ブランチ」を指してらっしゃるのですよね? `fetch`を行うとリモートブランチの最新状態を取得し、ローカル上のリモート追跡ブランチが更新されると理解しておりましたが違うのですね。ふむふむ...ちょっと勉強し直します。
tamoto

2019/07/26 10:42

「リモート追跡ブランチ」はリモートの情報をマッピングしているだけのローカルに保持している ref のことなので間違っていませんよ。
guest

回答1

0

ベストアンサー

こんにちは。

その .git/config の fetch の値が、git fetch で引数を省略した場合のデフォルト値です。
つまり、こう書かなければなりません。

sh

1git fetch origin refs/heads/branch:refs/remotes/origin/branch

: の右側がマッピング対象のリモート追跡ブランチです。


20190731 追記

全面的に回答を修正します。
Windows Sandbox 上で Git v1.8.3 をインストールし同様の操作を試してみたところ、質問の問題が再現することが分かりました。
現在の Git (v2.22.0-1 にて確認)では、refspec を部分的に省略した場合でもその箇所が .git/config に指定したデフォルト値にフォールバックされるようで、どちらの書き方であっても自動的に remote ref が更新されるようになっているようです。
これが仕様変更なのか、バグ修正なのか、どのタイミングでどのように変更が反映されたのか、については未だ検証できていませんが、少なくともこれがクライアントバージョンの差分によるものであることは確認がとれました。

投稿2019/07/26 10:38

編集2019/07/31 01:15
tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

miya_bunta

2019/07/26 13:13 編集

ご回答ありがとうございます! つまりこの場合`git fetch`の第2引数に"<src>:<dst>"を明記する必要があるということでしょうか? また、本文にも書いたように`git fetch origin develop`は`git fetch origin refs/heads/develop:`と同じであり、省略した"<dst>"には.git/configのデフォルト値`refs/remotes/origin/*`が適用されることでリモート追跡ブランチも更新されるという認識でした。 しかし、実際は期待した動きにはなりませんでした。(ただ、他の環境ではこの書き方でリモート追跡ブランチも更新されたような記憶があります...) この認識に誤りがあるか、または他の要因があるのでしょうか? 質問を重ねてしまい恐縮ですがご教示いただけると幸いです。
tamoto

2019/07/26 13:30

「`git fetch origin develop`は`git fetch origin refs/heads/develop:`と同じ」と今自分で言ってる通り、`git fetch origin refs/heads/develop:` を実行してるわけです。 それが `git fetch origin refs/heads/develop:refs/remotes/origin/develop` に勝手に変わるなどと、どこかに書いてあったりしたのでしょうか?
tamoto

2019/07/26 13:33

「<dst> を省略」っていう見方が良くないかもしれません。 <dst> には、「明示的に <空> を渡している」のだと考えてください。
miya_bunta

2019/07/26 17:10

なるほど、別環境で`git fetch origin develop`したときにリモート追跡ブランチも更新されたような記憶がありましたのでそのように考えておりましたが記憶違いだったようです。。。 ありがとうございます!
miya_bunta

2019/07/26 17:45 編集

↑で言っていた別環境(リポジトリも別物)で同様にリモートブランチのcommitが先行した状態で`git fetch origin develop`したところ ``` From bitbucket.org:xxxxxxxx/xxxxxxxxx * branch develop -> FETCH_HEAD xxxxxxx..xxxxxxx develop -> origin/develop ``` となり、developブランチがorigin/developよりもbehindな状態になりました。 これはどう理解したら良いでしょう...
tamoto

2019/07/27 05:13

空のリポジトリを作って試してみたところ、確かにその通りの挙動となることが確認できました。 記憶と異なっているので、ちょっと詳細に検証してみます。 本回答は誤りである可能性があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問