Gitマージマスターを機能ブランチに

2013年06月06日に質問されました。  ·  閲覧回数 1.5M回  ·  ソース

theomega picture
2013年06月06日

Gitに次のような状況があるとしましょう。

  1. 作成されたリポジトリ:

    mkdir GitTest2
    cd GitTest2
    git init
    
  2. マスターでいくつかの変更が行われ、コミットされます。

    echo "On Master" > file
    git commit -a -m "Initial commit"
    
  3. Feature1はマスターから分岐し、いくつかの作業が行われます。

    git branch feature1
    git checkout feature1
    echo "Feature1" > featureFile
    git commit -a -m "Commit for feature1"
    
  4. その間に、マスターコードでバグが発見され、ホットフィックスブランチが確立されます。

    git checkout master
    git branch hotfix1
    git checkout hotfix1
    
  5. バグはホットフィックスブランチで修正され、マスターにマージされます(おそらくプルリクエスト/コードレビューの後):

    echo "Bugfix" > bugfixFile
    git commit -a -m "Bugfix Commit"
    git checkout master
    git merge --no-ff hotfix1
    
  6. feature1の開発は継続されます:

    git checkout feature1
    

機能ブランチにホットフィックスが必要だとしましょう。おそらくバグもそこで発生しているからです。 コミットを機能ブランチに複製せずにこれを達成するにはどうすればよいですか?

機能の実装とは関係のない、機能ブランチでの2つの新しいコミットを防止したいと思います。 プルリクエストを使用する場合、これは特に重要に思えます。これらのコミットもすべてプルリクエストに含まれ、これはすでに実行されていますが(修正プログラムはすでにマスターにあるため)、確認する必要があります。

git merge master --ff-only : "致命的:早送りできず、中止できません。"はできませんが、これが役に立ったかどうかはわかりません。

回答

Sven picture
2013年06月06日
1377

マスターブランチを機能ブランチにマージするにはどうすればよいですか? 簡単:

git checkout feature1
git merge master

ここでは早送りマージを強制することはできないため、意味がありません。 機能ブランチとマスターブランチの両方にコミットしました。 現在、早送りは不可能です。

GitFlowをご覧ください。 それは従うことができるgitの分岐モデルであり、あなたは無意識のうちにすでにそうしました。 また、Gitの拡張機能であり、手動で実行する必要があることを自動的に実行する新しいワークフローステップのコマンドを追加します。

では、ワークフローで何をしましたか? 使用するブランチは2つあり、feature1ブランチは基本的にGitFlowモデルの「開発」ブランチです。

マスターからホットフィックスブランチを作成し、マージして戻しました。 そして今、あなたは立ち往生しています。

GitFlowモデルでは、修正プログラムを開発ブランチ(この場合は「feature1」)にもマージするように求められます。

したがって、本当の答えは次のようになります。

git checkout feature1
git merge --no-ff hotfix1

これにより、修正プログラム内で行われたすべての変更が機能ブランチに追加されますが、それらの変更のみが追加されます。 それらはブランチ内の他の開発変更と競合する可能性がありますが、最終的に機能ブランチをマスターにマージして戻した場合でも、マスターブランチと競合することはありません。

リベースには十分注意してください。 変更がリポジトリに対してローカルのままである場合にのみリベースします。たとえば、ブランチを他のリポジトリにプッシュしなかった場合などです。 リベースは、ローカルコミットを有用な順序に並べてから世界にプッシュするための優れたツールですが、後でリベースすると、あなたのようなgit初心者にとっては混乱します。

David Sulc picture
2013年06月06日
639

ブランチをマスターにリベースできるはずです。

git checkout feature1
git rebase master

発生するすべての競合を管理します。 バグ修正(すでにマスターにある)を使用してコミットに到達すると、Gitは変更がなく、おそらくすでに適用されていると言います。 次に、(すでにマスターにあるコミットをスキップしながら)リベースを続行します。

git rebase --skip

機能ブランチでgit logを実行すると、バグ修正コミットが1回だけ、マスター部分に表示されます。

詳細については、この正確なユースケースをカバーするgit rebasehttps://git-scm.com/docs/git-rebase )のGitブックのドキュメントをgit rebaseください

================追加のコンテキスト用に編集====================

この回答は、@ theomegaが特定の状況を考慮して尋ねた質問に対して、特に提供されました。 この部分に注意してください:

機能の実装とは関係のない機能ブランチでの[...]コミットを防止したい。

彼のプライベートブランチをマスターにリベースすることは、まさにその結果をもたらすものです。 対照的に、マスターをブランチにマージすると、彼が特に望んでいないことを正確に実行できます。つまり、ブランチを介して作業している機能の実装に関係のないコミットを追加します。

質問のタイトルを読んだユーザーに対応するには、質問の実際の内容とコンテキストをスキップし、(異なる)ユースケースに常に当てはまると仮定して、トップの回答のみを盲目的に読んでください。

  • プライベートブランチのみをリベースします(つまり、ローカルリポジトリにのみ存在し、他のブランチと共有されていません)。 共有ブランチのリベースは、他の人が持っている可能性のあるコピーを「破壊」します。
  • ブランチ(マスターまたは別のブランチ)からの変更をパブリックなブランチに統合する場合(たとえば、ブランチをプッシュしてプルリクエストを開いたが、マスターと競合しているため、更新する必要がある場合それらの競合を解決するためのブランチ)それらをマージする必要があります(たとえば、@ Svenの回答のようにgit merge masterを使用)。
  • 必要に応じて、ブランチをローカルのプライベートブランチにマージすることもできますが、ブランチで「外部」コミットが発生することに注意してください。

最後に、@ theomegaの場合でも、この回答が自分の状況に最適ではないという事実に不満がある場合は、以下にコメントを追加しても特に役立ちません。どの回答を選択するかは制御できません。 @theomegaだけがそうします。

zimi picture
2014年06月09日
71

この記事に基づいて、次のことを行う必要があります。

  • マスターの新しいバージョンに基づく新しいブランチを作成します

    git branch -b newmaster

  • 古い機能ブランチを新しい機能ブランチにマージします

    git checkout newmaster

  • 新機能ブランチの競合を解決する

最初の2つのコマンドは、 git checkout -b newmaster組み合わせることができます。

このようにすると、バックマージが不要になるため、履歴が明確に保たれます。 また、Gitのリベースを行う必要がないため、それほど慎重である必要はありません。

xgqfrms picture
2019年11月12日
55

git merge

以下の手順に従ってください

1. origin/masterブランチをfeatureブランチにマージします

# step1: change branch to master, and pull to update all commits
$ git checkout master
$ git pull

# step2: change branch to target, and pull to update commits
$ git checkout feature
$ git pull

# step3: merge master to feature(⚠️ current is feature branch)
$ git merge master


2. featureブランチをorigin/masterブランチにマージします

origin/masterはリモートマスターブランチであり、 masterはローカルマスターブランチです

$ git checkout master
$ git pull origin/master

$ git merge feature
$ git push origin/master

jkdev picture
2017年03月08日
27

Zimiの回答は、このプロセスを一般的に説明しています。 詳細は次のとおりです。

  1. 新しいブランチを作成して切り替えます。 新しいブランチがmaster基づいていることを確認して、最新の修正プログラムが含まれるようにします。

    git checkout master
    git branch feature1_new
    git checkout feature1_new
    
    # Or, combined into one command:
    git checkout -b feature1_new master
    
  2. 新しいブランチに切り替えた後、既存の機能ブランチからの変更をマージします。 これにより、修正プログラムのコミットを複製せずにコミットが追加されます。

    git merge feature1
    
  3. 新しいブランチで、機能とマスターブランチ間の競合を解決します。

完了しました。 次に、新しいブランチを使用して、機能の開発を続けます。

Aaron M. picture
2018年11月13日
12

これは、マスターブランチを現在のブランチにマージするために使用できるスクリプトです。

スクリプトは次のことを行います。

  • マスターブランチに切り替えます
  • マスターブランチをプルします
  • 現在のブランチに戻ります
  • マスターブランチを現在のブランチにマージします

このコードをバッチファイル(.bat)として保存し、リポジトリ内の任意の場所にスクリプトを配置します。 次に、それをクリックして実行すると、設定が完了します。

:: This batch file pulls current master and merges into current branch

@echo off

:: Option to use the batch file outside the repo and pass the repo path as an arg
set repoPath=%1
cd %repoPath%

FOR /F "tokens=*" %%g IN ('git rev-parse --abbrev-ref HEAD') do (SET currentBranch=%%g)

echo current branch is %currentBranch%
echo switching to master
git checkout master
echo.
echo pulling origin master
git pull origin master
echo.
echo switching back to %currentBranch%
git checkout %currentBranch%
echo.
echo attemting merge master into %currentBranch%
git merge master
echo.
echo script finished successfully
PAUSE
Bob Gilmore picture
2013年10月02日
10

「チェリーピック」を実行して、必要な正確なコミットを機能ブランチにプルできる場合があります。

git checkout hotfix1を実行して、hotfix1ブランチにアクセスします。 次に、 git logを実行して、問題のコミットのSHA-1ハッシュ(コミットを一意に識別するランダムな文字と数字の大きなシーケンス)を取得します。 それ(または最初の10文字程度)をコピーします。

次に、 git checkout feature1を使用して、機能ブランチに戻ります。

次に、 git cherry-pick <the SHA-1 hash that you just copied>

これにより、そのコミットだけが機能ブランチにプルされます。 その変更はブランチにあります。それを「チェリーピック」するだけです。次に、作業を再開し、編集、コミット、プッシュなどを心ゆくまで行います。

最終的に、あるブランチから機能ブランチに(またはその逆に)別のマージを実行すると、Gitは、その特定のコミットで既にマージされ

desmond13 picture
2020年07月08日
5

私は他の人と同じように私の答えを追加しますが、おそらくそれを読んで実装するのが最も速いでしょう。

注:この場合、リベースは必要ありません。

repo1と2つのブランチmasterdev-userがあると仮定します。

dev-userは、 master特定の状態で実行されるブランチです。

ここで、 dev-usermaster両方が進んでいると仮定します。

ある時点で、 dev-usermaster行われたすべてのコミットを取得させたいと思います。

どうすればいいのですか?

git checkout master 
git pull 
git checkout dev-user
git pull
git merge master 
git push 

これが同じ状況で他の誰かに役立つことを願っています。

Tony picture
2020年05月15日
0

私は機能ブランチにいて、リファクタリングを行いました。 マスターの変更を機能ブランチにマージしたいと思います。 私ははるかに遅れています。 機能ブランチのモジュールが1つの場所から別の場所に移動されているため、マスターの変更をローカルにプルしたくないことに注意してください。 プルせずに以下を実行するだけでは機能しないことがわかりました。 「すでに最新です」と表示されます。

 //below does not get the latest from remote master to my local feature branch without git pull
    git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge master

これは以下で機能します。gitmergeorigin/ masterを使用することに注意してください。

 git checkout master 
    git fetch 
    git checkout my-feature-branch 
    git merge origin/master
fabriciorissetto picture
2020年11月14日
0

他の回答を補完するために、これらのコマンドは繰り返し発生するため、連続して実行できます(機能ブランチにいる場合)。

git checkout master && git pull && git checkout - && git merge -

または、エイリアスに追加します。

alias merge_with_master="git checkout master && git pull && git checkout - && git merge -"