やりたいこと
特定のリポジトリのコミットに対応して(変更を取り込んで)、別のリポジトリにコミットしたいことがあります。
例えば、GitHub上のリポジトリにある英語の公式サイトを翻訳して、別のリポジトリの日本語公式サイトを作成している場合などです。
例: 英語公式サイトのコミットに対応して、日本語サイトのコミットをおこないました。
そんなときにはgit cherry-pick
を使いましょう!
git cherry-pickとは
git cherry-pick
とは、別リポジトリまたは他のブランチの特定コミットを自分が今いるブランチに反映できるコマンドです。
以下のようにすると、変更が取り込まれ、またコミッタ情報には元のコミットをした人に加えて新たにコミットをおこなった自分自身が入るようです。
ちなみにWikipediaによるとcherry-pickの意味は以下のとおりだそうです。
cherry-pickingの語義は、サクランボの熟した果実を熟していないものから選別することであり、転じて「良い所だけを取る」「(特売品専門の)購買者」「つまみ食い」の意味で使用される。
(略)
Gitのようなバージョン管理システムにおいて、あるコミットで行われた変更を別な箇所に「つまみ食い」的に適用する操作がチェリーピックと呼ばれる[1]。
手順
上の概略図も参考にしながら、手順を参照すると少しわかりやすいと思います。
日本語サイトのリポジトリをローカルにプルしておき、ブランチ(名前は適当にここではdev
)を切っておきます。
git remote add english https://github.com/abc-english/example-website.git
git fetch english
git cherry-pick {englishの対応したいコミットハッシュ値(4e106d...)}
英語サイトをenglish
というリモートに追加、フェッチします。
その中から日本語サイトに反映させたい・対応付けさせたいコミットをハッシュ値によって指定して取り込みます。これがgit cherry-pick
コマンドです。
日本語訳がある程度進んでいる場合には競合が発生するので、適当なエディタで編集して解消(日本語訳)をおこないます。
git add <path>
git commit -m {対応した英語サイトのコミットのコミットメッセージ}
git push --set-upstream origin dev
編集をおこなったファイルをステージングし、コミットをおこないます。コミットメッセージは対応したコミットのコミットメッセージをコピペしたほうが対応したことがわかりやすくなると思います。
dev
ブランチとして日本語サイトのリモートリポジトリにプッシュして完了です。
あとはGitHubなどでプルリクエストを出すなり何なりしましょう。
PRに含まれるコミットが英語サイトのコミットに対応したものだと、たぶん気づいてもらえるはずです!