あなたのポイントに直接明確に答えさせてください:
私たちの問題は、長期的なサイドブランチにあります-マスターから分かれるサイドブランチで数人の人々が働いている種類で、数ヶ月間開発し、マイルストーンに到達すると2つを同期します。
通常、ブランチを数か月間非同期にしたくないでしょう。
機能ブランチは、ワークフローに応じて何かから分岐しています。master
単純にするためにそれを呼び出しましょう。これで、マスターにコミットするたびに、できることとすべきgit checkout long_running_feature ; git rebase master
です。これは、設計上、ブランチが常に同期していることを意味します。
git rebase
ここでも正しいことです。それはハックや奇妙なものや危険なものではなく、完全に自然なものです。情報の一部が失われます。これは機能ブランチの「誕生日」ですが、それだけです。誰かがそれを重要であると判断した場合、それを他のどこかに保存することで提供できます(チケットシステム内、または必要性が大きい場合は、git tag
...)。
今、私見、これを処理するための自然な方法は、単一のコミットにサイドブランチをつぶすことです。
いいえ、絶対にそれを望んではいません。マージコミットを望みます。マージコミットも「単一コミット」です。どういうわけか、個々のブランチコミットをすべて「マスター」に挿入しません。これはmaster
、マージ時のヘッドとブランチヘッドという2つの親を持つ単一のコミットです。
--no-ff
もちろん、オプションを必ず指定してください。--no-ff
あなたのシナリオでは、せずにマージすることは厳しく禁じられています。残念ながら、--no-ff
これはデフォルトではありません。しかし、それを可能にするオプションを設定できると信じています。git help merge
何をするのかを見てください--no-ff
(要するに、前の段落で説明した動作をアクティブにします)、それは重要です。
数ヶ月にわたる並行開発をマスターの歴史にさかのぼってダンプしているわけではありません。
絶対にそうではありません。特にマージコミットではなく、ブランチの「履歴に」何かをダンプすることはありません。
そして、もし誰かがサイドブランチの歴史のためにより良い解像度を必要とするなら、もちろん、それはすべてまだそこにあります-それはただマスターではなく、サイドブランチにあります。
マージコミットでは、それはまだ存在しています。マスターではなく、サイドブランチにあり、マージコミットの親の1つとして明確に表示され、必要に応じて永遠に保持されます。
私がやったことを参照してください?あなたがスカッシュのための説明すべてのものは、コミットされている権利がマージして--no-ff
コミットします。
問題は次のとおりです。私はコマンドラインのみを使用していますが、残りのチームはGUISを使用しています。
(サイドリマーク:コマンドラインでもほぼ排他的に動作します(まあ、それは嘘です、私は通常emacs magitを使用しますが、それは別の話です-個々のemacsセットアップで便利な場所にいない場合、私はコマンドを好みますラインとしても)。しかし、自分を支持を行うと、少なくとも試してみてくださいgit gui
一回。それはあるので、 /取り消しを追加するためのライン、兄貴などを選ぶためにはるかに効率的に追加されます。)
そして、GUISには他のブランチからの履歴を表示するための合理的なオプションがないことを発見しました。
それはあなたがしようとしていることは完全に精神に反しているからgit
です。git
「有向非循環グラフ」上のコアから構築されます。つまり、コミットの親子関係には多くの情報が含まれます。また、マージの場合、2つの親と1つの子との真のマージコミットを意味します。no-ff
マージコミットを使用するとすぐに、同僚のGUIが正常になります。
したがって、「この開発はブランチXYZから押しつぶされた」と言って、スカッシュコミットに到達した場合、XYZの内容を確認するのは非常に苦痛です。
はい、しかしそれはGUIの問題ではなく、スカッシュコミットの問題です。スカッシュを使用すると、機能ブランチの頭がぶら下がり、まったく新しいコミットがに作成されmaster
ます。これにより、2つのレベルで構造が破壊され、大きな混乱が生じます。
したがって、彼らは、これらの大きくて長い開発側ブランチを、常にマージコミットでマージしたいと考えています。
そして、彼らは絶対に正しい。しかし、彼らは、「マージされませんで」、彼らはただマージされます。マージは本当にバランスのとれたものであり、他の「に」マージされる優先側がありません(ブランチが入れ替わるなどの視覚的なわずかな違いを除いてgit checkout A ; git merge B
まったく同じです)。git checkout B ; git merge A
git log
マスターブランチからすぐにアクセスできない履歴は必要ありません。
これは完全に正しいです。マージされていない機能がないときは、以前のmaster
すべての機能のコミット行をカプセル化した豊富な履歴を持つ単一のブランチがあり、git init
時間の初めからコミットに戻ります(特に「その段落の後半にあるブランチ」は、その時点の履歴が「ブランチ」ではなくなったためです。ただし、コミットグラフはかなりブランチになります)。
私はその考えが嫌いです。
使用しているツールに反対して作業しているため、少し苦労します。このgit
アプローチは、特に分岐/マージの領域で非常にエレガントで強力です。(特に上記で暗示されているように--no-ff
)正しく実行すると、他のアプローチ(たとえば、ブランチ用の並列ディレクトリ構造を持つというsubversionの混乱)よりも飛躍的に向上します。
それは、並行した開発の歴史が無限に行き来できないことを意味します。
無限、並行-はい。
移動不能、もつれ-いいえ。
しかし、私たちがどのような選択肢を持っているのか見ていません。
の発明者のようにgit
、あなたの同僚や世界の人々が毎日やっているように、なぜ働きませんか?
ここには、サイドブランチを絶えずマージコミットでマスターにマージする以外のオプションがありますか?または、マージコミットを常に使用するのが私が恐れているほど悪くないという理由はありますか?
他のオプションはありません。それほど悪くない。