2012-09-11 8 views
9

私はいくつかのMATLABコードを追跡するためにGitを使用しています。おもちゃの例がその問題を最もよく説明しています。これまでのところ、このプロジェクトはこのように見えます。 Aのマージ時にGitで字下げと内容の変更を統合する:ベストプラクティス?

C 
/
A-- 
    \ 
    B 

内容は、我々はその後、私たちの内容は以下のようになるとBを、コミット作るラインがx=6

に変更されたCを、コミット作るx=5

ある

if flag==1 
    x=5 
end 

プロジェクトのゴールで

のようにマージしようとすると
C 
/\ 
A-- D 
    \/
    B 

マージ結果がDの場合、メインラインが両方とも変更されているため(Bで追加された字下げ、5がCで6に変更されたため)、競合が発生します。

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

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

私はそれを吸うだけで、自分のコードを書くときにインデントを変更しないと思います。これは読みにくくなりますが、matlabでは大したことではありません。しかし、Pythonでは、字下げが重要です。だから、Pythonの人々はどうやってそれを処理しますか?後で制御構造の内部に入るように大きなコードブロックがあると、これは非常に醜いものになるので、diffは多くの行に接し、マージの競合は大きな頭痛になります。

間隔の変更とコンテンツの変更を個別に処理して統合するマージ戦略はありますか?私はあなたの問題を解決する鍵は別々のコミットとして書き換えて空白クリーンアップと機能を扱っているマージの結果は

if flag==1 
    x=6 
end 
+0

Pythonでは、すべての人に4つのスペースでコードをインデントするよう指示する 'PEP 8 'に指示します。次に、4つのスペースインデントを持つコードを記述しているので、インデントの変更について心配する必要はありません。;-) – mgilson

+5

@mgilson元々スタンドアロンのコード(インデントされていない)、コントロール構造に埋め込みます。インデントされる必要があります。 4つのスペースのみを扱うのにぴったりだとしても、1つのブランチが4つの新しいスペースを導入し、もう1つのブランチがコンテンツの変更を導入するため、マージの競合が発生します。 –

+0

私のコメントはほとんど冗談だった。あなたは当然です。しかし、その場合には、インデントする必要はありません。同じコードブロックに互換性のない変更があると、マージの競合が発生します。そういうわけで、gitはあなたにこれらの互換性のない変更に対処し、手でそれらをマージさせるのです...もちろん、git mergetoolでこれを苦痛を少なくするために試みることができる多くのツールがあります... – mgilson

答えて

3

ようにしたいと思います。

多くのブランチを統合している人として、私は正直言って、インテグレータにとって最も厄介なものは、1)書き換えないファイルを再フォーマットしたい、または再書き込みしなかったファイルを再フォーマットするコーダ、2 )IDEは、ファイルを開いて保存するだけで、ファイル全体を再フォーマットします。ファイルはどちらの場合でもより読みやすくなりますが、バージョン管理のポイントを完全に打ち破ります。コミットは、インテリジェントなサイズ、構築、およびレビューを行う必要があります。彼らの命令には意味があるはずです。キッチンシンクは役に立たない歴史のために作ったものであり、歴史は役立つものではありません。

この哲学は、「所属していないコミットに空白の変更をダンプしないでください」ということを意味しています。タッチした機能を書き換えている場合は、必ず間隔を広げてください。そうでなければ、それを自分のコミットに任せて、そのファイルを扱っている他の人が空白の変更が来ていることを確かめてください。それは統合時に手間を省きます。

さらに、gitの在庫プレコミットフックで間違った空白エラー(末尾の空白、スペースの後のタブなど)を避けることができます。それを設定するリポジトリのコマンドを発行します。

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

それ以上、あるいはまた、この種の問題を検出するために非常に有用である以下の問題git diff --check、。

3

一部の差分ツールは他のツールより優れています。 KDiff3を使用し、git mergetoolを使用して自動的に呼び出されるように設定してください。まだ完璧ではありませんが、記述した種類のマージを検出して自動的に合理的なマージを生成することができます。

関連する問題