bzr shelve
since 2011-08-08
bazaar のサブコマンドで、差分を「棚上げ」するコマンド。
bzr shelve/unshelveの使い方 http://bit.ly/oAE9xc
bzr shelve は「いじったら動かなくなった」というときに bzr revert のかわりに使うことができる。「棚上げ」は分割できるので、ちょっとずつ差分を適用して、どこから動かなくなるか、といったテストができる。
使ってみる
下記の環境で実験:
bzr --version Bazaar (bzr) 2.3.1
まず、コミットされていないファイルがある作業ディレクトリ:
C:\work\nvda\jp2011.2>bzr status modified: nvdaHelper/nvdajpime/dllmain.cpp nvdaHelper/nvdajpime/nvdajpime.cpp nvdaHelper/nvdajpime/nvdajpime.h nvdaHelper/nvdajpime/tls.cpp nvdaHelper/nvdajpime/tsf.cpp source/nvdajp_keyEvents.py
bzr shelve すると、差分を一つ一つ「一時退避」するかどうか質問される:
C:\work\nvda\jp2011.2>bzr shelve --- nvdaHelper/nvdajpime/dllmain.cpp 2011-02-20 04:37:18 +0000 +++ nvdaHelper/nvdajpime/dllmain.cpp 2011-08-06 14:48:29 +0000 @@ -32,9 +32,11 @@ //@@ void Process_Dettach(HMODULE hModule) { +#if 0 TLS::DestroyTLS(); TLS::Uninitialize(); g_hModule = NULL; +#endif } BOOL APIENTRY DllMain( HMODULE hModule, Shelve? [yNfq?]
順番に y または n を押していく。ここでは2ヶ所だけ n を選んだ。最後に:
Selected changes: M nvdaHelper/nvdajpime/dllmain.cpp M nvdaHelper/nvdajpime/nvdajpime.cpp M nvdaHelper/nvdajpime/nvdajpime.h M nvdaHelper/nvdajpime/tls.cpp M nvdaHelper/nvdajpime/tsf.cpp M source/nvdajp_keyEvents.py Shelve 16 change(s)? [yNfq?]
ここで y を押すと:
Changes shelved with id "1".
これで shelve しなかった差分だけが作業ファイルに残る:
C:\work\nvda\jp2011.2>bzr status modified: nvdaHelper/nvdajpime/nvdajpime.cpp nvdaHelper/nvdajpime/nvdajpime.h
確認する。残念ながら1つ目の差分は前半はshelveして後半だけ残したかった:
C:\work\nvda\jp2011.2>bzr diff === modified file 'nvdaHelper/nvdajpime/nvdajpime.cpp' --- nvdaHelper/nvdajpime/nvdajpime.cpp 2011-07-31 14:51:18 +0000 +++ nvdaHelper/nvdajpime/nvdajpime.cpp 2011-08-08 07:33:58 +0000 @@ -33,13 +33,13 @@ void __RPC_USER midl_user_free(void* p) { free(p); } - +#endif HMODULE g_hModule; -Cnvdajpime* g_Cnvdajpime; +Cnvdajpime* g_Cnvdajpime = NULL; TLS g_TLS; DWORD TLS::dwTLSIndex = TLS_OUT_OF_INDEXES; === modified file 'nvdaHelper/nvdajpime/nvdajpime.h' --- nvdaHelper/nvdajpime/nvdajpime.h 2011-07-30 13:20:15 +0000 +++ nvdaHelper/nvdajpime/nvdajpime.h 2011-08-08 07:33:58 +0000 @@ -7,6 +7,7 @@ # nvdajpime # by Masataka Shinke */ +#define RESOURCE_DEBUG // by nishimoto //#pragma once
もう一度 bzr shelve して f を選んだら、全部一時退避する、ということになってしまった:
C:\work\nvda\jp2011.2>bzr shelve --- nvdaHelper/nvdajpime/nvdajpime.cpp 2011-07-31 14:51:18 +0000 +++ nvdaHelper/nvdajpime/nvdajpime.cpp 2011-08-08 07:33:58 +0000 @@ -33,13 +33,13 @@ void __RPC_USER midl_user_free(void* p) { free(p); } - +#endif HMODULE g_hModule; -Cnvdajpime* g_Cnvdajpime; +Cnvdajpime* g_Cnvdajpime = NULL; TLS g_TLS; DWORD TLS::dwTLSIndex = TLS_OUT_OF_INDEXES; Selected changes: M nvdaHelper/nvdajpime/nvdajpime.cpp M nvdaHelper/nvdajpime/nvdajpime.h Changes shelved with id "2".
どうやらひとつの diff を編集して細かく分ける、ということはできないらしい。
棚上げした差分を再度適用するには:
C:\work\nvda\jp2011.2>bzr unshelve 2 Using changes with id "2". M nvdaHelper/nvdajpime/nvdajpime.cpp M nvdaHelper/nvdajpime/nvdajpime.h All changes applied successfully. Deleted changes with id "2". C:\work\nvda\jp2011.2>bzr unshelve 1 Using changes with id "1". M nvdaHelper/nvdajpime/dllmain.cpp M nvdaHelper/nvdajpime/nvdajpime.cpp M nvdaHelper/nvdajpime/nvdajpime.h M nvdaHelper/nvdajpime/tls.cpp M nvdaHelper/nvdajpime/tsf.cpp M source/nvdajp_keyEvents.py All changes applied successfully. Deleted changes with id "1".
確認しないでまとめて「棚上げ」するには:
C:\work\nvda\jp2011.2>bzr shelve --all Selected changes: M nvdaHelper/nvdajpime/dllmain.cpp M nvdaHelper/nvdajpime/nvdajpime.cpp M nvdaHelper/nvdajpime/nvdajpime.h M nvdaHelper/nvdajpime/tls.cpp M nvdaHelper/nvdajpime/tsf.cpp M source/nvdajp_keyEvents.py Changes shelved with id "1". C:\work\nvda\jp2011.2>bzr diff
コミットを分割する
since 2011-10-16
コミットを忘れて複数の作業をしてしまったとき。
片方の作業が A, B に、もう一方の作業が C, D に変更を加えている。
bzr shelve で C, D を「棚上げ」して、A, B だけの状態に戻す。
そして A, B の作業を bzr commit する。
bzr unshelve で C, D の変更を呼び出す。
C, D の作業を bzr commit する。