pick - git ブランチ




“ git merge-s theirs”が必要-しかしそれは存在しないことを私は知っています (4)

Gitのバージョン1.7.1では、マージする "theirs"戦略と "-Xtheirs"引数を渡すことができます。

git merge -Xtheirs otherBranch

それがあなたがやろうとしていることに当てはまるかどうかわからないが、それはおそらく一撃の価値がある。

( この関連質問も参照)

一緒にマージしたいリモートリポジトリがいくつかあります。 これらのリポジトリのサブツリーの中には、リモートに固有のもの(ホスト固有のデータが含まれている)、他のサブツリーがすべてのリモート間で共通と思われるデータが含まれているものがあります。

私がやりたいことは、本質的には、各リモコンに対して "git pull"を実行することです。 これにより、リモートで変更されたホスト固有のファイルについては、リモートマスターのトラッキングブランチに沿ってローカルマスターブランチが早送りされ、変更されていないため共通ファイルに対しては何も行われません。

共通ファイルの変更(変更をF 'としてFと呼ぶ)は、最初に1つのリモートでしか行われなくても問題にはなりません。 git-mergeは正しいことをし、私の複合ワークスペースにF 'のコピーをくれます。それが私の望むものです。 同じ共通ファイルが別のリモートで異なる方法で変更されると問題が発生します(F "と呼びます)。git-mergeでF 'とF"の合成が表示されますが、これは私の望むことではありません。 欲しいのはF "だけです。

ClearCaseを使用していたとき、これをコピーマージと呼びました。 マージの結果は常に寄稿者の正確なコピーでした。 これは、 "git merge -s theirs"とよく似ていますが、存在しない点が異なります。

早送りマージを邪魔にならないように "git-read-tree -m --trivial"で何かを作り上げることができるかどうか、そしてgit-mergeと単に$をコピーするカスタムのmergetoolで魔法をかけることができるかどうか疑問に思います。 $ MERGEDにREMOTEファイル。 しかしそれでも、マージが簡単なものであれば、F 'とF "をgit-mergeで合成できないようにする方法はわかりません。

"git merge -s ours"の "theirs"バージョンはありますか? このサイト、およびJunio Hamanoによる投稿では、「git merge -s theirs」がなぜそんなに悪い考えであるかを説明していますが、私にとってはそうではありません。 私は古い歴史を大切にしています、しかし私は船を飛び越えてそして1つが起こるとき遠隔地の変化に従う必要があります。 ローカルサイトで新しい作業は行われません。 それは単に一つの変更があったときに最後にポーリングされたリモートから最新の "共通の"ファイルを取って、すべてのリモートサイトの複合を形成する必要があります。

あなたが私に与えることができるあらゆる助けを前もってありがとう。


(2011年更新:
あるブランチを別のブランチにするためのgitコマンド 」という答えはgit mergeシミュレートするためのすべての可能な方法を列挙ています。

あなたがコピー - マージしたい特定のファイル/ツリーのために、あなたは私がこのSO質問で言及するもののようなgitattributes値を設定することができ、カスタムマージドライバを定義することができます。
merge属性に関連付けられたスクリプトは、常にリモートファイルをマージ結果として保持するようにします(反対のシナリオではありますが、ローカルのバージョンを保持するにもかかわらず、このSOの答えを参照してください)。

echo * merge=keepTheir > dirWithCopyMerge\.gitattributes
git config merge.keepTheir.name "always keep theirduring merge"
git config merge.keepTheir.driver "keepTheir.sh %O %A %B"

内容を ' * merge=keepTheir 'でコピーマージしたいサブツリーの上に.gitattributeを設定することで、そのサブツリーのすべてのファイルにカスタムマージドライバを効果的に* merge=keepTheirことができます(ここでは「 * 」ワイルドカード。

keepTheir.shを使うと:

mv -f $3 $2
exit 0

「デフォルト」のマージドライバを変更する必要はなく、必要なファイルにのみ独自のドライバを適用します。


何トンもの研究を経て、すべてのSOノイズを調べ、もう一度gitについて学ぶことで(終わりはありますか? )、この答えが最もノイズのない最適な方法であると考えられます。ドライバ。 要求に応じて使用可能で、必要なgitattributesゴミはありません。

私は、これが - --strategy theirsシミュレーションなのか、それとも最もスムーズに使えるcheckout --theirs .なのか、まだちょっとめまいがしcheckout --theirs . コンフリクト解消方法 多分それらは同等ですが、私は完全に理解するためにいくつかの結果グラフを診断しなければならないでしょう、それは今のところ時間がありません。

細かい点を追いかけてhttps://.com/a/1911370/35946かなり親密になっている正しいことをしている@kbroへの小道具

[git:master]はシェルプロンプト表示です。

セットアップ

$ [git:master] git config merge.theirs.name 'simulate `-s theirs`'
$ [git:master] git config merge.theirs.driver 'cat %B > %A' # same as `mv` or `cp`, matter of taste

つかいます

$ [git:master] GIT_CONFIG_PARAMETERS="'merge.default=theirs'" git merge develop

ボーナス:エイリアス

$ [git:master] git config alias.merge-theirs \!GIT_CONFIG_PARAMETERS=\""'"merge.default=theirs"'"\"\ git\ merge

使用法:エイリアス

$ [git:master] git merge-theirs develop

GIT_CONFIG_PARAMETERSの引用符構造に注意してください。複数の複雑な値を取ることができなければならないからです。 そのBONUSコマンドラインを入手するには、努力が必要でした。

PS GIT_CONFIG_PARAMETERSは、SOで最も守られている秘密でなければなりません、私たちは2016年をほぼGIT_CONFIG_PARAMETERS 、 https://.com/search?q=git_config_parameters GIT_CONFIG_PARAMETERSは1つの結果を持っていhttps://.com/search?q=git_config_parameters ( 1








copy