2

私は本のサンプルアプリケーションを書いています。

重要なコミットはすべてタグ付けされているため (Ch01_Ex04、Ch03_Ex01 など)、読者は関心のあるアプリケーションの状態をすぐに確認できます。

ときどき、例で行ったことについて気が変わって、時間をさかのぼってクラス名などを変更したいと思います。すべてのタグをリセットする必要なく、特定のコミットからその変更を適用したい。

私が持っているとしましょう:

 Tag1    Tag2    Tag3
  |       |       |
- A - B - C - D - E
                  |
                 HEAD

ここで、B と C の間で変更を加えたいので、B から分岐して変更を行います。

 Tag1    Tag2    Tag3
  |       |       |
- A - B - C - D - E
       \          |
        F        HEAD

私が行きたいのは:

 Tag1        Tag2    Tag3
  |           |       |
- A - B - F - C - D - E
                      |
                     HEAD

これを行う方法が頭に浮かびません。方法はありますか?

4

2 に答える 2

3

時間をさかのぼって、たとえばクラス名を変更したいと思います。すべてのタグをリセットする必要なく、特定のコミットからその変更を適用したい。

 Tag1    Tag2    Tag3
  |       |       |
- A - B - C - D - E
                  |
                 HEAD

私が行きたいのは:

 Tag1        Tag2    Tag3
  |           |       |
- A - B - F - C - D - E
                      |
                     HEAD

Git の最も強力な保証は、誰もそれを行うことができないということです

誰もが変更された履歴を即座に検出することなく、履歴にコミットを挿入したり、履歴にその他の変更を加えたりすることは、単に不可能です (「数学」、特に暗号化ハッシュ関数の背後にある数学のため)。

あなたが得ることができる最も近いのは

 Tag1        Tag2    Tag3
  |           |       |
- A - B - F - C*- D*- E*
                      |
                     HEAD

ここC*で、、、D*およびは、ハッシュ コードを除いて、ほぼ同じコミット メッセージ、作成者、日付E*などの新しいコミットです。つまり、タグをリセットする必要があります。git は、この規模での書き換えを容易にするための努力を惜しみません。 CDE

リンクされた@Joeの回答は、フィルターブランチが履歴の書き換えを完了した後、孤立したタグを移動する方法を示します。

ただし、問題に対する別の解決策を検討することをお勧めします。

私が理解しているように、「Ch01_Ex04」などの現在のバージョンを人々が簡単に見つけられるようにしたいのですが、執筆が進むにつれてそれらは変更される可能性があります。完全に合理的なもの。つまり、タグはそのための適切なソリューションではありません。それらは、特定の固定された履歴コンテンツの配布を識別するために存在します。

特定の役割を果たしているコンテンツの現在のコミットを特定するには、コミットメッセージ自体にステータスを直接入れて、タグ名でコミットを参照するのではなく、そのコンテンツで特定するのが最善の方法ですgit show':/^===Ch01_Ex04==='。メッセージが始まる現在のブランチの最新のコミットを表示します===Ch01_Ex04===

于 2014-04-26T07:52:37.297 に答える