2

私が最初に VC を始めたとき、私は SVN を使用していましたが、自分が何をしているのか理解していませんでした。1 つのプロジェクトのさまざまな部分を別々のトランクで維持していましたが、一度にすべてのトランクにコミットするため、同一のコミット メッセージで複数のコミットが発生しました。約 2 年前、私は目を覚まし、すべてのトランクを 1 つのトランクにつぶしてから、さらに目を覚まし、レポを git に変換しました。今では、一握りのブランチを備えた高速で柔軟なレポがあり、これ以上ないほど幸せです...

...古い重複したコミットメッセージのすべてが私を悩ませていることを除いて。(私のレポのコミットの約 1/3 から 1/2 を占めています。) これがまさにgit rebase目的ですよね? master重複の 1 つのバッチでテストを実行しようとしましたが、私のブランチが残りのすべてのブランチから分離されているように見えたことを除いて、うまくいきました。私はそれを行いgit rebase -i <sha>、すべての重複コミットを最初のコミットに押しつぶしました。ブランチ構造をそのまま維持したいと思います。

押しつぶしたい重複メッセージはすべて、変換を行う前に送信されsvn=>git、すべてのブランチはその変換後に開始されました。つまり、svn=>git変換前の履歴全体は分岐のない線形です。

もう 1 つの警告 (これは大きな問題です) は、このリポジトリがリモート リポジトリにプッシュされていることです。共有リポジトリの履歴を書き換えるのは悪いニュースであることは知っていますが、リモートからのクローンやフォークをまだ誰も行っていないため、それを検討しているだけです。クローン/フォークに使用できるようにする前に、履歴をクリーンアップしたいと思います。

では、履歴をある時点まで書き換えて、残りをそのままにしておく方法はありますか? この混乱を一掃するのに役立つ他の提案はありますか?

4

1 に答える 1

3

rebase を使用して 2 つの古いコミットを 1 つにまとめることができますが、これは完全に新しいコミットになります。したがって、リベースでは、新しいコミットを指すようにすべての子 (コミットの直後のコミット) を変更する必要があります。これにより、完全に新しいコミットが再び発生します。- 等々...

したがって、古いコミットを変更/リベースすると、完全に新しいコミット グラフが作成されます。他のブランチはまだ古いグラフを指しています。そのため、ブランチを他のすべてのブランチから分離しました。

コミット ブランチの複雑さによっては、クリーンアップが非常に難しくなります。ほとんどの場合、リポジトリをそのままにしておく必要があります。

本当に歴史を変えたいなら 最後の SVN コミットを指す新しいブランチを作成する必要があります。これは、すべてのブランチの親になる必要があります。git tag oldsvn $SHA1; git checkout -b newsvn oldsvn

そのブランチをクリーンアップし、その後、そのブランチの他のすべてのブランチをリベースできます。(これが、ブランチに新しいベースを与えるというリベースの真の考え方です。) でそれを行うことができますgit rebase --onto newsvn oldsvn $branch

おそらく、共通の履歴を共有する複数のブランチを書き換えているため、おそらくブランチごとに異なるツリーが得られるでしょう。Git: How to rebase many branch (with the same base commit) at once? をご覧ください

于 2013-03-02T19:17:36.543 に答える