2009-04-07 20 views
158

私はGitを約1年間使っていて、それは素晴らしいと思っていますが、プロジェクトの2番目のバージョンを開始し、新しいブランチを開始しました。私は、今後のことを処理する最善の方法で少し苦労しています。git - マージするときに特定のコミットをスキップする

私はsay master10(v1)とmaster20(v2)という2つのブランチを持っています。私は支店master10のv1でバグ修正を行い、master20の新しいものを開発しています。バグ修正を行うたびにmaster20をチェックしてgit merge master10を実行してv2にマージします。ここまでは順調ですね。

しかし、私はv2で必要としないv1を変更しましたが、他のバグ修正のマージを続けたいと思います。特定のコミット(またはコミットの範囲)をスキップするようにGitに指示するにはどうすればよいですか?しかし、今後も他のバグ修正をマージしたいと考えています。

私はgit rebaseが私が必要とするかもしれないと思ったが、医師と私の頭がほとんど爆発したと思った。

私が望むのは、gitに2つのブランチが同期していることを伝える "git sync"コマンドのようなものだと思うし、将来このsync-pointからのコミットだけをマージします。

助けてください。

答えて

234

"maint"ブランチのコミットのすべてではなく、ほとんどを "master"にマージしたい場合は、これを行うことができます。上で述べたように、通常はブランチからすべてをマージするのが普通ですが、時には統合してはならないリリースのバージョンに変更を加えたことがあります。すでにマスターに置き換えられています)、どうやってそれを表現していますか?ここに行く...

maintに5つの変更が適用されていて、それらのうちの1つ(maint〜3)は、他のすべてがそうでなければならないが、マスターにマージされないと仮定しよう。これは3段階で行います。実際にはすべてをマージし、gitにmaint〜3がマージされていない場合でもそれをマージするように指示し、残りをマージします。魔法は次のとおりです。

bash <master>$ git merge maint~4 
bash <master>$ git merge -s ours maint~3 
bash <master>$ git merge maint 

最初のコマンドは、マスターにコミットあなたの面倒なのmaint前にすべてをマージします。デフォルトのマージログメッセージは、 "branch 'maint(早期部分)をマージしていることを説明します。

2番目のコマンドは、手間のかかるmaint〜3のコミットをマージしますが、 "-s ours"オプションはgitに、実際にマージしているツリーを保持して無視するという特別な "マージ戦略"あなたが完全にマージしているコミット。しかし、HEADとmaint〜3を親として新たにマージコミットするので、リビジョングラフにmaint〜3がマージされるようになりました。だから実際には、おそらく-mオプションを 'git merge'に使ってmaint〜3のコミットが実際に無視されていることを説明したいでしょう!

最後のコマンドは、残りのmaint(maint〜2..maint)をマスターにマージして、すべてが再び同期されるようにします。

+0

しかし、それは少し危険ではないかと思います。マストは何ですか?3は無視してはならず、単に延期してはいけませんか?あなたの解決策では、その後のgitマージmaintはマスト〜3をマージしません。 – VonC

+1

コミットを延期するために、私は "サブブランチ"を作成し、あなたが何を記述するか(git merge -s ours maint〜3を含む)を行い、サブブランチからマスターまでのすべてをマージします。私は将来の "git merge maint"が今度は "mast〜3"をマージすると信じています – VonC

+2

私はあなたがそのコミットをマージするのを延期する必要があるならば、それをスキップする(merge -s ours)チェリーピックコマンドコミットがマスターから到達可能になると、再度マージすることはできません。同じ変更を2回マージすることを避けることは、主要なgitの目標の1つです。 – araqnid

0

master10には必要であるがmaster20には不要な変更点の3番目のブランチを作成します。 master10は常にマスターの中で最も安定していると考えてください。他のすべてのブランチのブランチは常に同期しています。

+0

私はうまくいくと思いますが、私はすでにこの状態に入っており、3番目のブランチはおそらく私をさらに混乱させるでしょう。 :) –

15

コミットには祖先が含まれます。前のコミットをマージせずにコミットをマージすることはできません。

もちろん、それらをチェリーピックすることができます。メンテナンスモードになっているブランチを持っていると、それは良い流れです。

+1

ありがとう、チェリーピックは仕事をします。私が望んでいたものほど素晴らしくはありませんが、それはしません。 –

26

IMHOは、最も論理的なことはにすべてをマージしてからgit revert(commit_you_dont_want)を使ってを削除することです。

例:

git merge master 
git revert 12345678 

あなたは "への無視" コミット、またはメッセージを元に戻す編集したい複数持っている場合:

| ... Except 123456 and abcdef 
|\ Merge branch 'master' into 'your_branch' 

git merge master 
git revert -n 123456 
git revert -n abcdef 
git commit -m "... Except commits 123456 and abcdef" 

を次に、あなたの歴史はのように見えるかもしれ

これらの「無視する」コミットのみを含む競合が発生した場合は、

git merge master -X ours 

したがって、あなたのバージョンは他のバージョンよりも持続します。エラーメッセージがなくても、コンフリクトのない他の変更があり、依然としてそれらを必要としないため、それらの不要なコミットを "元に戻す"ことができます。

「無視する」コミットだけではなく、競合が発生している場合は、手動で解決する必要があります。復帰時に再解決する必要があります。

+1

その後、それらのリルートされたコミットを問題のブランチにマージしたい場合、Gitはそれらを無視しますか? –

+0

@AnriëtteMyburgh "merge -s ours"戦略では、復帰コミットを元に戻すことができます。 – ikdc

2

私のprojectへの広告の一種で、基本的に@araqnidで記述されたプロセスを包みます。

それは、次のGITの流れを紹介ヘルパーのようなものだ:ステータスのDEV/masterブランチへのメンテナンスブランチからの保留中のマージの毎日/毎週の通知があります

  • 分岐メンテナチェックと/彼を決定すべてのコミットが必要かどうかを判断し、それらをブロックするか、開発者にブロックするように求めます。最終的には、支店支店に統合されます。それはマスターブランチと一緒にメンテナンスや 顧客固有の支店を持つことが可能ですワークフローによって

    :プロジェクトページから

引用。これらの ブランチは、LTSブランチとも呼ばれます。

多くの場合、ホットフィックスは、バグが と報告されたブランチに入り、コミットがマスターブランチにマージされます。

一般的な練習はあなたのマスターは、すべて 機能とバグ修正が含まれているかどうかを理解するために、特定の ブランチとマスターとの間に明確なデルタを見たいすべてのブランチが完全に マスター、すなわちと同期していることです。

しかし、特定のコミットを望まないのは、顧客固有の であり、他のユーザーには表示されないためです。またはあなたの マスターブランチがそれほど大きく分かれていないので、全く別の アプローチを使用して問題を解決する必要があります。問題が解決しない場合は、 が存在します。

masterからmaintenanceブランチにチェリーピックする場合は、 結果のコミットはマスターでブロックされます。

関連する問題