9

私のラップトップと職場、そして自宅のデスクトップの両方で、6 つの異なるブランチとマージで数週間働いた後、私の歴史は少し複雑になりました。たとえば、フェッチを行った後、master を origin/master とマージしました。ここで、git show-branches を実行すると、出力は次のようになります。

! 【ログイン】ドメイン名を変更しました。
 ! [マスター] リモート ブランチ 'origin/master' をマージします
  ! [migrate-1.9] Heroku での 1.9.1 への移行
   ! [rebase-master] リモート ブランチ 'origin/master' をマージします
----
 - - [master] リモート ブランチ 'origin/master' をマージします
 + + [master^2] 少し再配置とクリーンアップ。
 - - [master^2^] ブランチ 'rpx-login' をマージします
 + + [master^2^^2] 一部のデバッグ ログをコメントアウトしました。
 + + [master^2^^2^] モンキー パッチを適用した Rack::Request#ip
 + + [master^2^^2~2] 各リクエストをログにダンプ
....

これを git rebase でクリーンアップしたいと思います。この目的のために新しいブランチ rebase-master を作成し、このブランチで git rebase <common-ancestor> を試しました。ただし、多くの競合を解決する必要があり、ブランチ rebase-master の最終結果は、既にテスト済みで動作する master の対応するバージョンと一致しなくなりました!

どこかでこれに対する解決策を見たと思ったのですが、もう見つけることができません。誰もこれを行う方法を知っていますか? それとも、既にマージした不要なブランチの削除を開始すると、これらの複雑な参照名はなくなりますか?

私はこのプロジェクトの唯一の開発者であるため、影響を受ける人は他にいません。

4

2 に答える 2

14

複雑な履歴をクリーンアップする最善の方法は、履歴を線形に保つことです。これは、早送り以外のあらゆる種類のマージを回避することによって行います。

仕事の流れはこんな感じです。

$ git checkout -b foobranch
<do stuff>
$ git commit
<do stuff>
$ git commit
...

ブランチをマスターに統合するときは、マージしないでください。代わりに、マスターに対してこのブランチをリベースします。これにより、枝は枝のように見えなくなりますが、木のてっぺんがより成長するだけです。リベース中にマージの競合を解決します。

$ git fetch origin
$ git rebase origin/master

次に、ブランチを master にマージします。これは早送りマージになります。

$ git checkout master
$ git merge foobranch

そして今、作業を上流に進めます。

$ git push
于 2010-07-10T18:02:26.297 に答える
6

ブランチを強制的にプッシュできるリポジトリの通常のプロセス(リモート履歴をリベースによってローカルに作成された新しい履歴に置き換える)は、次のようになります。

git rebase --interactive

ただし、これは、リポジトリからプルするのが1人だけの場合にのみ有効です。その場合でも、一部のローカルブランチを、書き換えられた新しいリモートトラッキングブランチに再初期化する必要があります。

リベースセッションから、必要な種類の履歴を取得するために、Gitコミットとスカッシュ履歴をトリミングできます。

于 2010-06-11T21:35:54.873 に答える