7

分岐しているコミットを削除するにはどうすればよいmasterですか?

非常に豊富なコミット履歴(および私のコードよりも前のもの)とともに、大きなライブラリをGitサブツリーを介してサブディレクトリに追加しました。その履歴全体をさかのぼってつぶしたいのですが、それでもライブラリへの新しいコミットにマージすることができます

いろいろ組み合わせてみgit rebaseましたが、期待通りの結果が得られませんでした[*]。

私のリポジトリは次のようになります。

A---B-----------F---G master
               /
  ... C---D---E

そして私はそれが次のように見えることを望みます:

A---B-----------F'--G' master
               /
              E'

また:

A---B-------E'--F'--G' master

[*]:

  • git rebase --onto C E master
  • git checkout F; git rebase --onto C E master
4

1 に答える 1

1
  1. これは履歴編集です。あなたは次のようなものになってしまいます

    A---B-----------F'---G' master
                   /
                  E'
    
  2. Gitはあなたの歴史と図書館の歴史の間に共通の親を見つけることができないため、この後はマージが問題になります。

  3. 実際にそれを行うには、

    1. Bにリセットします(Gのタグまたはブランチを作成して維持します)
    2. とマージを実行し--no-commitます。
    3. ここでGをリベースまたはチェリーピックします(G'になります)

    歴史は次のようになります

    A---B-----------F'---G'
    

ライブラリのシャロークローンを作成するには、次のような操作を行う必要があります(警告:テストされていません)。

  1. F(含まない)からG(含む)へのコミットをパッチに保存します(git format-patch F --stdout > ~/saved_commits.patch
  2. Bにリセットします。F、E、またはGにポッティングしているブランチがないことを確認します
  3. ref名前空間と一緒にリモートを削除しますgit remote rm
  4. reflogを消去します。git reflog expire --expire=now --all
  5. 実際にgitから物事を削除します:git gc --prune=now。これで、リポジトリが縮小されたことがわかります。
  6. ライブラリのリモートを再度追加します。
  7. git fetch --depth=10 libraryremote
  8. マージを繰り返します(通常の方法)
  9. 保存されたコミットを適用します(git am ~/saved_commits.patch)。

サブモジュールソリューション(おそらく最良のオプション)に移行するには、サブモジュールをマージしてセットアップする前の状態にロールバックし、各マージをサブモジュールの変更されたcommit-idに置き換える必要があります。プロジェクトディレクトリをサブモジュールに分割する場合とは異なり、これに対する自動化されたソリューションはわかりません(ただし、同様の方法で実装できます)。

于 2012-02-27T21:55:14.740 に答える