(commit or stash + checkoutすらめんどいことだって、あるんですよ・・)
そもそもリポジトリと作業ディレクトリの違いって?
gitリポジトリには、コミットされている内容やブランチなどの全ての情報がつまっています。一方で作業ディレクトリは、リポジトリ内のあるcommitの内容を、ファイルとして書き出したものになっています。
git-new-workdirコマンド
gitリポジトリに紐づく新たな作業ディレクトリを作成します。
git-new-workdir <repository> <new_workdir> [<branch>]
ただし、デフォルトでPATHが通っていません。Fedoraあたりなら /usr/share/doc/git-1.7.10.2/contrib/workdir/git-new-workdir に、homebrewなら /usr/local/Cellar/git/1.7.12.4/share/git-core/contrib/workdir/git-new-workdir あたりに入っているかと思われます(バージョンは適宜読み替えてください)。その他gitがインストールされている環境であれば、locateや/usr以下へのfind -nameで見つけられると思います。
それってgitリポジトリをコピペするのと何が違うの?
- branchの状態が共有されます。すなわち、ある作業ディレクトリでcommitをすると、他の作業ディレクトリからも参照できます。
- git pullやgit fetch、git remote updateなどで取得した情報は共有されます。
- **ブランチ固有のconfig(.git/config)**が共有されます。
- (hookなども共有されると思います。)
作業ディレクトリがいくつもあって何がうれしいの?
- 別々のbranchを同時にcheckoutして、動作の比較を行ったりできます。
- 急なバグ対応が入ったりした時に、面倒なcommitやstashをせずに、すぐに作業を切り替えることができます。
- (個人的に)作業状態のまま放置できるので、どの作業をしていたのか忘れずに済みます。
注意したい点
- index/staging領域(git addすると追加されるところ)は共有されません
- すなわち、ある作業ディレクトリからgit addしただけの差分は、他の作業ディレクトリから参照できません
- ある作業ディレクトリでcheckoutしているブランチを、別の作業ディレクトリから更新(commitやreset HEAD~、pullなど)してしまうと、おかしなことになります。
- git statusすると、checkoutしていたツリーがgit addされていることがわかります(indexがそのままに、commitだけが変わったため)。
- まだgit addしていない変更内容が巻き添えになったときは、同じファイルが変更されていない限り、git reset --mergeするとだいたい元に戻るかと思いますが、保証はありません。
- checkout中のbranchを他の作業ディレクトリから消してしまうと、その作業ディレクトリではcheckoutすらできなくなってしまいます。
- git reset --hard <どこか> としてブランチを再度初期化し、改めてブランチを消してください
- シンボリックリンクを使っているので、repositoryとしてgit-new-workdirで作成したディレクトリを渡すと、symlinkに対するsymlinkが作成されておかしくなるかもしれません。
※使っていない作業ディレクトリのファイル容量が気になる時は、ファイルをすべてgit rmしたparking branchを作成して、checkoutしておくとよさそうです。
※作業ディレクトリ数に制限はありません。
参考
Qiitaのこの記事でも取り上げられていました。
http://qiita.com/items/2a19f5dca568329f8f8e