さて、あなたはgitがコミットするときにユーザーに説明するステップを管理しようとしているので、基本的に2次元の履歴があります。1つのディメンションでは、ソフトウェアの新しいバージョン用にプロジェクトを更新したり、例のバグを修正したりするときに、通常のgit履歴があります。別のディメンションでは、読者に説明する手順があります。
O-->O-->O-->O-->O Third edition
^ ^ ^ ^ ^
| | | | |
O-->O-->O-->O-->O Second edition
^ ^ ^ ^ ^
| | | | |
O-->O-->O-->O-->O First edition
^ ^ ^ ^ ^
| | | | |
| | | | Add Step 5
| | | Add Step 4
| | Add Step 3
| Add Step 2
Step 1
ユーザーに説明する各変更は、ブランチである必要があります。例を更新するには、そのブランチをチェックして、変更を加えてコミットします。次に、その例で行った変更が後の手順に反映されるようにするには、後の各例のブランチを順番にチェックアウトし、更新したばかりのブランチにマージする必要があります。リベースは、本のエディションのディメンションに沿った履歴の関係を破棄し、読者がウォークスルーしたステップの履歴のみを保持するため、間違いになります。
ステップ1を更新する必要があり、ステップ3で行う必要のあるバグ修正があるとします。
git checkout step_1
# update step_1
git commit -a -m "update initialization example for v9.0"
git checkout step_2
git merge step_1
git checkout step_3
# bug fix
git commit -a -m "fix bug reported by reader..."
git merge step_2
git checkout step_4
git merge step_3
git checkout step_5
git merge step_4
git tag fourth_edition
>X-->X-->X Fourth edition
/ ^ ^ ^
/ | | |
A-->X B | |
^ ^ ^ | |
| | | | |
O-->O-->O-->O-->O Third edition
^ ^ ^ ^ ^
| | | | |
O-->O-->O-->O-->O Second edition
^ ^ ^ ^ ^
| | | | |
O-->O-->O-->O-->O First edition
コミットBはバグ修正であり、コミットAはステップ1の更新です。Xは前のステップの更新にマージされます。