設定ファイルの特定のインスタンスでは、私は同意するだろうロンの答え:
configが(「で宣言されたのように、それゆえ「無視」ワークスペースへの「プライベート」である必要があります.gitignore
ファイル」)。
あなたは、設定ファイルがあり、テンプレートとトークン化された値のことで、その変換スクリプトconfig.template
プライベート(および無視)設定ファイルにファイルを。
ただし、その特定の発言は、より一般的な質問、つまりあなたの質問(!)には答えません。
特定のファイルで競合するマージに対して常にローカルバージョンを選択するようにgitに指示するにはどうすればよいですか?(任意のファイルまたはファイルのグループ)
この種類のマージは「コピーマージ」であり、競合がある場合は常に、ファイルの「ours」または「theirs」バージョンを常にコピーします。
(としてブライアン・ヴァンデンバーグのノートのコメントで、「ours
」と「theirs
」ここにマージするために使用されている。
彼らがされている逆転のためにリベース:「を参照してくださいWhy is the meaning of “ours” and “theirs” reversed with git-svn
」、リベースを使用した、「git rebase
『ローカル』を追跡して、 『リモート』」 )
「ファイル」(一般的には「config」ファイルではなく、悪い例であるためファイル)の場合、マージによって呼び出されるカスタムスクリプトでそれを実現します。
あなたが定義する必要がありますので、Gitはそのスクリプトを呼び出しますgitattributesの値を定義し、カスタムマージドライバを。
「カスタムマージドライバー」は、この場合、基本的に現在のバージョンを変更せずに維持する非常に単純なスクリプトなので、常にローカルバージョンを選択できます。
。IE、としては指摘によりチロSantilli:
echo 'path/to/file merge=ours' >> .gitattributes
git config --global merge.ours.driver true
単純なシナリオで、Windowsのmsysgit 1.6.3を使用して、単なるDOSセッションでテストしてみましょう。
cd f:\prog\git\test
mkdir copyMerge\dirWithConflicts
mkdir copyMerge\dirWithCopyMerge
cd copyMerge
git init
Initialized empty Git repository in F:/prog/git/test/copyMerge/.git/
次に、2つのファイルを作成してみましょう。どちらも競合しますが、マージ方法は異なります。
echo a > dirWithConflicts\a.txt
echo b > dirWithCopyMerge\b.txt
git add -A
git commit -m "first commit with 2 directories and 2 files"
[master (root-commit) 0adaf8e] first commit with 2 directories and 2 files
2つの異なるgitブランチの両方のファイルのコンテンツに「競合」を導入します。
git checkout -b myBranch
Switched to a new branch 'myBranch'
echo myLineForA >> dirWithConflicts\a.txt
echo myLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in myBranch"
[myBranch 97eac61] add modification in myBranch
git checkout master
Switched to branch 'master'
git checkout -b hisBranch
Switched to a new branch 'hisBranch'
echo hisLineForA >> dirWithConflicts\a.txt
echo hisLineForB >> dirWithCopyMerge\b.txt
git add -A
git commit -m "add modification in hisBranch"
[hisBranch 658c31c] add modification in hisBranch
次に、「myBranch」に「hisBranch」をマージしてみましょう。
- 競合するマージの手動解決
- 除く外のため
dirWithCopyMerge\b.txt
、私は常に維持したい場所に私のバージョンをb.txt
。
マージは ' MyBranch
'で発生するため、それに戻り、 ' gitattributes
'ディレクティブを追加してマージ動作をカスタマイズします。
git checkout myBranch
Switched to branch 'myBranch'
echo b.txt merge=keepMine > dirWithCopyMerge\.gitattributes
git config merge.keepMine.name "always keep mine during merge"
git config merge.keepMine.driver "keepMine.sh %O %A %B"
git add -A
git commit -m "prepare myBranch with .gitattributes merge strategy"
[myBranch ec202aa] prepare myBranch with .gitattributes merge strategy
ディレクトリに.gitattributes
定義されたファイルdirWithCopyMerge
(マージが発生するブランチでのみ定義されています:)があり、ファイルにマージドライバが含まれmyBranch
てい.git\config
ます。
[merge "keepMine"]
name = always keep mine during merge
driver = keepMine.sh %O %A %B
keepMine.shをまだ定義しておらず、とにかくマージを開始する場合、ここに取得されます。
git merge hisBranch
sh: keepMine.sh: command not found
fatal: Failed to execute internal merge
git st
# On branch myBranch
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dirWithConflicts/a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
type dirWithConflicts\a.txt
a
<<<<<<< HEAD:dirWithConflicts/a.txt
myLineForA
=======
hisLineForA
>>>>>>> hisBranch:dirWithConflicts/a.txt
それは結構です:
a.txt
マージする準備ができており、競合している
b.txt
マージドライバーがそれを処理することになっているため(.gitattributes
ディレクトリ内のファイル内のディレクティブにより)、まだ変更されていません。
keepMine.sh
あなたのどこかに定義します%PATH%
(または$PATH
私たちのUnixの友人のために。私はもちろん両方を行います:私はVirtualBoxセッションでUbuntuセッションを持っています)
以下のようにコメントでlrkwz、と「で説明マージ戦略の」セクションのカスタマイズのGit - Gitの属性は、シェルコマンドでシェルスクリプトを置き換えることができますtrue
。
git config merge.keepMine.driver true
ただし、一般的なケースでは、スクリプトファイルを定義できます。
keepMine.sh
# I want to keep MY version when there is a conflict
# Nothing to do: %A (the second parameter) already contains my version
# Just indicate the merge has been successfully "resolved" with the exit status
exit 0
(それは、1人の、単純なマージドライバーだった;)(その場合、使用中でもシンプルなtrue
)
(あなたが直前に追加し、他のバージョンを維持したい場合はexit 0
行:
cp -f $3 $2
。
それはあるあなたは、ドライバが遠かったが、他からのバージョンを続けるだろうマージ。ブランチ、ローカルの変更をオーバーライドする)
さて、最初からマージを再試行しましょう:
git reset --hard
HEAD is now at ec202aa prepare myBranch with .gitattributes merge strategy
git merge hisBranch
Auto-merging dirWithConflicts/a.txt
CONFLICT (content): Merge conflict in dirWithConflicts/a.txt
Auto-merging dirWithCopyMerge/b.txt
Automatic merge failed; fix conflicts and then commit the result.
マージは失敗します... a.txtの場合のみ。
a.txtを編集し、「hisBranch」の行をそのままにして、次のようにします。
git add -A
git commit -m "resolve a.txt by accepting hisBranch version"
[myBranch 77bc81f] resolve a.txt by accepting hisBranch version
このマージ中にb.txtが保持されていることを確認しましょう
type dirWithCopyMerge\b.txt
b
myLineForB
最後のコミットは完全なマージを表しています:
git show -v 77bc81f5e
commit 77bc81f5ed585f90fc1ca5e2e1ddef24a6913a1d
Merge: ec202aa 658c31c
git merge hisBranch
Already up-to-date.
(Mergeで始まる行はそれを証明しています)
Gitが行うように、マージドライバーを定義、結合、および/または上書きできることを考慮してください。
- 調べる
<dir>/.gitattributes
(問題のパスと同じディレクトリにある):.gitattributes
ディレクトリ内の他のディレクトリに優先します
- 次に、
.gitattributes
(親ディレクトリにある)検査し、まだ設定されていない場合にのみディレクティブを設定します
- 最後に調べます
$GIT_DIR/info/attributes
。このファイルは、ツリー内の設定を上書きするために使用されます。<dir>/.gitattributes
ディレクティブを上書きします。
「結合」とは、複数のマージドライバーを「集約」することを意味します。
Nick Green はコメントで、実際にマージドライバーを結合しようとしています。「Python gitドライバーを介してpomをマージする」を参照してください。
ただし、他の質問で述べたように、これは競合(両方のブランチでの同時変更)の場合にのみ機能します。