10

Git を使用していくつかの matlab コードを追跡しています。おもちゃの例が問題を最もよく示しています。これまでのプロジェクトはこんな感じです。

    C
   /
A--
   \
    B

Aの中身はx=5

行が次のように変更されたコミット C を作成します。x=6

次に、コミット B を作成します。ここで、コンテンツは次のようになります。

if flag==1
    x=5
end

プロジェクトの目標を次のようにマージしようとすると

    C
   / \
A--   D
   \ /
    B

D のマージ結果では、メイン行が両方で変更されているため、競合が発生します (B ではインデントが追加され、C では 5 が 6 に変更されています)。

マージ結果を得るために、あるブランチからのインデントの変更と別のブランチからのコンテンツの変更を統合するためのベスト プラクティスの方法はありますか?

https://stackoverflow.com/a/5262473/288545で1つの戦略について読んだことがありますが、それは競合を回避しますが、コンテンツの変更を優先してインデントを破棄します(これは改善ですが、それでもコードを読みにくくするため)。

コードを書くときにインデントを変更せずに、それを吸い上げることができると思います。これにより読みにくくなりますが、matlab では大した問題ではありません。しかし、Python ではインデントが非常に重要です。後で制御構造の内部に変更するコードの大きなブロックがある場合、これはさらに醜くなります。そのため、差分が多くの行に触れ、マージの競合が大きな頭痛の種になります。

間隔の変更とコンテンツの変更を別々に処理し、それらを統合するマージ戦略はありますか? マージの結果を

if flag==1
    x=6
end
4

2 に答える 2

4

一部の差分ツールは他のツールよりも優れています。私はKDiff3を使用しており、 を使用して自動的に呼び出されるように設定していますgit mergetool。まだ完全ではありませんが、多くの場合、説明した種類のマージを検出し、賢明なマージを自動的に生成できます。

于 2012-09-12T10:00:46.150 に答える
4

問題を解決する鍵は、空白のクリーンアップと関数の書き換えを別々のコミットとして扱うことです。

多くのブランチ統合を行っている者として、インテグレーターにとって最も厄介なことは次の 2 つだと正直に言えます。ファイルを開いて保存するだけで、ファイル全体を管理できます。確かに、どちらの場合でもファイルはより読みやすくなりますが、バージョン管理のポイントが完全に無効になります。コミットは、インテリジェントにサイズ設定、構築、およびレビューする必要があります。それらの順序には意味があるはずです。キッチンシンクのコミットは役に立たない歴史を作り、歴史は役に立たなければなりません。

この哲学は、「コミットに含まれていない空白の変更をダンプしない」ことを意味します。触れた関数を書き換える場合は、間隔を改善してください。それ以外の場合は、それを独自のコミットに任せ、そのファイルで作業している他の人が空白の変更が行われることを知っていることを確認してください。これにより、統合時の手間が省けます。

さらに、git のストック pre-commit フックを使用すると、偶発的な空白エラー (末尾のスペース、スペースの後のタブなど) を回避できます。リポジトリで次のコマンドを発行してセットアップします。

mv .git/hooks/pre-commit.sample .git/hooks/pre-commit

それは多かれ少なかれ問題git diff --checkであり、これらのタイプの問題を検出するのにも非常に役立ちます.

于 2012-09-11T23:55:10.543 に答える