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

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

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

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

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

2回答

19204閲覧

git pullでマージしていないコミットがあるにも関わらずAlready up to dateと表示される

miyaken912

総合スコア15

Git

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

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

0グッド

0クリップ

投稿2020/09/28 09:53

編集2020/09/28 10:00

サーバとローカル環境の両方にgitを入れています。

サーバ上のdevelopブランチで直接修正したコードをGitHubにpushした後に、ローカル環境で同じブランチから以下のコマンドでpullしようとしてもAlready up to dateと表示されます。

git

1$ git branch 2* develop 3$ git pull origin HEAD 4From https://github.com/(GitHubリポジトリ名) 5 * branch HEAD -> FETCH_HEAD 6Already up to date.

しかし、HEADではなくブランチ名を直接指定するとサーバからpushしたコミットが期待通りpullされます。

git

1$ git pull origin develop 2From https://github.com/(GitHubリポジトリ名) 3 * branch develop -> FETCH_HEAD 4Updating 1d0a424..0e75c87

HEADはいまいるブランチを指しているという理解だったので、git pull origin HEADもgit pull origin developも同じ結果になるかと思ったのですが、なぜgit pull origin HEADだとpullされないのでしょうか?

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

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

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

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

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

bsdfan

2020/09/28 11:08

remoteのHEADはどうなっていますか? githubなら通常はmasterだと思いますが。 その場合、masterとdevelopはどっちが進んでいますか?
miyaken912

2020/09/28 13:11

初学者なもので確認なのですが、remoteのHEADというのは、$ git ls-remote origin HEADで表示されるハッシュ値が指しているブランチという理解でよかったですか?masterを指しているようです。 masterとdevelopでは、developのほうが進んでいます。
bsdfan

2020/09/28 13:22

githubのsettingsのdefault branchがどれかというのでいいのですが、そのコマンドでも確認できるんですね。 その状態ならHEADはmasterを指しているようですね。
guest

回答2

0

ベストアンサー

git pull origin HEADとしたときのHEADは、ローカルのHEADではなく、リモートレポジトリのHEADのことです。
リモートのHEADがmasterを指しているようなので、厳密には違いますが動作としてはmasterをmergeしようとしています。

developの方が進んでいるとのことなので、Already up to date. となるのでしょう。

投稿2020/09/28 13:26

bsdfan

総合スコア4520

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

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

miyaken912

2020/09/28 13:32

あ、なるほど、そういうことなんですね! 少し勘違いして理解していましたが、正しく理解出来ました。 ありがとうございます!
guest

0

HEADはいまいるブランチを指しているという理解だったので

確かにいまいるブランチを指しているのですが、
より正確に言うと、いまいるブランチの最新のリビジョンを指しているので、
pull により実行されるマージで、新たなマージが発生することがないためと思われます
一方で、ブランチ名を指定した場合、
こちらは pull により新たなマージ (First Forward) が発生するので
Updating と表示されます

bsdfan さんの回答を受けて確認したところ、
たしかにリモートブランチの HEAD を pull してマージする動作になりました
なので、master ブランチの方に新規リビジョンが追加されていると、
develop ブランチに master の新規リビジョンがマージされてしまい
想定されている結果とは異なる結果になります

Result: git pull origin HEAD

参考: DEFAULT BEHAVIOUR | Git - git-pull Documentation

If explicit refspecs were given on the command line of git pull, they are all merged.

git pull コマンドの <refspec> には通常、ブランチ名を入力します:

参考: Git - git-pull Documentation

console

1git pull [<options>] [<repository> [<refspec>…​]]

<refspec> can name an arbitrary remote ref
(for example, the name of a tag)
or even a collection of refs with corresponding remote-tracking branches
(e.g., refs/heads/:refs/remotes/origin/),
but usually it is the name of a branch in the remote repository.

投稿2020/09/28 10:34

編集2020/09/28 13:51
y_shinoda

総合スコア3272

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

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

miyaken912

2020/09/28 12:54 編集

「より正確に言うと、いまいるブランチの最新のリビジョンを指しているので、pull により実行されるマージで、新たなマージが発生することがないため」というのは、pullでmergeしようとしているリビジョンが、サーバ上でcommitした最新のものではなく、いまいるローカル環境からcommitした最新のリビジョンを指しているからという理解であっていますか?(つまり、自分自身でpushしたものをpullしようとしてきている)
y_shinoda

2020/09/28 13:09 編集

おそらくですが、そのような動きをしているものと思われます 振る舞いの解説については、 公式 DOC に今回の事象にぴったり該当する記述は見つけられませんでしたので、 公式 DOC に記載されている内容と、実行したときのログからの推測です 公式 DOC を読む限りでは、基本的にはブランチ名で実行するのが良いと思います
miyaken912

2020/09/28 13:25

なるほど、理解しました!ありがとうございました!
y_shinoda

2020/09/28 13:52

bsdfan さんの回答を受けて回答の誤りを修正しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問