1. ホーム
  2. git

[解決済み] git pull origin mybranch' はローカルの mybranch を origin よりも N コミット先にします。なぜ?

2023-03-24 23:59:48

疑問点

私はちょうど git pull について奇妙なことを観察しました。

金曜日、私はローカルブランチで仕事をしました。 mybranch . オフィスを出る前に、私はそれを origin (これは私の github リポジトリです) にプッシュしました。 git push origin mybranch .

昨日、自宅で pull ブランチをラップトップに編集し、さらにコーディングし、そして私の変更を github (origin) にプッシュしました。

今、私は再び職場にいて、昨日からの変更を職場のマシンに引き込もうとしました (私は週末に職場のローカル リポで何も変更していません)。

git pull origin mybranch

を実行すると、早送りのマージが発生しましたが、これは問題ありません。その後、私は git status を実行すると、それは

# On branch mybranch
# Your branch is ahead of 'origin/mybranch' by 6 commits.
#
nothing to commit (working directory clean)

あれ?週末に触ってもいないし、originからpullしたばかりなのに、どうして6コミットも進んでいるのでしょうか?そこで、私は git diff origin/mybranch を実行したところ、差分はまさに私がリモートからプルした6つの変更でした。

を実行することによってのみ、quot;fix" することができました。 git fetch origin :

From [email protected]:me/project
af8be00..88b0738  mybranch -> origin/mybranch

どうやら、私のローカルリポには参照オブジェクトが欠けていたようです。つまり、pull はすでにフェッチを行いますし、私はそのブランチ以外では何も作業していませんから、そのブランチに git fetch origingit fetch origin mybranch は同じ結果になるのでしょうか?

常に git pull origin の代わりに git pull origin branchname ?

混乱しています。

どのように解決するのですか?

git pull コール git fetch を適切なパラメータで呼び出すと、 明示的に取り出したヘッド (あるいはマージ用に設定したリモートブランチがない場合は) を現在のブランチにマージします。

構文は git fetch <repository> <ref> ここで <ref> はコロン無しのブランチ名です。これは「一発」フェッチで、指定したリモートのすべての追跡ブランチの標準フェッチを行わず、代わりに指定したブランチだけを FETCH_HEAD .

更新しました。 1.8.4 以降の Git バージョンでは、取得を依頼した参照を追跡しているリモート追跡ブランチがある場合、その追跡ブランチは現在では fetch . この変更は、特に以前の動作が引き起こした混乱を避けるために行われました。

を実行するとき git pull <repository> <ref> , FETCH_HEAD は上記のように更新され、チェックアウトされた HEAD にマージされますが、リモートリポジトリの標準の追跡ブランチはどれも更新されません (Git <1.8.4) 。これは、ローカルでは が見える に見えますが、実際にはリモートブランチより進んでいるのです。

個人的には、私はいつも git fetch の後に git merge <remote>/<branch> を使うことで、マージする前に強制アップデートの警告が表示され、マージする内容をプレビューすることができるからです。もし私が git pull をもう少し多く使うのであれば、私はプレーンな git pull を、ほとんどの場合パラメータなしで実行します。 branch.<branch>.remotebranch.<branch>.merge を「正しいことをする」。