Shelving Changes

ときどき、作業ツリーから一時的に変更点を取り除いて、あとで元に戻したいことがあるかもしれません。 たとえば何か作業中に小さいバグフィックスを見つけてコミットする場合などです。 Bazaarは変更を shelf (書棚)に保存する機能を持っています。 後で変更を元に戻したくなったときは、 unshelve を使って作業ツリーに戻すことができます。

たとえば、一つか複数の変更がされた作業ツリーを考えて見ます…:

$ bzr diff
=== modified file 'description.txt'
--- description.txt
+++ description.txt
@@ -2,7 +2,7 @@
 ===============

 These plugins
-by Michael Ellerman
+written by Michael Ellerman
 provide a very
 fine-grained 'undo'
 facility
@@ -11,6 +11,6 @@
 This allows you to
 undo some of
 your changes,
-commit, and get
+perform a commit, and get
 back to where you
 were before.

shelve コマンドはインタラクティブにどの変更を作業ツリーに保留しておきたいのかを質問します。:

$ bzr shelve
--- description.txt
+++ description.txt
@@ -2,7 +2,7 @@
 ===============

 These plugins
-by Michael Ellerman
+written by Michael Ellerman
 provide a very
 fine-grained 'undo'
 facility

Shelve? [yNfrq?]: y
--- description.txt
+++ description.txt
@@ -11,6 +11,6 @@
 This allows you to
 undo some of
 your changes,
-commit, and get
+perform a commit, and get
 back to where you
 were before.

Shelve? [yNfrq?]: n
Shelve 2 change(s)? [yNfrq?]', 'y'
Selected changes:
 M  description.txt
Changes shelved with id "1".

もしたくさんの変更が作業ツリーにあるのであれば、 shelve コマンドにファイルのリストを渡して、それらのファイルの変更だけについて質問されるようにすることができます。 変更を shelve した後に diff コマンドで作業ツリーに期待する変更だけが残っていることを確認するとよいでしょう。:

$ bzr diff
=== modified file 'description.txt'
--- description.txt
+++ description.txt
@@ -2,7 +2,7 @@
 ===============

 These plugins
-by Michael Ellerman
+written by Michael Ellerman
 provide a very
 fine-grained 'undo'
 facility

よし! - コミットする準備ができました:

$ bzr commit -m "improve first sentence"

後になって、shelveした変更を作業ツリーに unshelve コマンドで戻します:

$ bzr unshelve
Unshelving changes with id "1".
 M  description.txt
All changes applied successfully.

もし望むのであれば、複数のアイテムをshelfに置くことができます。 通常 unshelve が実行されるたびに最も最近 shelve された変更が元に戻されます。 明示的にどの変更を戻すのかを指定することで別の順序で unshelve することもできます。

Bazaarはshelveされた後に変更があっても、shelfの変更を作業ツリーにマージするので、衝突が発生するかもしれません。 その場合は通常のマージ後と同じように衝突を解決しなければなりません。