たまに「任意のブランチに、他ブランチからファイルをコピーしたいなー」という場面があります。
たとえば、GitHub Pagesで公開するためにgh-pagesブランチにビルド済みのファイルのみ置いておきたい、という場合がそうでしょうか。この場合、mainブランチではビルド前のソースコードやアセット用ファイルなどの他に、npmやyarnでビルドしたビルド済みファイルがあると思います(これらのファイルやフォルダが.gitignoreの対象だったら、この限りではない)。gh-pagesブランチには、このビルド済みのファイルだけが必要なので、mainブランチから必要な分だけのファイルをコピーしたいわけです。
ここでは、別ブランチからファイルをコピーするときの手順についてメモしておきます。
ここで想定している操作としては、「任意のブランチに対して、mainブランチからファイルをコピーする」です。つまり、これから紹介する手順だと、mainブランチがコピー元になります。
別ブランチにファイルをコピーするには、git checkoutを利用します。一応、いったんコピー前にファイルのアドレスなどをgit showを使って確認しておいた方が良いと思います。
git showコマンドでコピー元のファイルのアドレスを確認する。git checkoutコマンドでファイルを新しいブランチにコピーする。ざっくり手順を書き出すと上記のようになります。このように、git checkoutを使ったファイルのコピーは、今いるブランチがコピー先になるのでこの点は注意が必要です。
git checkout -b new_branchおなじみの、ブランチを作成するコマンドを実行します。これで新規ブランチが作成できます。
git checkout new_branchコピー先である、新規ブランチに移動します。
git showコマンドでコピー元のファイルのアドレスを確認するいったんコピー元のファイルについて、その在り処を確認しておきます。「もう場所もファイル名もバッチリわかってるぜ!」という場合は、この手順を飛ばしてしまってもいいと思います。
git show main:path/to/file1
git show main:path/to/file2 コピー元ブランチ名:ファイルパスの形式で指定します。
上記のコマンドを実行すると、指定したファイルの内容が表示されます。このとき、参照する対象についてファイルでなくフォルダを指定した場合は、そのフォルダに格納されているファイルの一覧が表示されます。
git checkoutコマンドでファイルを新しいブランチにコピーするいよいよ別ブランチからファイルをコピーしてきます。
git checkout main -- path/to/file1 path/to/file2git checkoutを利用し、前の手順で確認したファイルパスを指定します。
上記を実行すると、現在のブランチにフォルダ構造ごとファイルがコピーされます。ファイル単体だけでなく、フォルダ構成もコピー対象であることに注意です。上記であれば、path/to/file1というフォルダ構成で現在のブランチにコピーされます。
もし、現在のブランチではコピー元とは別のフォルダ構成にしたい場合、いったんコピーしたあとでフォルダを新規作成しファイルを移動するなどして、フォルダ構成を変更する必要があります。ここだけは若干面倒かもしれません。
git commit -m "Add some files from main"現在のブランチでの変更をコミットします。これで今までの操作が当ブランチに反映されました。