GITがマスターをブランチにマージ


49

私は新しいブランチで新しい機能を開発しており、その一方でマスターブランチでかなりの数の変更をコミットしました。

マスターブランチを新しいブランチにマージして最新の状態に保ち、新しい機能が終了したらマージの競合が多くなりすぎないようにすることは可能ですか?


git-mergeを試しましたか?ここでヘルプ。
空手犬

回答:


56

あなたはどちらgit merge mastergit rebase master、またはこの場合、git rebaseを好むでしょう。

なぜならgit rebase、機能ブランチの変更がマスターブランチの変更の上に行われたかのようになり、バージョングラフが簡単になります。

リベース

例に取るとGitのリベースマニュアルgit rebase masterブランチにfeature

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

ただし、git rebaseブランチが配布されていない場合、または古いコミットA、B、Cが新しいコミットA '、B'、C '、およびFで置き換えられるため、ダウンストリームで混乱と余分な作業が発生する場合にのみ適しています以前はなかったG。

git rebase master分岐後の実際の結果featureは次のとおりです。

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

コミットA、B、Cはリベース後にぶら下がりますが、を通じて到達可能git reflog featureです。

マージ

誰かがあなたのブランチを引っ張った場合、またはあなたがどこかにそれをプッシュした場合、混乱ともう一方の端での余分な作業を避けるために、代わりにブランチにマージする必要があります。アップストリームリベースからの回復を参照してください。

これはgit merge masterin branch の結果ですfeature

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

または、git merge featureブランチmasterにいる場合、次のようになります。

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master

リベースを好む理由とその違いを説明する必要があります。Rebaseは線形履歴を作成します-これはこの質問に合わないかもしれません。
アンドレアスレーム

それをよく理解している場合:OK、新しい機能がまだ終了していない場合はmasterブランチをチェックアウトし、終了している場合はリベースする必要がありますか?
mnml

いいえ、機能ブランチをチェックアウトしてdoを実行git rebase masterすると、機能ブランチの変更が「リベース」され、マスターブランチの変更に「基づいて」行われます。masterブランチの変更がfeatureブランチの変更と競合する場合、gitはそれらを解決して続行するか、スキップするか、中止するかを尋ねます。確信が持てない場合は、テストブランチをチェックアウトして試してみてgit checkout -b test-feature featureください(機能ブランチの名前が「feature」であると仮定)。
クリストファーハマーストローム

2
「私のブランチがもう見えない」とはどういう意味ですか?とにかく、git rebaseブランチが配布されていない場合にのみ使用する必要がありますが、新しいブランチであると言ったので、それは残念です。リンク先のドキュメントのアップストリームリベースからの回復を参照してください。git merge代わりに使用する必要があります。またgit reflog、以前の機能ブランチヘッドを見つけるために使用できます。
クリストファーハンマルストロム

1
マージとリベースの違いに関する明確な説明を見たことはありません。ありがとうございました。
パウロ・ペドロソ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.