git cherry-pick
は異なるリポジトリ間でも使える。
なんとなく似てるコードがいろんなリポジトリにある。。。残念な状況だけど。
そんなとき点在している同じコードに問題が見つかったら一生懸命修正して回ることになるけど、ちょっとでも楽したい。
(修正を導入したいリポジトリ内で)
git remote add FIXED_REPO {すでに修正を導入したリポジトリのURL}
git fetch FIXED_REPO
git cherry-pick {FIXED_REPO上のコミットのSHA1}
git push origin master
もう一歩進んで、1つのリポジトリで修正した後、そのまま他のリポジトリにその修正を導入して行くにはどうしたら良いか。
(最初に修正を導入したリポジトリ内で)
git remote add TO_FIX_REPO {これから修正を導入したいリポジトリのURL}
git fetch TO_FIX_REPO
git checkout -b TO_FIX_REPO-master TO_FIX_REPO/master
git cherry-pick {master上の修正コミットのSHA1}
git push TO_FIX_REPO TO_FIX_REPO-master:master
(上記を修正を導入したいリポジトリの数だけ繰り返す)
これならかなり機械的に処理できるから、だいぶ楽になるんじゃないだろうか。まぁだからといってコピペが横行して良いというわけではないが。
ちなみにgit push TO_FIX_REPO TO_FIX_REPO-master:master
ってのも結構ポイント。ローカルのブランチ名とリモートのブランチ名が異なるときはこう書く。間違えてローカルのブランチ名だけ書いちゃう(git push TO_FIX_REPO TO_FIX_REPO-master
)と、リモートに変なブランチが作られちゃうので要注意。
そしてこのエントリを書く前にテストしていて気づいたけど、リポジトリ内のパスが異なっていてもある程度まで解決してくれるみたい。すごい。cherry-pickコマンドに対して明示的に、「このpathをこのpathに置き換えて適用」って指定できたらもっと嬉しいけど、残念ながらいまのところそういう機能はなさそう。
それにしてもcherry-pickってなんか良い名前。