Chapter 9
Finding and fixing your mistakes

えるものですがそのをよりってこそれたシステムえますこのではプロジェクトんだした使えるについてします Mercurial するためのれたています

9.1 Erasing local history

9.1.1 The accidental commit

としてえるよりもしてしまうというえているためであったりったチェンジセットコミットしてしまうことがありますチェンジセットコミットしてしまう のはしいスファイルしたのにhg addれているどですっているチェンジセットコミットしてしまうには通点はありませんが but (no less annoying) XXXXX

9.1.2 Rolling back a transaction

Mercurial リポジトリへのトランザクションとしてっていることを4.2.2 べましたチェンジセットコミットしたりリポジトリから pull するMercurial したことをしていまhg rollbackコマンド使することできっちりをするならすことができますこのコマンド使するべられていますので 9.1.4 してくださ)。

しくファイルしたのにそのファイルしてhg addコマンドするのをれてコミットしてしまうというのよくやるいは以下のようなものです

1  $ hg status
2  M a
3  $ echo b > b
4  $ hg commit -m ’Add file b’

コミットhg statusればすぐさまいをできます

1  $ hg status
2  ? b
3  $ hg tip
4  changeset:   1:f09f6de362c3
5  tag:         tip
6  user:        Bryan O’Sullivan <bos@serpentine.com>
7  date:        Mon Jul 20 21:48:31 2009 +0000
8  summary:     Add file b
9  

コミットa えていますがファイル b していませんしているリポジトリこのチェンジセットしてしまったらがこのチェンジセットんだ a かが リポジトリにはしない b してしまいますそうなればりのになってしまうでしょ

しかしいなことにチェンジセットリポジトリへとするいをつけていますhg rollbackマンド使うことで Mercurial 最後チェンジセットしてくれます

1  $ hg rollback
2  rolling back last transaction
3  $ hg tip
4  changeset:   0:f58dc9900f04
5  tag:         tip
6  user:        Bryan O’Sullivan <bos@serpentine.com>
7  date:        Mon Jul 20 21:48:31 2009 +0000
8  summary:     First commit
9  
10  $ hg status
11  M a
12  ? b

リポジトリチェンジセットしませんのでディレクトリa ファイルされている だとみなされますコミットルバックディレクトリコミットそのままにチェンジ セットされますそうなったならb ファイルhg addコミットすることができま

1  $ hg add b
2  $ hg commit -m ’Add file b, this time for real’

9.1.3 The erroneous pull

つのプロジェクトんでいるブランチMercurial するそれぞれなるリポジトリすることが となっていますプロジェクト“0.9” リリリポジトリなる “1.0” リリリポジトリつかもしれません

このカル“0.9” リポジトリがあってそこに“1.0” リポジトリんだ になることが想像できますわないために“1.0” リポジトリからんだ “0.9” リポジトリへとしてしまった全体させてしまうでしょうこのろしい してはほど方法しますので。)。しかしMercurial URL する Mercurial しげなリポジトリんだことがされますからすぐにがあり 1

hg rollbackコマンドまさにんだてのチェンジセットきちんとにしますMercurial hg pullによりまれるチェンジセット全体トランザクションするのでhg rollbackでこの すことができます

9.1.4 Rolling back is useless once you’ve pushed

hg rollbackリポジトリしたでも、(リポジトリにおいてはかったことにできましによりされますがそれができるのはhg rollback実施したリポジトリにおけしのみですしはしますのでしをリポジトリするいので

リポジトリ ではリポジトリ したにはそのており しとは方法いをわせるがありますリポジトリ、(リポジトリその したしたリポジトリからんだにはしたリポジトリれま

したいしたリポジトリにおけるのものでもそれをそのリポジトリからんでいない ことがであるそのすこともできますがしがすることにはしないようにしてくださいかれ かれることのできないあるいはれていたリポジトリへとされりまわってってきたかれて しまいます。)

9.1.5 You can only roll back once

Mercurial リポジトリにおけるトランザクションつだけトランザクションログしますそのため せるトランザクションだけですトランザクションしたそのトランザクションせることを してもりのられません

1  $ hg rollback
2  rolling back last transaction
3  $ hg rollback
4  no rollback information available

あるリポジトリトランザクションしをったコミットするなりむなりしないそのリポジト しをうことはできません

9.2 Reverting the mistaken change

ファイルしたファイルないことにいたコミットするであればhg revertコマン 利用できますこのコマンドディレクトリチェンジセットファイルします。( するとくなりますがこのコマンドします。)

hg revertコマンドちょっとしたサンプルしますMercurial によりされているファイル します

1  $ cat file
2  original content
3  $ echo unwanted change >> file
4  $ hg diff file
5  diff -r d7249497af8c file
6  --- a/file Mon Jul 20 21:58:41 2009 +0000
7  +++ b/file Mon Jul 20 21:58:42 2009 +0000
8  @@ -1,1 +1,2 @@
9   original content
10  +unwanted change

ないhg revertコマンドファイルします

1  $ hg status
2  M file
3  $ hg revert file
4  $ cat file
5  original content

hg revertコマンドある程度するために.orig きのファイルされたファイル します

1  $ hg status
2  ? file.orig
3  $ cat file.orig
4  original content
5  unwanted change

hg revertコマンドうことのできる以下にまとめますするしま

9.2.1 File management errors

hg revertされたファイルしても有用コマンドですこのコマンドMercurial てのファイルコマンドhg addhg removeなど 実施させます

ファイルしてhg addったそのファイルMercurial するいことにいたならhg revertによりファイルせますMercurial ファイルにはいませんのでしてくださいファイ しはファイルして だけです

1   $ echo oops > oops
2  $ hg add oops
3  $ hg status oops
4  A oops
5  $ hg revert oops
6  $ hg status
7  ? oops

ファイルしてhg removeったでもhg revert使うことでディレクトリチェンジセッ におけるファイルすることができます

1  $ hg remove file
2  $ hg status
3  R file
4  $ hg revert file
5  $ hg status
6  $ ls file
7  file

これはMercurial さずにしたファイルMercurial ではこのファイル”(missing) ばれるこ とをしてくださいであってもします

1  $ rm file
2  $ hg status
3  ! file
4  $ hg revert file
5  $ ls file
6  file

hg copyされたファイルしをったファイルディレクトリされないでそのまま りますファイルにはしないのでしのMercurial ファイルしてもしませ

1  $ hg copy file new-file
2  $ hg revert new-file
3  $ hg status
4  ? new-file

A slightly special case: reverting a rename

ファイルしてhg renameったえていてしいことがありますhg renameしてhg revert には以下すように更後ファイルしただけではです

1   $ hg rename file new-file
2  $ hg revert new-file
3  $ hg status
4  ? new-file

hg statusコマンドからもわかるようにファイルされていますがファ イルだに除状されていますこれはなくともにとってはしますがいは

1  $ hg revert file
2  no changes needed to file
3  $ hg status
4  ? new-file

hg renameしをうにはファイルすることをれないでください

ちなみにファイルファイルそれからファ イルしてしをったMercurial されたファイ 3 されていないしますファイルするファイルしたいにはファイルから ファイルへのコピれないでください。)

しにおけるこれらのおそらく Mercurial さなバグ由来するものです

9.3 Dealing with committed changes

あるa コミットそのb コミットしたa っていたことにいたとしますMercurial チェンジセットそのものをかったことにするチェンジセットにするための があります

このえておいてしいことがつかありますhg backoutコマンドによるしはする ことでわれるものでありそのものをしたりしたりするものではありませんそのためバグをするのにはいて いますがしといったにはいていませんそのようなしにしては 9.4 してくださ

9.3.1 Backing out a changeset

hg backoutコマンドされたチェンジセット全体ますMercurial できないの このコマンドしたいチェンジセットいたりはしませんそのわりにこのコマンドしたいチェンジセッ によるさせるたなチェンジセットします

hg backoutコマンドですので使ってしますまずはチェンジセットつかリポジトリ します

1   $ hg init myrepo
2  $ cd myrepo
3  $ echo first change >> myfile
4  $ hg add myfile
5  $ hg commit -m ’first change’
6  $ echo second change >> myfile
7  $ hg commit -m ’second change’

hg backoutコマンド“bakc out” とするチェンジセットりますhg backoutコミットメッセくためにテキストエディタしますのでback out するするこ とができますこのでは-m オプションいることでコマンドラインからコミットメッセえていま

9.3.2 Backing out the tip changeset

以下では最後コミットしたチェンジセットback out します

1  $ hg backout -m ’back out second change’ tip
2  reverting myfile
3  changeset 2:b21d3aa081f7 backs out changeset 1:667628b6b938
4  $ cat myfile
5  first change

myfile たないことがおわかりでしょうhg logればhg backoutコマンドったかを できます

1  $ hg log --style compact
2  2[tip]   b21d3aa081f7   2009-07-20 21:58 +0000   bos
3    back out second change
4  
5  1   667628b6b938   2009-07-20 21:58 +0000   bos
6    second change
7  
8  0   4494b9a1bd19   2009-07-20 21:58 +0000   bos
9    first change
10  

hg backout生成したしいチェンジセットback out したチェンジセットチェンジセットとなるしてく ださいした9.3.2  ればこのことがわかるでしょう



[Picture]

Figure 9.1: Backing out a change using the hg backout” command

9.3.3 Backing out a non-tip change

最後コミットしたチェンジセットback out したいhg backoutコマンド--merge オプションしてくださ

1  $ cd ..
2  $ hg clone -r1 myrepo non-tip-repo
3  requesting all changes
4  adding changesets
5  adding manifests
6  adding file changes
7  added 2 changesets with 2 changes to 1 files
8  updating working directory
9  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10  $ cd non-tip-repo

このコマンドチェンジセット素早りのback out できます

1  $ echo third change >> myfile
2  $ hg commit -m ’third change’
3  $ hg backout --merge -m ’back out second change’ 1
4  reverting myfile
5  created new head
6  changeset 3:b21d3aa081f7 backs out changeset 1:667628b6b938
7  merging with changeset 3:b21d3aa081f7
8  merging myfile
9  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
10  (branch merge, don’t forget to commit)

back out myfile にはするることができますがする ることができないでしょう

1  $ cat myfile
2  first change
3  third change

した9.3.3  られるようにこのようなMercurial にはつのチェンジセットコミットしますMercurial コミットしたも4 矩形してあります)。 Mercurial back out めるでのディレクトリにおけるチェンジセット えておきますそのチェンジセットback out チェンジセットとしてコミットします最後ディレクトリ チェンジセットしたコミットします footnote : のようににはコミットされませ



[Picture]

Figure 9.2: Automated backout of a non-tip change using the hg backout” command

としてback out したいチェンジセットによるすためのつかののみをってへのわれます

Always use the --merge option

のところback out チェンジセットtip かにわらず--merge オプションしくしますback out tip いのでしようとはしませんのでhg backoutコマンドするには--merge オプション するべきでしょう

9.3.4 Gaining more control of the backout process

ではback out --merge オプション推奨しましたがそのback out となるチェンジセッ 方法hg backoutコマンド利用することもできますback out する にありませんが方法ることはhg backoutっていることのする 有用ですのためにしたリポジトリしますがここでは back out いませ

1  $ cd ..
2  $ hg clone -r1 myrepo newrepo
3  requesting all changes
4  adding changesets
5  adding manifests
6  adding file changes
7  added 2 changesets with 2 changes to 1 files
8  updating working directory
9  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
10  $ cd newrepo

チェンジセットコミットそのでそのback out したてみましょう

1  $ echo third change >> myfile
2  $ hg commit -m ’third change’
3  $ hg backout -m ’back out second change’ 1
4  reverting myfile
5  created new head
6  changeset 3:3099a8f9eb11 backs out changeset 1:667628b6b938
7  the backout changeset is a new head - do not forget to merge
8  (use "backout --merge" if you want to auto-merge)

たなチェンジセットチェンジセットback out チェンジセットになりますのでそれまで tip だったチェ ンジセット5 ではなくたなヘッドになりますhg backoutコマンドこのことをげるにはっきりとしたメッセしてい ます

1   $ hg log --style compact
2  3[tip]:1   3099a8f9eb11   2009-07-20 21:58 +0000   bos
3    back out second change
4  
5  2   c0b937bbb3d7   2009-07-20 21:58 +0000   bos
6    third change
7  
8  1   667628b6b938   2009-07-20 21:58 +0000   bos
9    second change
10  
11  0   4494b9a1bd19   2009-07-20 21:58 +0000   bos
12    first change
13  

ここでもした9.3.4  ることでどういったにあるのかがいといますこのからhg backoutコマンドtip チェンジセットしたMercurial しいヘッドリポジトリするMercurial によ されたチェンジセット矩形していますことがよくわかります



[Picture]

Figure 9.3: Backing out a change using the hg backout” command

hg backoutコマンドするとディレクトリチェンジセットしい “backout” チェンジセットなります

1  $ hg parents
2  changeset:   2:c0b937bbb3d7
3  user:        Bryan O’Sullivan <bos@serpentine.com>
4  date:        Mon Jul 20 21:58:21 2009 +0000
5  summary:     third change
6  

このつのしたのまとまり6 します

1  $ hg heads
2  changeset:   3:3099a8f9eb11
3  tag:         tip
4  parent:      1:667628b6b938
5  user:        Bryan O’Sullivan <bos@serpentine.com>
6  date:        Mon Jul 20 21:58:21 2009 +0000
7  summary:     back out second change
8  
9  changeset:   2:c0b937bbb3d7
10  user:        Bryan O’Sullivan <bos@serpentine.com>
11  date:        Mon Jul 20 21:58:21 2009 +0000
12  summary:     third change
13  

このmyfileはどのようなであることがされるかをえてみましょうback out していませんから それにするしていなければなりませんback out しましたのでそれにするしていなければな りませんヘッドとしてされているようにするmyfile してはなりませ

1  $ cat myfile
2  first change
3  second change
4  third change

ファイルむにはつのヘッドをいつものようにすればいのです

1  $ hg merge
2  merging myfile
3  0 files updated, 1 files merged, 0 files removed, 0 files unresolved
4  (branch merge, don’t forget to commit)
5  $ hg commit -m ’merged backout with previous tip’
6  $ cat myfile
7  first change
8  third change

することでリポジトリ9.4  すようになります



[Picture]

Figure 9.4: Manually merging a backout change

9.3.5 Why “hg backout” works as it does

hg backoutコマンドいをにまとめると以下のようになります

  1. ディレクトリクリhg statusであることをします
  2. そのでのディレクトリチェンジセットえておきます以下このチェンジセットorig します
  3. ディレクトリback out チェンジセットするためにhg update同等います 以下このチェンジセットbackout します
  4. backout チェンジセット調べます以下このチェンジセットparent します
  5. backout チェンジセットするファイルしてhg revert -r parent backout チェンジセットコミットされるします
  6. しいチェンジセットとしてコミットしますこのチェンジセットbackout です
  7. コマンドライン--merge されていたしいチェンジセットorig そのコミッ します

ディレクトリすことなくhg backoutコマンドるもうつの方法back out される チェンジセットしてhg exportすることでdiff ファイルさせる--reverse オプション したpatch コマンドいることですこの方法じるでしょうがしませ

hg backoutupdatecommitmerge およびcommit うのはback out チェンジセット現在tip てのチェンジセットるための機会Mercurial えるためで

えばプロジェクトから100 リビジョンチェンジセットback out しようとしたpatch パッチ するコンテキストback out とのにあるチェンジセットしてしまうかもしれない このがわからない12.4  patch するしてくださいのでpatch コマンド diff できることはできませんMercurial ファイルディレクトリファイ バイナリファイルといったpatch コマンドうことのできないものもうことができま

9.4 Changes that should never have been

そうとしたどはhg backoutコマンド利用ですhg backoutコマンドチェンジ セットコミットからそれをしたしてします

しかしですがリポジトリしてしくないコミットしてしまうかもしれませんえば ファイルオブジェクトファイルコミットしてしまうようないのでとみなされますオブ ジェクトファイルにははありませんしサイズきいですからリポジトサイズみにする してしまいます

XXXXXXXXXX Before I discuss the options that you have if you commit a “brown paper bag” change (the kind that’s so bad that you want to pull a brown paper bag over your head), let me first discuss some approaches that probably won’t work. XXXXXXXXXX

Mercurial なものてのするされる としていますので チェンジセットしてであってもそれをすることははできません9.1.2  べますがhg rollbackコマンド使できるのはコミットしたリポジトリhg pushhg pullもされていな だけです

チェンジセットリポジトリhg pushしてしまったでもhg rollbackコマンドによりカルリポジ トリでそのチェンジセットすることはできますがそれはおそらく本来やりたかったことではですリポジトリには チェンジセットけますのでみをったにはそのカルリポジトリれるかも しれません

このようなしたどのリポジトリチェンジセットしているかをしているならそれらての ポジトリからのチェンジセットみることがですこれはではありませんたっ つでもねたリポジトリがあればたれたままのチェンジセットしてしまうでしょ

したいチェンジセットつかのチェンジセットコミットしてしまった選択られ てしまいますMercurial チェンジセットをつけないままでけるしていませ

XXX This needs filling out. examples ディレクトリhg-replay スクリプトしますがチェンジセット いませんきです

9.4.1 Protect yourself from “escaped” changes

カルリポジトリコミットしたつかのチェンジセットhg pushないしhg pullによってそれらがリポジトリ されたからといってそのことずしもというわけではありませんあるチェンジセットしてあら かじめすることもですリポジトリからhg pullするような です

リポジトリつかのフックされるチェンジセットうようにする10  してくださいこと あるチェンジセットリポジトリされないようにすることができますであれば リポジトリできなくなるためこのようなチェンジセットますなおいことにこの としません

えばチェンジセットコンパイルかどうかをする incoming フックうっかり ビルドできなくしてしま ことをできます

9.5 Finding the source of a bug

バグをもたらしたチェンジセットback out できるのはなのですがどのチェンジセットback out すべきかをってい がありますMercurial にはチェンジセット実施するbisect ばれる あります

チェンジセットによるいにをもたらすのでそのテストによりそれをすることができる いうのがbisect ですどのをもたらしているのかはわからなくてもバグ有無する方法はわかる でしょうbisect バグとなったをもたらしたチェンジセットすのにあなたのテストプログラム使 します

bisect 方法しやすいようにつかのシナリオします

これらのからbisect バグすだけのものでないことはらかでしょうそのするテストけるな リポジトリにおけるスツリファイルするではせないすこ とができます

利用Mercurial のそれぞれがにおいてどの部分うのかをはっきりとさせるためにここでもう をしましょうテスト(test) とはbisect チェンジセット選択する利用するものです調(probe) あるリビジョンするためにbisect するものです最後“bisect” というbisect いた としておよびとして使します

する方法つがてのチェンジセット調するですしかしながらこのには ラビリティがありませんつのチェンジセットテスト10分必リポジトリチェンジセットがあったとすると 徹底的調するではバグをもたらしたチェンジセットつけるのに35  です500 チェンジセットできるとしてもバグをもたらしたチェンジセットつけるのにはそれでもなお40

bisect するチェンジセットしてこのばれますできるよう プロジェクトする利用しますこの方法によりテストあたりの10かるとしても チェンジセットするわります500チェンジセットできるならば できるでしょう

bisect Mercurial されているプロジェクトかれをわかっていますのでリポ ジトリにおけるかれヘッドいもありません調かれ全体 9 ことが できるためbisect することができるのです

9.5.1 Using the bisect extension

ここではbisect しますMercurial 便するためにbisect としてされますその ためにしなければそのされませんbisect にするには、(しないには hgrc  セクションヘッダ

1  [extensions]

いてbisect するためのをこのセクションしま 10

1   hbisect =
: bisect hくのはっていませんこののは Mercurial Python されていてPython ライブラリbisect使しているためですって hbisectから hしたhgrcファイル スペルするまではMercurial Python bisect パッケ つけそれを Mercurial として利用しようとしてクラッシュけることで しょう

bisect して利用するためにリポジトリしましょう

1  $ hg init mybug
2  $ cd mybug

によってつかの些細そのバグつようにするという方法バグった プロジェクトシミュレションいますこの50 チェンジセット生成それぞれがつのファイルリポジトリ しますここではファイル“i have a gub” というテキストんでいることをもってバグとみなしま

1  $ buggy_change=22
2  $ for (( i = 0; i < 35; i++ )); do
3  >   if [[ $i = $buggy_change ]]; then
4  >     echo ’i have a gub’ > myfile$i
5  >     hg commit -q -A -m ’buggy changeset’
6  >   else
7  >     echo ’nothing to see here, move along’ > myfile$i
8  >     hg commit -q -A -m ’normal changeset’
9  >   fi
10  > done

それではbisect 使方法しましょうbisect してもMercurial help 使 きます

1  $ hg help bisect
2  hg bisect [-gbsr] [-c CMD] [REV]
3  
4  subdivision search of changesets
5  
6      This command helps to find changesets which introduce problems. To
7      use, mark the earliest changeset you know exhibits the problem as
8      bad, then mark the latest changeset which is free from the problem
9      as good. Bisect will update your working directory to a revision
10      for testing (unless the -U/--noupdate option is specified). Once
11      you have performed tests, mark the working directory as good or
12      bad, and bisect will either update to another candidate changeset
13      or announce that it has found the bad revision.
14  
15      As a shortcut, you can also use the revision argument to mark a
16      revision as good or bad without checking it out first.
17  
18      If you supply a command, it will be used for automatic bisection.
19      Its exit status will be used to mark revisions as good or bad:
20      status 0 means good, 125 means to skip the revision, 127
21      (command not found) will abort the bisection, and any other
22      non-zero exit status means the revision is bad.
23  
24  options:
25  
26   -r --reset     reset bisect state
27   -g --good      mark changeset good
28   -b --bad       mark changeset bad
29   -s --skip      skip testing changeset
30   -c --command   use command to check changeset state
31   -U --noupdate  do not update to target
32  
33  use "hg -v help bisect" to show global options
34  $ hg bisect help
35  abort: unknown revision ’help’!

bisect んでします以下のようにみます

  1. テストします
  2. bisect えられたテストすべきチェンジセットします
  3. bisect ディレクトリをそのチェンジセットしますのでしま

テストから した一意チェンジセットbisect できたこの します

たってはhg bisect initコマンドです

1  $ hg bisect init
2  (use of ’hg bisect <cmd>’ is deprecated)

使するテストなものでリポジトリれかのファイル“i have a gub” んでいるか しますんでいるそのチェンジセットバグとなるチェンジセットですとなる ているチェンジセット“bad”っていないチェンジセット“good” びますくのディレクトリして いるリビジョンtipバグチェンジセットによりえているものですからこれを “bad” とみなしま

1  $ hg bisect bad
2  (use of ’hg bisect <cmd>’ is deprecated)

バグチェンジセットすることですbisect “good” “bad” チェンジセット ってするでしょうではリビジョン 10 にはバグがありません“good” チェンジセット してはほどがあります)。

1   $ hg bisect good 10
2  (use of ’hg bisect <cmd>’ is deprecated)
3  Testing changeset 22:2ce2f0f89efb (24 changesets remaining, ~4 tests)
4  0 files updated, 0 files merged, 12 files removed, 0 files unresolved

コマンドには以下があります

早速ディレクトリテストをしてみましょうgrep 使してディレクトリ“bad” ファイル有無調 ファイルければそのリビジョン“good” です

1  $ if grep -q ’i have a gub’ *
2  > then
3  >   result=bad
4  > else
5  >   result=good
6  > fi
7  $ echo this revision is $result
8  this revision is bad
9  $ hg bisect $result
10  (use of ’hg bisect <cmd>’ is deprecated)
11  Testing changeset 16:bfafabfda31c (12 changesets remaining, ~3 tests)
12  0 files updated, 0 files merged, 6 files removed, 0 files unresolved

このテストできそうですのでシェルにしてしまいましょう

1  $ mytest() {
2  >   if grep -q ’i have a gub’ *
3  >   then
4  >     result=bad
5  >   else
6  >     result=good
7  >   fi
8  >   echo this revision is $result
9  >   hg bisect $result
10  > }

これでテスト全体mytest コマンドできます

1   $ mytest
2  this revision is good
3  (use of ’hg bisect <cmd>’ is deprecated)
4  Testing changeset 19:fcf0466d2d19 (6 changesets remaining, ~2 tests)
5  3 files updated, 0 files merged, 0 files removed, 0 files unresolved

テストされたコマンドをあと回起することでされます

1  $ mytest
2  this revision is good
3  (use of ’hg bisect <cmd>’ is deprecated)
4  Testing changeset 20:53bd36dcbf3f (3 changesets remaining, ~1 tests)
5  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
6  $ mytest
7  this revision is good
8  (use of ’hg bisect <cmd>’ is deprecated)
9  Testing changeset 21:a01fa4c0a57b (2 changesets remaining, ~1 tests)
10  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
11  $ mytest
12  this revision is good
13  (use of ’hg bisect <cmd>’ is deprecated)
14  The first bad revision is:
15  changeset:   22:2ce2f0f89efb
16  user:        Bryan O’Sullivan <bos@serpentine.com>
17  date:        Mon Jul 20 21:58:25 2009 +0000
18  summary:     buggy changeset
19  

40 チェンジセット全体にもわらずbisectはわずかテストバグをもたらしたチェンジセット きました調チェンジセットしてbisect テストするのでチェンジセット ただけテストする よりも有利です

9.5.2 Cleaning up after your search

リポジトリにおけるbisect 使わったなら使していたhg bisect resetコマンドによりするこ とができますbisect はそれほどくのするわけではありませんのでこのれてもにはなりませ しかしhg bisect resetするまではbisect はそのリポジトリさせてくれませ

1  $ hg bisect reset
2  (use of ’hg bisect <cmd>’ is deprecated)

9.6 Tips for finding bugs effectively

9.6.1 Give consistent input

bisect には実施したてのテストしくされなければなりませんテストしてい たにもわらずテストbisect えたしたすかもしれませんテスト してされたbisect チェンジセット“good” でも “bad” でもあるってきます しかしこのわれるわけではないのでったチェンジセットバグとしてするでしょ

9.6.2 Automate as much as possible

bisect 使めたのためのテストコマンドラインしていましたがなくともにはこの みませんbisect 使したしいいつもいのためにをやり ていることにきました

bisect していたにはさなリポジトリにおけるであってもしていましたテスト であったりbisect するテストえればそれだけテストにおけるミスまります ストするようになってられています

テストのためのつあります

ではgrep コマンドにより症状調べていてif ステトメントけてhg bisectコマ ンドえることをしていましたmytest これらを再現しやすいしたことでてのテスト れたものになっています

9.6.3 Check your results

bisect によるえた程度にしかしくないのでbisect により “good” されたチェンジセット絶対 しいものとみなさないでくださいクロスチェックする方法以下のようなチェンジセットのそれぞれに テストしてみることです

9.6.4 Beware interference between bugs

あるバグバグによりさせられるもありますえばリビジョン 100 ソフトウェアクラッシュ リビジョン 50 ではしくしていたとしますあなたのらないソフトウェアクラッシュさせるバグ リビジョン 60 れてしまいそれをリビジョン 80 したなんらかの方法させるかもしれませ

バグによってしているバグされるかもしれずしているバグがその機会 バグしているえますバグしたテストえばそのバグプロジェクトビルドするなどの できないためにチェンジセットにおけるバグ有無できないbisect けをけること はできませんそのわりバグするチェンジセットくことででのいましょ

バグするテストでないにはますプログラムクラッシュバグ有無 しているソフトウェアクラッシュさせる全然ないバグによりであるバグされてしまいともじも のとみなされるためにbisect わされてしまいます

9.6.5 Bracket your search lazily

におけるとなる “good” および “bad” チェンジセット選択なことですがそうであっても がありますbisect からチェンジセットでは “bad” 最古チェンジセット “good” です

bisect 使たって “good” にふさわしいチェンジセットがどれかをすのがしいにはでたらめにテストするの くはないでしょうどうあってもバグせないえばバグするがまだされていないものや したようにバグしてしまうようなものをテストチェンジセットからするのをれないようにし ましょう

チェンジセットないしのものがだったとしてもいのお bisect 実施しなければならないえるだけです