logo
/
👀gitのmergeを攻略する
※mainはremoteに置き換えて読んでも良い

pullとfetch

pullはfetch + mergeなので、pullであっても通常のmergeと変わらない。
fetchすると{origin}/branchブランチが出来てそれをマージするだけ
個人だったらpullでも良いとは思うが、基本はfetch->mergeを明示的にやったほうが良さそう

FastFoward

取り込みたいブランチが、今のブランチの先を言っている場合のこと。今のブランチも独自に進んでいたらNonFastFoward --ffオプションをつければ、ff可能ならマージコミットは出来ず、ff不可ならできる?

PullによるMerge

git config --global --add pull.ff only
mergeに--ff-onlyオプションを付けるのと一緒 git pull した際のマージでコミットを作らないようにする設定。これを設定しておかないと、git pull する度に余計なマージコミットができてしまう。この設定をしておけば、Fast-Forward な場合はマージコミットが作られない。
?NoFFの場合マージすら出来ない?

通常のMerge

git config --global --add merge.ff false
mergeに--no-ffをつけるのと一緒 Fast-Fowardな場合でもmergeコミットを作る

remoteが進んでいる場合

mainをlocalにmerge

Fast-Fowardだと思う

no option

# .gitconfig

[merge]
    ff = false
上記の設定をしていないので、今回merge commitは作られなかった

--ff option

merge commitは作られなかった

--ff-onlyoption

merge commitは作られなかった

--no-ff option

351f928 (HEAD -> local) Merge branch 'main' into local
1204725 (main) update a.txt @main
000f700 add a.text @main
merge commitが作られた

localからmainにpushする

出来ない(何もコミットがないから)
$ git merge local
Already up to date.

localが進んでいる場合

remoteが進んでいる場合の逆

remote/local両方進んでいる場合

mainをlocalにmerge(no conflict)

Non Fast-Fowardだと思う

no option

merge commitが作られた
98df68c (HEAD -> local) Merge branch 'main' into local
f235a11 add b.txt @local
8c535d9 (main) update a.txt@main
000f700 add a.text @main

--ff option

同様にmerge commitが作られた

--ff-onlyoption

拒否された
fatal: Not possible to fast-forward, aborting.

--no-ff option

同様にmerge commitが作られた

mainをlocalにmerge(no conflict)

いずれの場合でもマージコミットが作られる。
コミットによる作業が発生するので当たり前。

リンク