2つの言葉で: git bisect
線形履歴により、バグの実際の原因を特定できます。
例。これが最初のコードです:
def bar(arg=None):
pass
def foo():
bar()
ブランチ1は、arg
無効になったリファクタリングを実行します。
def bar():
pass
def foo():
bar()
ブランチ2には、使用する必要がある新しい機能がありますarg
。
def bar(arg=None):
pass
def foo():
bar(arg=1)
マージの競合はありませんが、バグが導入されています。幸いなことに、この特定のものはコンパイルの段階でキャッチされますが、私たちは必ずしもそれほど幸運ではありません。バグがコンパイルエラーではなく予期しない動作として現れる場合、1〜2週間は見つからない可能性があります。その時点でgit bisect
、救助に!
やばい。これは見たものです:
(master: green)
| \_________________________
| \ \
(master: green) (branch 1: green) (branch 2: green)
| | |
| | |
(master/merge commit: green) |
| ______________/
| /
(master/merge commit: red)
|
...days pass...
|
(master: red)
したがってgit bisect
、ビルドを中断したコミットを見つけるために送信すると、マージコミットが特定されます。まあ、それは少し役立ちますが、それは本質的に単一のコミットではなく、コミットのパッケージを指しています。すべての祖先は緑です。一方、リベースでは、線形の履歴が得られます:
(master: green)
|
(master: green)
|
(all branch 1 commits: green)
|
(some branch 2 commits: green)
|
(branch 2 commit: red)
|
(remaining branch 2 commits: red)
|
...days pass...
|
(master: still red)
さて、git bisect
ビルドを壊した正確な機能のコミットを指し示すつもりです。理想的には、コミットメッセージは、別のリファクタリングを行ってすぐにバグを修正するのに十分な意図を説明します。
メンテナーがすべてのコードを作成しなかった場合、その効果は大規模プロジェクトでのみ悪化するため、特定のコミットが行われた理由/各ブランチの目的を必ずしも覚えていません。そのため、正確なコミットを正確に特定する(そして、その周りのコミットを調べることができる)ことは大きな助けになります。
とはいえ、私は(現在)まだマージを好んでいます。リリースブランチにリベースするとgit bisect
、日々の作業の真の履歴を保持しながら、で使用する線形履歴が得られます。