3

技術書を書いています。それは私が本を通して構築したサンプルプロジェクトを持っています。もちろん、通常の方法でgitを使用しても問題はありません。

しかし、ソフトウェアの新しいバージョンが出たとき、それはコードの最初のどこかで小さな変更を意味する可能性があります...最初に生成されたコードの小さな変更。たとえば、2番目のチェンジセットでその変更を行い、例全体に反映させるにはどうすればよいですか?

または、第2章で変数名を変更することもできます。これ、以降のすべての章の例で広める必要があります。

おそらくこれをやってのけるために使用できるgitトリックがあるので、私は役に立つヒントに耳を傾けています。

4

3 に答える 3

3

「commit」が「chapter」(または同様のもの)に対応するようにGitリポジトリを配置しているようです。chapter-x各リビジョンが次のタグ名でタグ付けされていると想定します。

まず、変更する章に戻ります。

git checkout chapter-2

コードに変更を加えてコミットし、元のchapter-2コミットを修正します。

# edit file here
git add test.c
git commit --amend

chapter-2新しい修正されたコミットを指すようにタグを更新します。

git tag chapter-2

本の最後に戻ります。

git checkout master

そして最後に、新しい ものに対してリベースしchapter-2ます:

git rebase chapter-2

これにより、第3章以降が書き直され、第2章で行った変更に基づいたものになります。これを行うと多くの競合が発生する可能性があることに注意してください(特に、後の章で、第2章で変更したものを含むコードを変更した場合)。 )。Gitは役に立ちますが、残念ながらすべての作業を行うことはできません。

于 2012-11-08T20:14:56.180 に答える
3

さて、あなたは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は前のステップの更新にマージされます。

于 2012-11-08T20:24:15.527 に答える
1

この方法で履歴を変更するための一般的なツールはgit rebase -iです。注意点が1つあります。最初のコミットを書き換えるために使用することはできません。開始するコミットを指定する必要があるためです(これは除外されます)。

実行; これにより、コミットを一覧表示するエディターが表示されます。変更する必要のあるコミットでコマンドを「編集」に変更し、保存して終了します。git rebase -i startcommit

その後、リベースは指定したコミットを「修正するために停止」します。必要なコード変更を行うか、で適用するgit commit --amendか、必要に応じて新しい追加のコミットとしてコミットします。変更が完了したら、git rebase --continue;を実行します。これにより、既存の「後の」コミットがすべて適用され、競合を解決する必要がある場合は停止します。

後で、ビューアを使用して履歴gitkを確認することを強くお勧めします。たとえば、全体像が希望どおりであることを確認します。また、最終バージョンを古い最終バージョンgit diff master@{1} master(または使用するブランチ名)と比較することもできます。

于 2012-11-08T20:28:32.103 に答える