GIT - マージが上書きしたくない場合、2つのブランチで異なるバージョンを持つ同じファイル -- git フィールド と branching-and-merging フィールド と multiple-versions フィールド 関連 問題

Git - Same file with different versions on two branches, when merge do not want to overwrite












22
vote

問題

日本語

2つの枝 - 「マスター」と「リリース」

と私たちは 9988777668 のような1つのファイルを持っています。これら2つのブランチで異なるバージョンを保持したいです。

しかし、「release」を「マスター」にマージする必要があります。どうやって、<コード> fileA は<コード> Google PubSub0 支店の「リリース」の

英語

We have two branches -- 'master' and 'release'

And we have one file, like fileA, we want to keep different version on these two branches.

But each time, we have to merge 'release' into 'master', how can we achieve, the fileA in 'master' will not be overwritten by the fileA in branch 'release'.

</div
        
 
 

回答リスト

11
 
vote

Pro Git " Merge Strategies " 8.2 Git - Git属性

マージ戦略

GIT属性を使用してGITを使用するように通知することもできます。 プロジェクト内の特定のファイルに対するさまざまなマージ戦略。一 非常に便利なオプションは、特定のファイルをマージしようとしないようにGITを伝えることです。 彼らが紛争を持っているときは、むしろマージのあなたの側を使うこと 他の誰かの上に。

プロジェクト内の支店が発散しているか、ある場合に役立ちます。 特殊化されたが、変更をマージできるようにしたいのですが、 そして、特定のファイルを無視します。データベース設定があるとします len(ready)1 と呼ばれるファイルと2つのブランチでは異なります。 データベースをめちゃくちゃにせずに他のブランチにマージしたい ファイル。このような属性を設定できます。

<事前> <コード> len(ready)2

とダミー<コード> len(ready)3 マージ戦略を定義します。

<事前> <コード> len(ready)4

マージの競合を持たせる代わりに他のブランチにマージした場合 len(ready)5 ファイルでは、次のようなものが表示されます。

<事前> <コード> function cw_change_product_price_display( $price ) { $clear = trim(preg_replace('/ +/', ' ', preg_replace('/[^A-Za-z0-9 ]/', ' ', urldecode(html_entity_decode(strip_tags($price)))))); if($clear == "0 00"){ return ''; } return $price; } add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' ); add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' ); 16

この場合、<コード> len(ready)7 はもともとあなたが何であれのバージョンに留まります 持っていた。

それを状況に適用する、まず<コード> len(ready)8

<事前> <コード> len(ready)9

と特別なものにします。

<事前> <コード> len(ready[0])0

これで代表者を作成します<コード> len(ready[0])1 ブランチ。

<事前> <コード> len(ready[0])2

特別なことはまだありません:バージョン管理は、この時点では想定されているように単に機能しています。

今、 len(ready[0])3

機能B を実装します。 <事前> <コード> len(ready[0])4

あなたの興奮を封じ込めるようにしてください。

ここに私たちの特別なマージドライバーが演奏する場所です。私たちのヒーローは、 len(ready[0])5 から function cw_change_product_price_display( $price ) { $clear = trim(preg_replace('/ +/', ' ', preg_replace('/[^A-Za-z0-9 ]/', ' ', urldecode(html_entity_decode(strip_tags($price)))))); if($clear == "0 00"){ return ''; } return $price; } add_filter( 'woocommerce_get_price_html', 'cw_change_product_price_display' ); add_filter( 'woocommerce_cart_item_price', 'cw_change_product_price_display' ); 26 にマージしたいと考えています。最初のスイッチの分岐

<事前> <コード> len(ready[0])7

Synity len(ready[0])8 には、予想されるものが含まれていることを確認してください。

<事前> <コード> len(ready[0])9

Merge 機能Bから<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 0 。

<事前> <コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 1

行<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 2 は、特別なことが起こったのは手がかりです。確かに:

<事前> <コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 3

どのように機能するか

" https://git-scm.com/docs/gitattributes "rel =" noreferrer "> gitattributesドキュメント説明します。

<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 4 変数の値は、コマンドを構築するために使用されます。 Ancestorのバージョンをマージするために実行されます(<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 5 )、現在のバージョン(<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 6 )と その他のブランチのバージョン(<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 7 )。これら3つのトークンはそれに置き換えられます これらのバージョンの内容を保持する一時ファイルの名前 コマンドラインは構築されています...

マージドライバは、マージの結果を残すと予想されます。 add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 8 を上書きすることで、 add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 8 という名前のファイル、およびそれがゼロステータスで終了します。 競合があった場合は、それらをきれいにマージすることができます。

カスタム<コード> add_action('woocommerce_before_shop_loop_item','custom_remove_loop_price'); function custom_remove_loop_price(){ global $product; if(!$product->price){ remove_action('woocommerce_after_shop_loop_item_title','woocommerce_template_loop_price',10); } } 9 ドライバは、この機械類のほとんどではなく、 command ゼロ状態で終了します。これは<コード> //Hide Price when Price is Zero add_filter( 'woocommerce_get_price_html','maybe_hide_price',10,2); function maybe_hide_price($price_html, $product){ if($product->get_price()>0){ return $price_html; } return ''; } // End of above code 1 から始まるため、 //Hide Price when Price is Zero add_filter( 'woocommerce_get_price_html','maybe_hide_price',10,2); function maybe_hide_price($price_html, $product){ if($product->get_price()>0){ return $price_html; } return ''; } // End of above code 1 から始まるため、望ましい効果が得られます。 現在オンになっています - 私たちが望んでいる結果です。それから、マージ上書きフェーズでは何もしません( IE は、 //Hide Price when Price is Zero add_filter( 'woocommerce_get_price_html','maybe_hide_price',10,2); function maybe_hide_price($price_html, $product){ if($product->get_price()>0){ return $price_html; } return ''; } // End of above code 2 によって指定された他のブランチのバージョンを無視します)。 最後にGit Allが終了ステータスを正しくうまくいっているように指示します。

 

Pro Git describes how to get this effect in the "Merge Strategies" section of 8.2 Customizing Git — Git Attributes.

Merge Strategies

You can also use Git attributes to tell Git to use different merge strategies for specific files in your project. One very useful option is to tell Git to not try to merge specific files when they have conflicts, but rather to use your side of the merge over someone else’s.

This is helpful if a branch in your project has diverged or is specialized, but you want to be able to merge changes back in from it, and you want to ignore certain files. Say you have a database settings file called database.xml that is different in two branches, and you want to merge in your other branch without messing up the database file. You can set up an attribute like this:

database.xml merge=ours 

And then define a dummy ours merge strategy with:

$ git config --global merge.ours.driver true 

If you merge in the other branch, instead of having merge conflicts with the database.xml file, you see something like this:

$ git merge topic Auto-merging database.xml Merge made by recursive. 

In this case, database.xml stays at whatever version you originally had.

Applying it to your situation, first create fileA

$ echo 'master fileA' > fileA $ git add fileA ; git commit -m "master fileA" [master (root-commit) fba9f1a] master fileA  1 files changed, 1 insertions(+), 0 deletions(-)  create mode 100644 fileA 

and make it special.

$ echo fileA merge=ours > .gitattributes $ git add .gitattributes ; git commit -m 'fileA merge=ours' [master 98e056f] fileA merge=ours  1 files changed, 1 insertions(+), 0 deletions(-)  create mode 100644 .gitattributes $ git config --global merge.ours.driver true 

Now we create a representative release branch.

$ git checkout -b release Switched to a new branch 'release' $ echo 'release fileA' > fileA $ git add fileA ; git commit -m 'release fileA' [release 53f3564] release fileA  1 files changed, 1 insertions(+), 1 deletions(-) 

Nothing special has happened yet: version control is merely working as it’s supposed to at this point.

Now, we implement Feature B back on master.

$ git checkout master Switched to branch 'master' $ touch featureB ; echo 'With Feature B' >> fileA $ git add featureB fileA ; git commit -m 'Feature B' [master 443030f] Feature B  1 files changed, 1 insertions(+), 0 deletions(-)  create mode 100644 featureB 

Try to contain your excitement.

Here is where our special merge driver comes into play. Our hero wants to merge the new code from master into release. First switch branches.

$ git checkout release Switched to branch 'release' 

Sanity check that fileA contains what we expect.

$ cat fileA release fileA 

Merge Feature B from master.

$ git merge master Auto-merging fileA Merge made by recursive.  0 files changed, 0 insertions(+), 0 deletions(-)  create mode 100644 featureB 

The line Auto-merging fileA is a clue that something special happened. Indeed:

$ cat fileA release fileA 

How It Works

The section "Defining a custom merge driver" in the gitattributes documentation explains.

The merge.*.driver variable’s value is used to construct a command to run to merge ancestor’s version (%O), current version (%A) and the other branches' version (%B). These three tokens are replaced with the names of temporary files that hold the contents of these versions when the command line is built …

The merge driver is expected to leave the result of the merge in the file named with %A by overwriting it, and exit with zero status if it managed to merge them cleanly, or non-zero if there were conflicts.

The custom ours driver uses almost none of this machinery, only the true command to exit with zero status. This achieves the desired effect because it starts with fileA from whichever branch we’re currently on — which is the result we want — then does nothing in the merge-overwrite phase (i.e., ignores the other branch’s version named by %B), and finally tells git all is well with a successful exit status.

</div
 
 
   
   

関連する質問

0  外部からロードされたのと同じバージョンのjQueryの2つの異なる亜種  ( Two different variants of the same version of jquery loaded externally ) 
注:これはjQueryの2つの異なるバージョンよりもさまざまな問題です(ここに記載されているもの:)この違いは、同じバージョン番号のjQueryのjQueryの2コピーですが、外部ソースをロードすると、jQueryを使用した2つの異なるバージョンの通常のソリ...

0  特定のPythonバージョンでPythonスクリプトを起動するコマンドラインを実行するPythonスクリプト  ( Python script to run command line which starts python script with specific pytho ) 
私はいくつかの助けが必要です。 PythonをWindowsでコマンドラインを起動させる可能性はあり、コマンドラインにPC上の別のPythonバージョンでスクリプトを実行させることができますか? ExpAmple:PCに2つのバージョンのPythonがありま...

0  Microsoft Windows 10でPyenv / Pyenv-Winを使用してPythonバージョンをインストールする方法?  ( How to install a python version using pyenv pyenv win in microsoft windows 10 ) 
TLDR Pyenv-Winを使用して3.6.10をインストールできず、3.6.8のみをインストールできます。 ref <コード> pyenv global ref 詳細 私はガイド付きPyenv-winをインストールしましたここと次の出力...

76  Bower:2バージョンのjQueryをインストールします  ( Bower install 2 versions of jquery ) 
Bower を使って2バージョンのjQuery のインストール方法についてどう思いますか?ブラウザサポートフォールバックには、v2.0と1.9.1を持ちたいです。 私が bower install jquery#1.9.1 jquery#2.0.0 を実行し...

1  NET 4.0の互換性は何ですか?  ( What is the compatibility on net 4 0 ) 
さまざまなサーバーの.NET 3.5(Windows Services、Webアプリケーション、およびWCFサービス)には、いくつかの.NETアプリケーションが開発されました。 .NET 4.0に移行し、vs.net 2010を使用します。 vs.ne...

2  Java - CodeBaseの分割からのマルチバージョンアプリケーションを保持する  ( Java keeping multi version application from splitting codebase ) 
私はいくつかの異なるバージョンで出荷するアプリケーションを書いています(最初はコードベースの約10のバリエーションが存在し、維持される必要があります)。もちろん、コードの98%などはさまざまなシステムの中で同じになり、コードベースを無傷のままにします。 私の質...

365  Mac OS Xと複数のJavaバージョン  ( Mac os x and multiple java versions ) 
MacOSに追加のJavaをインストールする方法は?私はJDK8をインストールし、それはうまく機能します。しかし今、開発目的のためのJDK7のインストールが必要です。 DMGファイルを介して古いバージョンをインストールしようとすると、警告が表示され、すでに新...

0  numpy py2.7がすでにインストールされている場合は、numpy py3.4をインストールする方法?  ( How to install numpy py3 4 when numpy py2 7 is already installed ) 
私はこれを長時間提供していませんでした、誰かが修正を指摘できることを願っています。 Python 2.7と3.4の両方を、MatplotLibやNumpyなどのPython 2.7のさまざまなパッケージと一緒にインストールしました。 MATPLOTLIBとそ...

6  Androidサポートライブラリのさまざまなバージョンを使用するための回避策  ( Workaround for using different versions of android support libraries ) 
これはbuild.gradleファイルに表示される警告メッセージを参照しています: すべてのcom.android.supportライブラリは、まったく同じバージョンを使用する必要があります 仕様(ミキシングバージョンがランタイムクラッシュにつながる可能...

0  複数のPythonバージョン:デフォルトのPythonバイナリを設定する方法  ( Multiple python versions how to set default python binary ) 
私はCentOS 6.4にPython 2.7.5をインストールしています。このPython 2.6はすでにインストールされています。 Python2.7は/ usr / local / binの下にあり、ライブラリ構成も正しいです。 .BASH_PROF...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有