2016-09-20 8 views
1

私はgitを初めて使っています。 私はリモートからリポジトリをローカルにフォークしています。これはlocalRepoと呼ばれています。 MasterとtestBranchの2つのブランチがあります。 testBranchは100コミット、5000コミットは遅れています。 TestBranchに変更が加えられましたが、Masterには組み込まれませんでした。だから、私は自分の分かれたlocalRepoでmasterにtestBranchをrebaseしたいと思っていました。git rebaseの代わりに

私は次のようでした

  1. git checkout testBranch
  2. git fetch origin
  3. git rebase origin/Master

私はいくつかの紛争を経験していると私はmergetool(KDiff3のを)使って手でと言って、それを解決していますどのファイルを削除または変更して使用するかなど...

約5000回コミットするので、より多くの競合が発生する可能性はありますか?このように手動で競合を解決すれば、何日かかるのだろうかと思います!非常に退屈で実用的ではないでしょう。

正しい方法でやっていますか?

このシナリオではこれが唯一の方法ですか?または他の効率的な方法?

答えて

3

いいえ、リベースに代わる方法はありません。それが現実さ。レッスンで学んだことは、早期に再分類し、頻繁に再分類することです。あなたのコミットを取り戻すことは、遅かれ早かれ多くの時間を無駄にすることを意味します。 2年前に、私は書いて、6カ月のコースで開発された200-commitフィーチャーブランチをマージしました。 6ヶ月間にどのくらいのコミットがマージされたのか分かりません。しかし、私は彼らも数千人もいると確信しています。私のフィーチャーブランチを終え、リベースするまで待っていたのであれば、大変なことになるだろう。しかし、私は毎日リベースしました。そして最終的な合併は、大きくて、脂肪の多い、何もないバーガーであることが判明しました。

フィーチャーブランチ内のコミットを論理的に小さなチャンクに分割できる場合は、リベースをフェーズに分割することができます。フィーチャーブランチの何百ものコミットにいくつかのメジャーチェックポイントがあり、フィーチャーブランチが完全に機能しテスト可能な各ポイントでは、すべてのコミットをチェックポイントまで持ってきて、それらをリベースしてテストすることを検討するかもしれません。次に、リベース後にコミットの最初のチャンクが動作していることをテストしたら、次のチェックポイントまでコミットを再処理します。

すべてを一度にリベースすると、rebitに失敗したコミットごとにgitが停止します。少なくともこの方法では、プロセスをより詳細に制御できます。あらかじめ決められたチェックポイントで停止して一時停止し、リベースされた変更について広範な回帰テストを行い、次に進むことができます。

しかし、これが機能するには、機能ブランチ上のすべてのコミットを追跡するのに完璧でなければならないことに注意してください。どちらがリベースされているか、どちらがリベースされていません。

+0

ありがとうございました。これらの情報は私にとって非常に役立ちます。 – vishnu

+0

私はフォローアップの質問を投稿しました。もしあなたもそれを見ることができたら助けになるでしょう。 (http://stackoverflow.com/questions/39615448/check-git-rebase-done-or-not) – vishnu

+0

機能ブランチが他の誰と共有されるのはどうですか?私。それは公開されていますか?リベースはまだ正しい方法でしょうか? – Nickpick

2

代わりにmergeを使用できます。

mergeの長所は:一つは、なくする(競合場所は行番号の点で同じであってもよい)のみtestBranchの現在最終状態とmasterの現在の状態との間の累積非互換変更を解決しなければなりません新しいコミットmaster(これはrebaseの動作です)の上にあるtestBranchの各コミットを再適用します。 mergeの短所:履歴グラフはより複雑になります。そのような複雑なグラフ、特に単純な木のような履歴グラフを持つ「レガシー」VCSから移行されたものは嫌です。

時にはtools like git rerere助けてください。特に反復的な競合のセットを扱うときは助けてください。しかし確かにそれは銀色の弾丸ではありません。

また、@SamVarshavchikのアドバイスに従ってください:天気の良い朝に何千もの線が衝突するのではなく、あなたのフィーチャーブランチで上流の変化と定期的なトラッキングを行う方が良いでしょう。それとも晴れていない、または朝ではない - 実際にはそれは問題ではありません。なぜなら、それを解決するのに数時間、数日、または数週間を費やさなければならないからです。

巨大なフィーチャブランチを小さなピースに分割し、できるだけ早くそれらの変更を上流に戻すことがしばしば役に立ちます。したがって、あなたの同僚はあなた自身のコードとあなたのアプローチを使用し、自分自身のものを発明するのではなく、マージ/リベースはすべての関係者にとってより簡単になります。

また、フィーチャーブランチのコミットの場合でも、プロジェクトで必須のピアコードレビューシステムを使用すると便利です。今日私は、複雑なコードの可能性のあるエラーを、それを主演するだけで追跡する人間の能力について少し懐疑的です。しかし、コードの特定の場所の開発に携わっている少なくともすべての人は、提案された変更について認識しており、異なる支店での取り組みを調整することができます。

+0

洞察力のある考えに感謝します!私はサムが言うように続けるだろう。 – vishnu

+0

ようこそ。 – user3159253

+0

私はフォローアップの質問を投稿しました。もしあなたもそれを見ることができたら助けになるでしょう。 (http://stackoverflow.com/questions/39615448/check-git-rebase-done-or-not) – vishnu