はじめに
よく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に傾倒する人です
最近書いた記事
- 2019.10.17ES2019で追加されたあれこれを使ってみる
- 2019.09.20JavaScript で安全に扱える最大整数
- 2019.07.24Gitでハッシュ値指定が重複したらどうなるのか
- 2019.07.09ハッシュは何に使えるのか