web-dev-qa-db-ja.com

未解決の変更をコミットしませんか?

従来のVCSでは、ビルドを中断できるために、未解決のファイルをコミットしない理由を理解できます。ただし、DVCSで未解決のファイルをコミットしてはならない理由がわかりません(実際には、一部のファイルはpreventでファイルをコミットできません)。

代わりに、リポジトリをpushingおよびpullingからロックする必要がありますが、コミットしないでください。

マージプロセス中にコミットできることには、(私が見るように)いくつかの利点があります。

  • 実際のマージの変更は履歴にあります。
  • マージが非常に大きい場合は、定期的にコミットできます。
  • 間違えた場合は、(マージ全体をやり直す必要なく)ロールバックがはるかに簡単になります。
  • ファイルは、解決済みとマークされるまで、未解決としてフラグが付けられたままになる可能性があります。これにより、プッシュ/プルが防止されます。

setのチェンジセットを1つだけではなくマージとして機能させることもできます。これにより、git rerereなどのツールを引き続き使用できます。

それでは、なぜ未解決のファイルでのコミットが嫌われたり、防止されたりするのでしょうか?伝統以外の理由はありますか?

15
Explosion Pills

私が見ることができる最大の問題は、物事が半分マージされて(おそらく)正しく機能していないコミットのウィンドウを作成することです。ローカルコミットの最後のセットをプッシュすると、それらすべての中間コミットも他のすべてのユーザーに表示されます。理想的な世界では、anyコミットをプルでき、コードが機能するはずです。マージの途中でコミットを開始した場合、コードの状態は明確に定義されていません。

あなたができることの1つは、マージに対してローカルコミットを作成し、プッシュ時にそれらを1つの大きなコミットにバンドルすることです(どのvcsがこれをサポートするか(わからない場合)はわかりません)。これはあなたが述べたいくつかの利点をもたらすかもしれませんが、私はそれが追加の複雑さの価値があると確信していません(私たちはすでにかなり複雑で複雑な領域を扱っています)。

6
Oleksi

私はGitに最も精通しているので、その観点から答えます。

私があなたまたはで、マージされていないファイルのコミットを許可する理由、特にそれがコードの場合はわかりません。リポジトリを一貫した状態に保つ必要があり、提案していることはコミットの原子性に違反します。多くのVCSはファイルを物理的に変更して、競合の場所を示します-Git、SVN、およびCVSは>>>> <<<<タイプマーカーを使用します。アトミックリポジトリレベルのコミットとマージを使用するVCSでは、自分以外には意味のないノードを作成しただけです。ソフトウェア開発では、プロジェクトをビルドできませんでした。グループのドキュメントでは、誰がどの変更が正しいかわかりません。

現在、Gitはこれを容易にするいくつかのツールを提供しています。あなたが提案したタイプのコミットは許可されていました。たとえば、プッシュする前に、コミットをマージするすべてをつぶすことができます。これは、通常のマージコミットと同じです。

特典のリストに関する具体的な懸念:

  1. 実際のマージ変更は履歴にあります。なぜ追加情報が必要なのですか? DVCSは、紛争を限られた領域に限定することに関して非常に優れています。保持するチェンジセットを選択したら、マージコミットノードのコピーを前のコピーと比較すると、これが正確にわかります。
  2. マージが非常に大きい場合、定期的なコミットを行うことができます。これは有効な懸念事項ですが、最初にここに到達することはできません。これが起こらないように、ブランチは常に上流の変更を取り入れるべきです。 rebaseのようなツールや一度に1つのコミットを選択することも、状況によってはここで役立ちます。
  3. 間違えた場合は、(マージ全体をやり直す必要なく)ロールバックする方がはるかに簡単です。上記を参照してください-競合は発生しませんこの扱いにくいものになります。

この提案が機能する唯一の方法は、ブランチがマージ全体がアトミックである場合です-一連のコミットを見ることができますが、それらは、コミットツリーで1つのノードとして処理する必要がある、より大きなマージコミットの単なるステップです。 。私は現在のVCSがこのタイプのワークフローをサポートしているとは思いませんし、必要でもないと思います。

3
Michael K

私の主な経験は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で行う方法は確かにあります(おそらくもっと複雑ですが)。

1
dukeofgaming

Gitでマージすると、すべての変更(マージの競合を含む)がすぐにコミットされます。次に、次のコミットで、テキストエディターを使用してマージの競合を解決します。競合が解決されたら、必要に応じてプッシュします。

正直なところ、他の人がこのようにしない理由、またはgitが強制しない理由がわかりません。

  • 「マージコミット」は、マージする必要がある正確な履歴です。
  • 次のコミットは、マージの競合を解決するために何をしたかを正確に示しています。
  • プッシュすると、競合が解決され、ブランチの先端でビルドが壊れなくなります。
  • どの時点でも、競合解決を台無しにした場合は、「マージ後」のコミットの1つに戻って再試行するだけです。

競合を解決する標準的なワークフローの大きな欠点beforeコミットは、ローカルコピーからの変更がこっそり入る可能性があることです。追加は、大量のマージ差分によってコードレビューから隠されているため、 APIキーなどを誤ってコミットした.

上記の私のワークフローでは、このローカルコピーの問題を回避し、コードレビューアーが標準のコミット差分とまったく同じように見えるコミット差分のマージ解決の詳細を(のみ)調査できるようにします。

1
pkamb

可能な場合は(もちろん、常にそうであるとは限りません)、小さな変更をプッシュし、頻繁にプッシュすることをお勧めしますしないでくださいビルドされないコード、または半分完了しているコードをコミットする(私たちは皆間違いを犯しますが、故意にそれをしないでください)。私はgitの出身でもありますが、デスクトップでリポジトリの実用的なコピーを作成できるというのが一番いいと思います。それを変更して、心の中に入れてください。大きな変更が完了したら、送信してください。

私にとって最大のフラストレーションであるgitを使用して多くのオープンソースを実行することは、半分完了したコードをリポジトリに配置してビルドを試行することでしたが、実行できませんでした。 、1週間で完了します。」だから私はそれをスクラップしなければならず(それは男を困らせるだろう)、あるいは時間をかけて完成させて完全に統合する必要があるだろう。

私の考えでは、お尻の部分はローカルに保管し、良いものはネットワーク経由で送信します。

0
Kelly Elton

ツールの奴隷にならないでください。

VCSの目標は、自分の仕事を行えるようにすることです。あなたの仕事はではなく手付かずのローカルリポジトリを維持することではなく、あなたの仕事はコードを書くことです。早い段階で頻繁にコミットするlocallyことで作業が改善される場合は、それを実行してください。

ただし、上流でPush壊れたコードを使用しないでください。

0
Bryan Oakley

基本的にそれは悪い考えです-それはあなたが大まかな状態にあるリポジトリにあなたを導くでしょう(そして、あなたはいつもあなたがどこかにPushすることを想定するその発疹ですが、常に少なくとも1つのコピーを持つべきだと主張します).

大規模/複雑なマージの場合、進行中の作業を保存して参照ポイントを確立する必要があるかもしれませんが、システムを混乱させる必要があるため、解決する必要があります。

そして、代替案があります-頭よりも前からマージするオプションがあります-これは、壮大なマージなしで(または、少なくとも理解しやすい大きなマージで)変更に適応する能力を与えるかもしれません。

これは、gitのリベースが特に便利な場合です(リベースに関する通常の注意事項に従う必要があります)。現在の状態の上で変更を再生しているため、小さな部分で競合を修正できます。

0
Murph