2011-01-11 18 views
2

gitリポジトリの機能バージョンの履歴を維持する最も良い方法は何ですかgit workflow:機能コミットの履歴を維持する

gitで分岐してマージするのはずっと簡単です。私は一般的に、トピックの分岐を使用して、機能が完了したときにマスターにマージするだけにしました。これはうまくいきますが、数回の反復の後にマスターブランチの履歴は複雑なグラフであり、いつでも適切に機能しているアプリケーションのバージョンを表すコミットを特定することは非常に困難になります。

私は、特定の日付に最も近い私のレポの作業コピーを簡単に取得できるワークフローに関するアドバイスを探しています。これのもう1つの便利な機能は、時間の経過とともに変化する機能するリポジトリを表すコミットのリストを取得することです。

これは手作業で行うことができます。つまり、コミットログとメッセージを調べて、次の機能が開始される直前のコミットを見つけるか、コミットごとにテストスイートを実行してフィルタリングします。これらの方法はいくぶん信頼性がありますが、私はそれをやることのあまり危険な方法を探しています。

+0

最終的には、コミットが機能しているかどうかをgitに伝えるのはあなたです。フックを使ってコミットメッセージにその情報を含めるのを覚えているのを助けることができますか?しかし、ある時点でそれに注意する必要があります。 (もしあなたがそれに合っていれば、メモを使うこともできます。) – Cascabel

答えて

4

git log --first-parent masterを使用すると、各コミットの最初の親に続いてmasterの履歴を見ることができます。これは、マージに遭遇したときに、最初の親(マスタの前回のコミットである)のみが追跡され、2番目の親(トピックブランチの最後のコミット)は無視されることを意味します。あなたのワークフローでは、これはおそらくほとんどがマージで構成されます。重要な点は、マスター上で行われたコミット(またはマージ)が機能するバージョンと見なされる限り、このログのすべての単一のコミットが機能するバージョンであることです。

+1

+1マスターをいつも働くように維持するために+1します。ゲリットのようなものは、それを保証するのに役立つかもしれません。 – Thilo

+0

部分的な解決策のようです。マージ時には、最後のマージからメインブランチにコミットされていないので、マージコミットはまったくありません。しかし、この解決策はないよりも優れています。 –

+0

この場合、マージ時に '--no-ff'を使うというポリシーを強制して、常にマージコミットを生成することができます。 –

0

私はあなたが機能ブランチを使用して聞いて超嬉しい - あなたが行く:)

その後、きちんと物事を維持し、単により良いあなたの脳の働きを助けます一つのことには二つの方法があります。

1)現在作業しているブランチごとにローカルブランチを作成してください。あなたは他の誰もがやっていることを再構築できるようにしたいので、これをしたいと思っています。リベースを使わなければ、歴史に何も追加しないマージを表すコミットがたくさんあります。リモートであるブランチをリベースすることはできますが、リベースは履歴を書き換えてしまうので、これは推奨されません。また、同時に2人で行う必要があります。プロジェクトの早い段階で、私はたいていmasterを処理します。だから、master_localを作成して何も追跡しない(git branch master_local)。人々が私が欲しい、または必要とする変更を行うとき(git pull)、master_localをチェックアウトしている間に、単にrebase(git rebase master)を実行します。

あなたの脳をうまく機能させるためのヒント - あなたのローカルブランチを追跡/リモート機能ブランチにしばしばマージしてください。より多くのものを分けておくと、覚えておく必要があるほど、マージが大きくなり、働かないなどの不満を感じる人が増えます。)

2)大きな機能多くの人にとって、機能ブランチごとにたくさんのコミットがあります。これらの機能がマスターになる準備ができたら、すべてを見る必要はありません。また、この機能を元に戻したい場合は、数百のパッチを元に戻す必要はありません。このすべてに対する答えは、コミットを1つの単一コミットに縮小することです。このようにマスターは、その中に含まれている機能の素敵な短いリストです。 (http://www.gitready.com/advanced/2009/02/10/squashing-commits-with-rebase。html)

+0

あなたの答えは*常にスカッシュがコミットするので、マスターの履歴にコミットしてもアプリケーションは動作しない状態になりません*? –

+1

トピックブランチでのマージの通常の方法として、Squashingコミットは適切ではありません。その役割は、トピックブランチの履歴を完全に破棄することです。このような履歴は興味深いだけでなく、後で、特にバグを発見するために二等分する必要がある場合や、別のトピックブランチと競合する場合には非常に便利です。 –

+0

ところで、#1は車輪を再発明しているようですが、gitはすでにリモートのものを追跡するローカルブランチをサポートしています。すなわちあなたは 'master'をローカルに持ち、' ​​origin/master'が自動的にリモートブランチを追跡するように設定します。 'git fetch'はリモートブランチを更新し、' git rebase origin/master'はローカルマスターをリモートブランチにリベースします。 –

0

私は、あなたのワークフローを適応させ、中間の 'チェックポイント'コミットをマスターブランチから守ることが最善の解決策(長期的)だと思います。 Benjamin Sandofsky details a workflowは、Gitの設計方法に最も近いと思われます。

記事の要旨:パブリックとプライベート:

は、2つのカテゴリに支店を考えます。

公開枝は、プロジェクトの信頼できる履歴です。公開ブランチでは、すべてのコミットは簡潔で原子的であり、十分に文書化されたコミットメッセージを持つべきです。できるだけ線形でなければなりません。それは不変でなければならない。公共支店には、Master支店とリリース支店があります。 私設支店はあなたのためのものです。問題を解決するのはあなたのスクラッチペーパーです。

ノンffのバンドエイド、壊れた二等分線、および謎の謎は、ドライバーをハンマーとして使用しているすべての症状です。

パブリックブランチに直接バインドして、バニラマージしないでください。まず、リセット、リベース、スカッシュ・マージ、修正コミットなどのツールを使用してブランチをクリーンアップします。 あなたの公開履歴を元のままにしておくと、早送りのマージは安全だけでなく、好ましいものになります。リビジョン履歴は線形で簡単に追跡できます。

パブリックヒストリーを不変、アトミック、および従いやすいものとして扱います。私的な歴史を使い捨てで扱いやすいものとして扱う。

意図したワークフローは次のとおりです。

  1. は、公共のブランチオフ構内を作成します。
  2. あなたの仕事をこの私設支店に定期的に委託してください。
  3. コードが完成したら、履歴を整理してください。
  4. クリーンアップされたブランチをパブリックブランチにマージします。