0

masterdevブランチのあるgitリポジトリがあります。venderサードパーティのライブラリを更新するために使用するベンダーブランチもあります。

今、私はしばらくの間プロジェクトに参加していて、かなりの量の変更をコミットし、サードパーティのコードも数回更新しました。(サードパーティのライブラリに自分の変更を追加することはありません。ソースから更新するだけです)

私が以前やっていたことは:(おそらく間違って)

(dev) $ git checkout vender
(vender) $ git merge dev
(vender) $ ... update third party libraries ...
(vender) $ git commit -am '...'
(vender) $ git checkout dev
(dev) $ git merge vender

このようにして、最初に全体devをにマージしvender、次に更新した後vender、にマージして戻しますdevvenderこれにより、サードパーティのライブラリの更新に関係のないすべての履歴がブランチに取り込まれました。サードパーティのライブラリの更新に関するコミットのみを含めるために、ブランチにログを記録したかったのです。vender

私はマージdevするのが間違っていたと思いますvender(私はgit noobなので、すべてのコードがすべてのブランチにある必要があると思いました)。

私の最初の質問は:

マージdevvenderずに更新を続けても大丈夫ですか(そうするとvender、サードパーティの更新コミットのみを含むログが表示されると思います)

さて、この時点で、私は非常に汚いvenderブランチを持っています-それは私が行ったすべてのコミットを含みdev、サードパーティのコードとは何の関係もありません。venderブランチがサードパーティの更新関連のコミットのみを正しく表示するようにするには、どうすればよいですか?

4

2 に答える 2

1

うん、それは必要ないので、にマージするべきdevvenderはありません。

  1. git stash念のため、保存されていない変更を確認してください。
  2. git reflogブランチの変更など、行ったすべての変更のログを表示します。このログは、過去にさかのぼって実行したすべてのことを示しており、これを修正するための主要なツールです。
  3. を実行したログのポイントを見つけて、そのgit merge dev下の行 (前の行) から SHA を取得します。おそらくcheckout: moving from dev to vendor.
  4. vendorチェックアウトして実行git reset --hard <SHA>すると、すべてが発生する前の場所に戻りvendorます。
  5. サードパーティのライブラリを更新するために行った各コミットのログ行/SHA を見つけ、実行git cherry-pick <SHA>して、そのコミットを の上に再適用しますvender
  6. この時点venderですべて修正されていますが、まだ戻って修正する必要がありますdev
  7. git checkout dev
  8. dev をチェックアウトしたログのポイントを見つけます。これは、おそらく手順 3 で見つけた SHA の前のポイントです。
  9. それを実行git reset --hard <SHA>して、dev をこのすべての前の元の場所に戻します。
  10. git merge vender正しくマージvenderします。dev

この時点で、GitX または gitk を使用して、履歴が適切に見えるようにすることもお勧めします。念のため、これを行う前にバックアップを作成してください:)

サーバーがあると仮定して、これらの変更をまだサーバーにプッシュしていない場合は、手順3.およびの代わりにおよび9.を実行できる場合があります。git reset --hard origin/vendergit reset --hard origin/dev

于 2012-08-20T07:41:28.160 に答える
0

リベースではなくマージを行いましたよね?ベンダー ブランチをクリーンアップするには、git reset <commit>. それが散在している場合(そのように聞こえます)、それは頭痛の種になります.

ベンダー ブランチのコミットと開発者のコ​​ミットを区別する方法はありますか? その場合は、インタラクティブなリベースを試して、悪いコミットを削除できます。のようなものgit rebase -i <commit>があなたを始めさせます。

于 2012-08-20T07:28:37.883 に答える