従来のVCSでは、ビルドを中断できるために、未解決のファイルをコミットしない理由を理解できます。ただし、DVCSで未解決のファイルをコミットしてはならない理由がわかりません(実際には、一部のファイルはpreventでファイルをコミットできません)。
代わりに、リポジトリをpushingおよびpullingからロックする必要がありますが、コミットしないでください。
マージプロセス中にコミットできることには、(私が見るように)いくつかの利点があります。
setのチェンジセットを1つだけではなくマージとして機能させることもできます。これにより、git rerere
などのツールを引き続き使用できます。
それでは、なぜ未解決のファイルでのコミットが嫌われたり、防止されたりするのでしょうか?伝統以外の理由はありますか?
私が見ることができる最大の問題は、物事が半分マージされて(おそらく)正しく機能していないコミットのウィンドウを作成することです。ローカルコミットの最後のセットをプッシュすると、それらすべての中間コミットも他のすべてのユーザーに表示されます。理想的な世界では、anyコミットをプルでき、コードが機能するはずです。マージの途中でコミットを開始した場合、コードの状態は明確に定義されていません。
あなたができることの1つは、マージに対してローカルコミットを作成し、プッシュ時にそれらを1つの大きなコミットにバンドルすることです(どのvcsがこれをサポートするか(わからない場合)はわかりません)。これはあなたが述べたいくつかの利点をもたらすかもしれませんが、私はそれが追加の複雑さの価値があると確信していません(私たちはすでにかなり複雑で複雑な領域を扱っています)。
私はGitに最も精通しているので、その観点から答えます。
私があなたまたはで、マージされていないファイルのコミットを許可する理由、特にそれがコードの場合はわかりません。リポジトリを一貫した状態に保つ必要があり、提案していることはコミットの原子性に違反します。多くのVCSはファイルを物理的に変更して、競合の場所を示します-Git、SVN、およびCVSは>>>> <<<<タイプマーカーを使用します。アトミックリポジトリレベルのコミットとマージを使用するVCSでは、自分以外には意味のないノードを作成しただけです。ソフトウェア開発では、プロジェクトをビルドできませんでした。グループのドキュメントでは、誰がどの変更が正しいかわかりません。
現在、Gitはこれを容易にするいくつかのツールを提供しています。あなたが提案したタイプのコミットは許可されていました。たとえば、プッシュする前に、コミットをマージするすべてをつぶすことができます。これは、通常のマージコミットと同じです。
特典のリストに関する具体的な懸念:
rebase
のようなツールや一度に1つのコミットを選択することも、状況によってはここで役立ちます。この提案が機能する唯一の方法は、ブランチがマージ全体がアトミックである場合です-一連のコミットを見ることができますが、それらは、コミットツリーで1つのノードとして処理する必要がある、より大きなマージコミットの単なるステップです。 。私は現在のVCSがこのタイプのワークフローをサポートしているとは思いませんし、必要でもないと思います。
私の主な経験はMercurialでしたが、gitを散発的に使用しています。
Mercurialは未解決のファイルをコミットすることを禁止していません。それは単にdiscouragesすることです。持っていない変更をプルする前にプッシュするのも同じです。
Mercurialで実行する必要があるのは、ファイルをコミットしたら、ファイルをコミットする方法です。
hg resolve --mark --all
hg commit -m "I'm such a rebel"
--mark will ...マージツールでプロンプトを表示せずに、ファイルを解決済みとしてマークします。 --allは、競合のマークが付いているすべてのファイルを選択します。
プルせずにプッシュしたい場合(したがって、他の変更をマージする必要がある場合)ジェダイのように行う:
hg Push --force
次に引っ張る人は+1の頭を取得します(しゃれは意図されていません)
同じことをGitで行う方法は確かにあります(おそらくもっと複雑ですが)。
Gitでマージすると、すべての変更(マージの競合を含む)がすぐにコミットされます。次に、次のコミットで、テキストエディターを使用してマージの競合を解決します。競合が解決されたら、必要に応じてプッシュします。
正直なところ、他の人がこのようにしない理由、またはgitが強制しない理由がわかりません。
競合を解決する標準的なワークフローの大きな欠点beforeコミットは、ローカルコピーからの変更がこっそり入る可能性があることです。追加は、大量のマージ差分によってコードレビューから隠されているため、 APIキーなどを誤ってコミットした.
上記の私のワークフローでは、このローカルコピーの問題を回避し、コードレビューアーが標準のコミット差分とまったく同じように見えるコミット差分のマージ解決の詳細を(のみ)調査できるようにします。
可能な場合は(もちろん、常にそうであるとは限りません)、小さな変更をプッシュし、頻繁にプッシュすることをお勧めしますしないでくださいビルドされないコード、または半分完了しているコードをコミットする(私たちは皆間違いを犯しますが、故意にそれをしないでください)。私はgitの出身でもありますが、デスクトップでリポジトリの実用的なコピーを作成できるというのが一番いいと思います。それを変更して、心の中に入れてください。大きな変更が完了したら、送信してください。
私にとって最大のフラストレーションであるgitを使用して多くのオープンソースを実行することは、半分完了したコードをリポジトリに配置してビルドを試行することでしたが、実行できませんでした。 、1週間で完了します。」だから私はそれをスクラップしなければならず(それは男を困らせるだろう)、あるいは時間をかけて完成させて完全に統合する必要があるだろう。
私の考えでは、お尻の部分はローカルに保管し、良いものはネットワーク経由で送信します。
ツールの奴隷にならないでください。
VCSの目標は、自分の仕事を行えるようにすることです。あなたの仕事はではなく手付かずのローカルリポジトリを維持することではなく、あなたの仕事はコードを書くことです。早い段階で頻繁にコミットするlocallyことで作業が改善される場合は、それを実行してください。
ただし、上流でPush壊れたコードを使用しないでください。
基本的にそれは悪い考えです-それはあなたが大まかな状態にあるリポジトリにあなたを導くでしょう(そして、あなたはいつもあなたがどこかにPushすることを想定するその発疹ですが、常に少なくとも1つのコピーを持つべきだと主張します).
大規模/複雑なマージの場合、進行中の作業を保存して参照ポイントを確立する必要があるかもしれませんが、システムを混乱させる必要があるため、解決する必要があります。
そして、代替案があります-頭よりも前からマージするオプションがあります-これは、壮大なマージなしで(または、少なくとも理解しやすい大きなマージで)変更に適応する能力を与えるかもしれません。
これは、gitのリベースが特に便利な場合です(リベースに関する通常の注意事項に従う必要があります)。現在の状態の上で変更を再生しているため、小さな部分で競合を修正できます。