git merge upstream/master と git merge upstream master は全くの別物2020年01月05日 12時55分04秒

git merge upstream/master と git merge upstream master は全くの別物。

git merge upstream/master は upstream で示されているリモートレボジトリの master ブランチをマージするが、git merge upstream master は手元の origin の master をマージしてしまう。つまり、git merge upstream master を行っても、実は upstream の変更を取り込んでいないのだ。

git fetch や git pull では git fetch upstream mastergit pull upstream masterでは、これで upstream master を取ってくる。特に、git pull --rebase upstream masterだったりすると、うっかり git merge upstream master を行ってしまう。

これは、git merge がコミットの羅列を引数として受け取るからだ。それに引き替え git fetch や git pull は第一引数としてレポジトリを受け取り、それ以降にコミットの羅列を引数として受け取る事に起因する。

git のヘルプコマンドでも判る通り、似たような作業を行う merge と rebase のコマンドインターフェースが微妙に違ってややこしい。

git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
     [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
     [--[no-]allow-unrelated-histories]
     [--[no-]rerere-autoupdate] [-m <msg>] [-F <file>] [<commit>...]


git fetch [<options>] [<repository> [<refspec>...]]


git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
     [<upstream> [<branch>]]
git rebase [-i | --interactive] [<options>] [--exec <cmd>] [--onto <newbase>]
     --root [<branch>