2016-06-27 13 views
1

状況 に依存アップデート枝私は絵が良いの説明だと思う:のgit:お互い

enter image description here

あなたが見ることができるように、我々はいくつかの枝を持って、solution-xyz-fooそれらのほとんど変化させるための数字xyzsolution-12solution-11などを基にしています。このルールからのいくつかの逸脱もある。支店hystrix-dashboard-demo

モチベーション ブランチのコードは、コースの参加者がクラスルームスタイルのコースで使用します。そのため、参加者は演習を解決し、コースの最後には、solution-24ブランチで提供されたコードに似たコードが完成します。 参加者が超越したり、他の問題に直面した場合、彼は簡単に対応する支店をチェックアウトし、残りの演習を続けることができます。

また、1回のコミットとして提供される各エクササイズの解決策を見ることができます。

言い換えれば、コース参加者にとっては、お互いの上に構築された支店/ソリューションは、私たちが保持したいと考えている大きな利点を提供します(これは、これまで開催された複数のコースのフィードバックに基づいています)。

コースの開発者(演習とソリューションの準備、参加者へのコンテンツの提示など)では、コードの一部を時々更新する必要があります。たとえば、solution-3に問題を修正したい場合があります。 solution-4などでこの修正を表示するには、修正を含むコミットをmerge/rebase/cherry-pickする必要があります。巨大な混乱を避けるために、各ソリューションのすべてのアップデートを1回のコミットにまとめ、いくつかのリベースを使用して画像に示したやや線形の構造を再構築することにしました。

問題 あなたが推測したように、リベースを行うことは多くの作業です。ヘルパースクリプト(リベース後にコミットにブランチを再接続するが、ブランチ名が新しく/変更された場合にはそれを維持する必要がある)でも、リベースを行い、コンフリクトを修正し、ブランチを再接続し、変更を強制的にリポジトリにプッシュします(強制的なプッシュを使用して)。

実際の作業に加えて、これはたくさんのgit経験を持つチームメンバーだけが自信を持って行うことです。言い換えれば、自信を持っていない人は、私が明確に理解している手順について不平を言う。

gitの明白な利点は失われます。変更履歴はなく(古いバージョンは失われています)。さらに、開発者は協力して変更をコードに伝える必要があります。

質問 次の問題を解決するANYタグ/ブランチ/リベース/ ...ワークフローをお勧めしますか? (現在、Eclipseのマウスを使ってこれを行うことは好ましい方法であるEDIT)は、各エクササイズのための

  • ソリューション

    • コースの参加者は、簡単に、彼らが現在取り組んでいる運動のための最新のソリューションをチェックアウトすることができます便利な方法で提供されています。また、その上に、後のソリューションの構築が変更履歴が、注意点として

    を保持しているに応じて

  • [オプション]が更新されるように、単一
  • )コミット開発者が簡単に個々のソリューションに修正と更新を統合することができますコースの進行中にコードが変更されないと仮定することができます(参加者のコンピュータではgit remote updateは必要ありません)。

  • 答えて

    1

    それぞれの 'solution-xyz-foo'コミットに別々のブランチとしてアクセスするのではなく、チェーン内で検索された祖先コミットとしてアクセスしてみてください。

    git checkout -b MyWorkingBranch remotes/origin/LAST_COMMIT_IN_COURSE^\{/solution-xyz\} 
    

    し、 'IMPROVED_COMMIT --ontoリベース' にチェックアウト以降のはIMPROVED_COMMIT

    に基づいて枝を生成しますあなたの代わりに枝のタグを使用している場合、あなたは

    を使用することができます

    git help revisions 
    

    を見ます

    git filter-branch --tag-name-filter <rename command> 
    

    変更されたすべての通信を参照するすべてのタグを更新するその。 'git help filter-branch'を参照してください。再び学生は、 'git checkout -b TAGNAME'を使ってタグ名から直接分岐を得ることができ、履歴が利用可能になります。

    +0

    これは有望です。私は、この問題は参加者の側で有用性であることを恐れています(Eclipseのgit)。私はそれを明日試してみるよ、ありがとう! –

    +0

    'tag-name-filter'を使うと、既存のタグの名前だけを更新することができるので、実際のrebaseを行うには' filter-branch'の魔法を追加する必要があります。代わりに、私はまず最初にリベース(変更の最上位にコミットしたもの)を実行してから、小さなタグを付けてリビジョンのトリックを使ってタグを付けてください。 –

    0

    チェーンの途中で外科的なrebaseのように聞こえるので、いくつかのコミットを修正した後、(以前の)コミットをもう一度rebaseします。だから私はコメント "と混乱している...(たとえリベース後にコミットにブランチを再接続するが、新しい/変更されたブランチ名の場合には維持する必要がある)ヘルパースクリプトでも..."。これは、おそらくリベースと同じくらいシンプルなようです(更新されたコミットに新しい/変更されたブランチ名のためにそれを維持する必要はありません)。そのすべてのものはリベースで運ばれますか?

    +0

    私が最初にやったことはあなたの説明です。現在のアプローチは、1つのrebase(fixed commitの上に 'solution-24')を実行し、' solution-23'を 'solution-24 ^'、 'solution-22'を' solution-23^'などです。これはヘルパースクリプトの動作です。問題は、リベース後に下位のブランチを更新することです。 –

    +0

    解決策-Xに対するバグ修正がある場合、そのコミットに変更を加え、元の解決策-Xで変更されたスカッシュをリベースして、解決策-X 'コミットを得ることができます。今度は、ソリューション(X + 1)をSolution-X 'にリベースすると、すべてのSolution-(X + N)が最初のステップで加えた変更を取得します。すべてのSolution-(X-N)(Solution-Xの前から)はおそらく修正を必要としないので、そのまま残します。そうでなければ、私はあなたがしようとしていることをはっきりと理解しておらず、そのまま放置しておきます。 – DavidN

    +0

    私はあなたの興味に感謝します!私がsolution-9を更新されたsolution-8ブランチの上にrebaseした場合、only-solution-9(そしてもちろん-8のsolution)は正しいです。 Solution-10は、ソリューション9および8に対応する古いコミットを修正せずに依然として指しています。そのため、ソリューション8(9,10、...、24)に続いてすべてのブランチをリベースする必要もあります。編集:Nの値を増やすためにリベースを繰り返すと、下位のソリューションコミット(各リベースごとに1つずつ表示されます)のコピーが複数作成されます。これは段階的にリベースすることで回避できます。 –

    関連する問題