10

マージ中にGitが競合を検出した場合、デフォルトの動作はファイルを<<< >>> ===マーカーで埋めることです。

これはほとんどの場合問題ありませんが、競合を別の方法で解決したい場合や、Gitで個別のファイルを作成したい場合があります。

  • 元のバージョン、
  • バージョンAを変更しました。
  • バージョンBを変更しました。

それを達成する方法は?


これらのファイルを一度に作成する簡単なコマンドがない場合(これは少し驚くべきことです)、Gitを拡張してそれを実行する方法があるのではないでしょうか。習慣mergetoolか何か?ただのアイデア。


解決:

私は@KarlBielefeldtの答えの変形に落ち着きました:

savefiles.sh

#!bash
BASE=$1
LOCAL=$2
REMOTE=$3
MERGED=$4

cp "$BASE" "$MERGED.git_BASE"
cp "$LOCAL" "$MERGED.git_LOCAL"
cp "$REMOTE" "$MERGED.git_REMOTE"

# never mark the conflict as merged
exit 1 

構成

mergetool.savefiles.cmd=/path/to/savefiles.sh $BASE $LOCAL $REMOTE $MERGED
mergetool.savefiles.trustexitcode=true
4

3 に答える 3

6

savefiles.sh次の内容のというファイルを作成します。

#!/usr/bin/bash

cp $1 /path/to/BASE
cp $2 /path/to/LOCAL
cp $3 /path/to/REMOTE

リポジトリ内で次のコマンドを実行します。

git config mergetool.savefiles.cmd "/path/to/savefiles.sh \$BASE \$LOCAL \$REMOTE"

--globalこのリポジトリ以外に変更したい場合はa を追加してください。

次に、このカスタム マージツールを実行するには、次を使用します。

git mergetool --tool=savefiles
于 2011-07-29T20:38:44.217 に答える
5

mergetoolを使用せずに、指定した状態のファイルを表示または保存するだけの場合、インデックスは競合するファイルのさまざまな状態を保持します。次のコマンドで表示(および必要に応じてファイルにリダイレクト)できます。

$ git show :1:file.txt  # the file in a common ancestor of both branches
$ git show :2:file.txt  # the version from HEAD.
$ git show :3:file.txt  # the version from MERGE_HEAD.

ただし、グラフィカルなマージツールを使用すると、競合するファイルの3ペインビューが表示されます。これは通常、人々が行うことなので、お気に入りのツールを手に取って、それをgit mergetool通話にリンクする方法を確認してください。

于 2011-07-26T09:52:12.067 に答える
1

概要

git mergetool -y -t bogus <file>

git 1.7.9.5 / Ubuntu 12.04 および msysgit 1.9.4 / Windows 7 x64 で動作します。

説明

Gitに個別のファイルを作成してもらいたいだけです

私は同じものを探していました。適切な例: を呼び出すときgit mergetool -t kdiff3、gitは明らかに、ハードコーディングされた--autoフラグを使用して kdiff3 を呼び出して、競合を自動的に解決し、GUI を表示したりプロセスに参加させたりせずに終了するように指示して、私の裏をかこうとします (も参照)。それが起こり、kdiff3 が競合を間違って解決したとき、私はこれを探しに行きました。

mergetoolそのように呼び出すと (bogusは有効なマージ ツール識別子ではない文字列です [たとえばgit mergetool --tool-help、git のバージョンにそれがある場合の出力にはありません])、次のことが起こります。

  • 「不明なマージツールの偽物」と報告します

  • インデックスとfileはそのままです

  • 次のファイルが生成されます ({num}は、この呼び出しによって作成されたすべてのファイルで同じ整数です)。

    file.BACKUP.{num}
    file.BASE.{num}
    file.LOCAL.{num}
    file.REMOTE.{num}
    

file.BACKUP.{num}と同じですfile

ノート

に設定-yすれば は不要だと思います。そして、ドキュメントによると、新しいバージョンの git のように見えます。mergetool.promptfalse-t-y

-tパーツはさらに短くすることができます (例:または-t x) -t 0

複数のマージされていないファイルがある場合、これを取得して一度に複数のファイルのこれらのバージョンを生成する方法はないようです。たとえば、ファイルfiles/file1files/file2のマージを解除した場合、次のいずれかを実行しても、 のこれらのバージョン (バックアップ、ベース、ローカル、リモート) のみが生成されfile1ます。

git mergetool -y -t x
git mergetool -y -t x files
git mergetool -y -t x files/file1 files/file2

ただし、競合を解決して再度file1実行git mergetoolすると、次のファイルに移動します。

于 2014-11-21T17:21:12.003 に答える