5

GITで自動マージを無効にする方法は?

目的は、コマンド チェーンの呼び出し中に自動マージで競合マージ解決と同じ動作をすることです。

$ git fetch
$ git merge some_branch
$ git mergetool

最後のコマンドは、マージの競合が発生した場合にファイルの 3 方向のマージを行います。競合マージを行わずに、ファイルに対して同じ 3 者間マージを実行する簡単な方法が必要です。

インターネットで解決策を見つけることができませんでした。

いくつかの回避策を念頭に置いていますが、回避することをお勧めします。

前もって感謝します、

アレクス

4

2 に答える 2

6

どちらか一方だけで行われた変更については、属性の設定を解除することで自動マージを防ぐことができます(「3方向マージの実行」のgitattributesmergeを参照)。マージ属性がない(または「バイナリ」に設定されている)パス名に対して行われたマージは、作業ツリーの現在のブランチのバージョンを残し、パス名のインデックスエントリを競合状態のままにします。

全員がこのように作業することを奨励したい場合は、.gitattributesファイルに入れてコミットすることができます。これを自分で行うだけの場合は、コミットされていない.gitattributesファイルに入れるか、リポジトリの$GIT_DIR/info/attributesファイルに入れることができます(属性を有効/無効にするために自由に追加/削除/名前変更できます)。

#    repository/.git/info/attributes
# OR
#    .gitattributes
* -merge

両側で同じ変更が行われた場合、この構成でも競合は発生しません。

于 2010-06-26T05:19:12.703 に答える
5

秘訣は、gitがマージを解決する方法は次のとおりです。

  • 常に3方向のマージに基づいています(コミットのグラフにより、共通の祖先を非常に簡単に取得できるため)
  • 競合を除いて常にシームレスに(プロセスがあなたによって支援される場合)

したがって、マージドライバーを定義したとしても、何らかの競合が発生しない限り、マージドライバーは起動しません。


試行する最初の設定は、マージ属性Unsetを定義することです。

設定解除

現在のブランチのバージョンを暫定的なマージ結果として取得し、マージに競合があることを宣言します。これは、明確に定義されたマージセマンティクスを持たないバイナリファイルに適しています。

.gitattributesあなたはファイルに書くでしょう

 * -merge

、そしてそれがすべてのマージされたファイルでmergetoolをトリガーするのに十分であるかどうかを確認します。


この「未設定」機能が直接オプションではない理由の1つは、次のgit mergeとおりです。

  • マージはDVCSの主な機能です
  • マージはツリーレベルで行われます(すべてのプロジェクトを考慮)

ファイルレベルで3方向マージの設定を解除しようとすることは、そのマージプロセスの一部ではありません(これもツリーレベルでの理由です)。
したがって、特定のファイルセットに設定できる属性としてより適しています。

于 2010-06-26T05:16:19.213 に答える