2016-12-07 7 views
0

このテーマには数千のバリエーションがあり、多くの質問がありましたが、私にとっては適切な解決策を見つけることができません。git:checkoutとmerge vs ??私たちに有利な葛藤を解決するため

私は2つの開発ラインを持っています.1つは "私"によって行われた "マスター"と "their_new_stuff"というブランチに1つあります。両方とも、かなりの数のファイルを変更し、同じ場所にある多くのファイルに触れ、矛盾を作り出しています。

私は自分の仕事を私たちの仕事に統合し、次のようなやり方で対立を処理する必要があります。これらの競合の99%に対して、私は単に私たちを受け入れることができます。しかし、私はまた、競合しないすべての変更を必要とし、いくつかの重要な争いの中で、私はそれらを受け入れるか手で合併する必要があります。手動でのマージが必要なファイル、またはマージでの "マージ"を必要としていることを知るには、手動による検査が必要です。

私は次のことを試してみました:

は1をお試しください:

まず
git merge their_new_stuff 
# for each file with conflicts: 
    # if requires manual merge: 
     # do manual merge 
    # else: 
     git checkout --ours all/files/not/merged/by/hand.cc 

私はこれは私が欲しかったものだと思ったが、これは「私たちは」フルファイルであるとチェックアウトのために動作しません。チェックアウトし、矛盾している部分をチェックアウト/解決するだけではありません。だから、私は自分たちが望んでいるものと相反しない変化を失う。

は2を試してみてください。それは、単一のファイルをマージすることはできませんので

git merge -s recursive -Xours their_new_stuff 

これは動作しません。私は矛盾がどこにあるか知る必要があり、マニュアルマージをするのに役立つ紛争マーカー付きのファイルバージョンを見たいので、理想的には失敗したマージの後に何かをやるでしょう。

3を試してみてください。そして、私は私のような何かを行うことができるかもしれないと思った:

git merge their_new_stuff 
# for each file with conflict: 
    # if file needs manual merge: 
     cp file file2 
git merge --abort 
git merge -s recursive -Xours their_new_stuff 
# for each file with manual merge: 
    cp file2 file 
    # merge by hand 

私は、これは動作するはずだと思うが、それは非常にklugy感じています。これを行う「正しい」方法はありますか?理想的には、私は次のようなことをしたいと思っています:

git merge their_new_stuff 
# for each file with conflict 
    # if needs manual merge 
     # do manual merge 
    # else 
     # is there any command that does something like?: 
     git remerge -s recursive -Xours file 

効果的に私はマージを行い、衝突マーカーを取得したいと思います。手動マージを調べ、手動マージが必要ない場合は、 "-Xours"を使ってマージをやり直してください。これは可能ですか?

+0

Gitはあなたがファイルごとに使用することができ、 'gitのマージ-file'を、持っていません。 *使用するためには、ベース(ステージ1)、ローカル( '--ours')、および他の(' --theirs')ファイルを(通常はインデックスの3つのステージから)抽出しなければならないことに注意してください通常のファイルシステムファイル。 'merge-file' *は' -X'スタイルの意味を持つ '--ours'と' --theirs'を取ります。 – torek

+0

@torekありがとう、それについては知らなかった。これは興味深いことです。私は '' merge''を使って衝突を見てから中止してから、 "keep ours"ファイルと '' merge-file''に '' merge-file --ours''を使うことができると思います"--ours"を使わずに、 "手動マージ"ファイルに衝突マーカーを付けることができます。すぐにうまくいかないものがあれば、それを答えてみてください。 –

+0

ファイルの3つのインデックスバージョンを一時ファイルに解凍し、ファイルが未解決のままである間だけインデックスに残ります*。マージを中止する必要はありません。 ( 'git ls-files --stage'、' git ls-files --unmerged'も参照してください。) – torek

答えて

1

GitはGitのブランチの状態の変化は、一般的にそのブランチにすべてにファイルを適用することを意味し、レポジトリベースのバージョン管理システムです。これは、個々のファイルを操作してコミットできるSVNなど、他のVCSツールとは概念的に異なります。 Gitには単一のファイルマージとしての概念はありません。 2つのブランチをマージする場合、すべてマージの際にファイルをリコンサイルする必要があります。

両方とも、かなりの数のファイルが変更され、同じ場所にある多くのファイルに触れ、競合が発生します。

これは問題の根本原因だと私は信じています。理想的には、あなたとあなたのパートナーは、コードベースのさまざまな領域で作業して、マージするときに衝突が最小限になるようにする必要があります。多くのマージ競合は、私の意見では、分岐設計と戦略が貧弱であることを暗示しています。同じJavaクラスの中で働いている2人のソフトウェア人がマージ競合を起こす可能性があります。同じ方法で働く2人の方がさらに悪いです。後で競合を最小限に抑えるような方法で懸念事項を分けることができるかどうかを確認してください。

あなたの現在の問題に関しては、手でマージするようにアドバイスしています。あなたはファイルのどちらかの親のバージョンをしたいと確信している場合は、次のいずれかを使用します。

git checkout --theirs <path/to/file.ext> 
git checkout --ours <path/to/file.ext> 
+0

答えをありがとう。はい、私はマージはレポ全体のコンセプトだが、私の印象(私は長年の水銀のユーザーだが、gitには新しい)は、gitがハンクレベルのマージに対して多くのサポートをしていたということだった。私はそれが私が学ぶ必要があると思いますか?あなたの理想的な状況は素晴らしいですが、10人の開発者がいるこのプロジェクトではそうではありません。競合の99%は実際には変更されたコンストラクタインターフェイスであり、2人が実際に同じ方法でそれを変更しました。 –

+0

@EthanCoon私の経験上、あなたが醜いマージ競合を解決するほどスマートではないなら、Gitは通常どちらでもありません。はい、これを自動化するためのスクリプトを作成しようとする可能性がありますが、マージの競合を解決し、常に手作業で行うのは最大限に妄想的です。たぶん誰か他の人があなたに別の答えを与えるでしょう。 –

+0

私はそれを行うのに十分なスマートです、私はちょうど怠惰です!一見して私は "私たち"が欲しいと分かりますが、そのインターフェースの変更だけです。チェックアウトはファイル単位で行われるため、ハンクスワイズではないため動作しません。ファイルにインタフェース変更の競合のみがある場合、私たちのためにすべての競合を解決することはできますが、私はgitにこれを行うように指示するほどスマートではないようです。 –

関連する問題