gitのマージらへんをマスターしたい




Git - git-merge Documentation

別のブランチを取り込みたい側にチェックアウトした状態で、mergeコマンドを打つ。


マージコミットのコミットメッセージを付与する

git merge hoge-branch -m "Commit Message"
git merge hoge-branch -m "Commit Message" --no-ff


-mをつければよい。
ファストフォワードの場合は普通マージコミットが作成されないが、--no-ffをつけることで、マージコミットが作成される。




マージ(ローカル)をなかったことにする

git merge --abort


想定していないコンフリクトが起こったときに使用する。
作業ディレクトリに変更が残っているとできないので注意。

git reset --soft @~
git reset --mixed @~
git reset --hard @~
git reset --soft "@^"


softはステージに残す。
mixedはワーキングに残す。(デフォ。指定しない場合これ。)
hardは何も残さない。
キャレットを使用する場合は、"ダブルクォーテーション"で囲む。(windowsの場合、改行扱いになる)
チルダとキャレットの違いは割愛。
@はHEADのこと。
HEADは今いるコミットのポインタみたいなもの。









コンフリクトが明確であり、優先するブランチが決まっている場合

今いる側優先

git merge -Xours


取り込まれる側優先

git merge -Xtheirs



コンフリクトが起こった後、ファイルごと決める場合

git checkout --theirs hogehoge
git add hogehoge

git checkout --theirs ファイル名
git add ファイル名



Fast-forwardをする/しない

git merge --no-ff

ffできても、マージコミットをつくる
mainブランチとかはこっちの方がいいとおもう

git merge --only-ff

ffできるときのみffマージする。ffできなければabort。



コミットしない

git merge --no-commit


マージコミットを作成しない。
ただし、ffマージはマージコミットを作成しないので、これでは止められない。
--no-commit --no-ffとすればよいと思う。



マージツールの設定

ワーキングディレクトリ vs. コミットで差分があるとき、ツールを設定しておけばgit difftool のコマンドで外部ツールで確認できる。差分がないと何も起こらない。

ツールで設定する項目

https://git-scm.com/docs/git-difftool/2.31.0

diff.tool
デフォの差分ツール

difftool.<tool>.cmd
差分ツールを呼び指すコマンド。

difftool.prompt
差分ツールを呼び出す際にプロンプトを表示するか。
プロンプトを表示する必要ない場合に、これも設定する。

なお、差分ツール以外でもプロンプトが表示されることがあるので、全てで無効にするには次のようにする。

git config --global --replace-all core.pager "leff -F- -X"




すでにある設定を上書きするとき、あるオプション(--repalce-all ??)をつけて設定すればよい。


マージツール:p4merge

git config --global merge.tool p4merge
git config --global mergetool.1p4merge.path /Applications/p4merge.app/Contents/MacOS/p4merge
git config --global mergetool.prompt false


~/.gitconfigファイルに設定が追加されているはず。


マージツール:WinMerge

git config --global merge.tool winmerge
git config --replace --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -e -u -dl \"Base\" -dr \"Mine\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""
git config --global mergetool.prompt false





マージツールを使ってマージする

マージしてコンフリクトが起こってる状態で、次のコマンドを実行する。

git mergetol

(実行前にマージツールの設定が必要)




分岐を1本のブランチにする:リベース

リベースしてブランチを1本にしてからマージすることで、マージコミットのようなものが作られない。
→ コミット履歴がすっきり。
既存のコミットを削除して、新たなコミットとして追加されることに注意。
→プッシュされているものに対しては、リベースしない。
基本的にはローカルコミット→ローカルコミットへリベースする。

ワーキングブランチをmainブランチにリベースする

git rebase main


コンフリクトが起こった場合

マージするときと同様、Unmerged pathに追加される。
マージツール等を使用して解消して、次のコマンドを入力。

git rebase --continue