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 する。
