以前、gitの作業状態を他のリポジトリにコピーするという記事を書きましたが、これは既にリポジトリに追加していあるファイルのみ有効で、まだ一度もステージしていないファイルについてはコピーできませんでした。最近、別のやり方でステージングしていないものも含めて変更内容を保存する方法を思いついたので書きます。
~/.gitscripts
以下に git-xxx
というシェルスクリプトを作成することで git xxx
というサブコマンドを追加できます。今回はそれを利用して git port
というコマンドを作成します。
git-port
#!/bin/sh
date=`date "+%Y%m%d-%H%M%S"`
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
host=`hostname -s`
git checkout -b "wip-${date}"
git add .
git add -u
git commit -m "[WIP] temporary commit from ${branch} on ${host}"
このシェルスクリプトは、 WIP-日付-時刻
というブランチを作成し、現在の変更内容をコミットします。(WIPはWork In Progressの略です)
作成されたWIP-xxブランチをリモートにpushして、差分を移したい他の作業環境に移動したら、元のブランチとこのブランチの両方をpullします。
そして差分を適用したいブランチに切り替えて、このコミットをcherry-pickすれば、差分をそっくり適用することができます。
適用した後は git reset HEAD^1
でコミットを取り消せば、最新のコミットからの差分がステージされていない状態になるので、以後は作業を続行して任意のコミットを重ねることができます。
ただし、リモートリポジトリを経由するのでCIを設定している場合にビルドが走ってしまうなどの弊害はあるので注意して下さい。