はじめに
よくGitを利用する際にひんぱんにマージして開発ブランチも最新に・・・とはいっても難しいですよね。 そこでrerereを使うのがよさそうです。
reuse recorded resolution
の、略だそうです。 レレレを有効にするとマージ時のコンフリクトの解決を記憶させることができ、同じ作業を繰り返す必要がなくなります。
有効にするためには
git config --global rerere.enabled true
か、個別のリポジトリだけに反映するなら
.git/rr-cache
と、.gitディレクトリの中にrr-cacheディレクトリを作成すると保存されます。
masterはこうなっています。
tmp.coffee(master)
console.log "aaaaa"
branch1ブランチを作成してこうします。
tmp.coffee(branch1)
console.log "bbbbb"
masterに戻ってこうします
tmp.coffee(branch1)
console.log "ccccc"
そして、masterにbranch1をマージするとコンフリクトが発生します。
#scott>git merge branch1
Recorded preimage for 'tmp.coffee'
Auto-merging tmp.coffee
CONFLICT (content): Merge conflict in tmp.coffee
Automatic merge failed; fix conflicts and then commit the result.
普段のコンフリクトですが
Recorded preimage for 'tmp.coffee'という一文がふえました。
rr-cacheの中にbca36491009407a00892fc9b2abeeef9743xxxxxというディレクトリが発生しました。
この中にpreimageというファイルがあり中身はpatchファイルのようです。
<<<<<<<
console.log "ccccc"
=======
console.log "bbbbb"
>>>>>>>
今回の例では両方の修正を取り入れたかたちにしてコンフリクトを解決します。
console.log "ddddd"
そしてコミットすると
#scott>git commit -m "majimerge"
Recorded resolution for 'tmp.coffee'.
[master abcdef] majimerge
Recorded resolution for 'tmp.coffee'.とでました。
このとき、rr-cacheのディレクトリにはpostimageというファイルが作成されます。
中身はコンフリクト解決後の状態が格納されていました。
console.log "ddddd"
一旦
git reset --hard HEAD^などでmasterをマージ前の状態に戻します。
branch1ブランチに行きmasterをマージすると・・・
# scott>git merge master
Resolved 'tmp.coffee' using previous resolution.
Auto-merging tmp.coffee
CONFLICT (content): Merge conflict in tmp.coffee
Automatic merge failed; fix conflicts and then commit the result.
自動的に解決されました。 rerereを細かくやっていくことによって、ビッグバンマージを避けることができるようになります。
鈴木
和服とvapeとСистемаと醗酵とたまごふわふわとカッティングシェイプスとジャージークラブとjuke/fwkに傾倒する人です