Gitでマスターからブランチに変更を取得する


689

私のリポジトリには、というブランチがあります aq私が作業しているあります。

その後、で新しい作業とバグをコミットしましたmaster

これらのコミットをaqブランチに入れるための最良の方法は何ですか?から別の新しいブランチを作成し、masterそれをaq


3
将来的には、修正を必要とするマスターと他のブランチの共通の祖先からバグ修正ブランチを開始することもできるため、他の何も選択せずにそれらすべてのブランチにマージできます。
カスカベル

2
@Jefromiが、彼がプロジェクトに取り組んでいる唯一の人物でない場合、彼のコントロールの外にあります。他の人がマスターを更新します。地獄、あなた自身が3番目のブランチからマスターを更新する可能性があり、状況は避けられず、一般的な解決策が必要です。
ahnbizcad 2015

@ahnbizcad彼が自分のブランチをどこから始めるかは彼がコントロールしていると確信しています。彼のブランチがマージしたいブランチの共通の祖先であり、その後人々がそれらのブランチに追加した場合、それはまだ共通の祖先です。
Cascabel

みんなの質問、このコマンドはそれをしますかgit pull origin my_branch_name
Basheer AL-MOMANI '16

回答:


794

aqブランチをチェックアウトし、からリベースしmasterます。

git checkout aq
git rebase master

他のブランチからリベースできますか?つまり。git rebase otherbranch?私の質問には少しずれていたようです。ブランチからブランチしてから、元のブランチに変更を加えました。
Slee

2
正しい場合は、プルリクエストに基づいてリベースすると、すべてのマスターコミットが表示されます。merge / origin masterを使用すると、すべてのマスターコミットが1つのコミットとして表示され、コードのレビューが容易になります。
Foo Barユーザー

4
時には、git mergeより良いでしょう。両方のブランチが時間とともに進化した場合は、どちらが最適かを検討する必要があります。
erick2red

70
後期パーティーに、しかしこれは、マージ対リベースする際の偉大な概要です:atlassian.com/git/tutorials/merging-vs-rebasing/...
ebuat3989

7
ブランチaqでの以前のコミットが公開されている場合は、リベースを行わないでください。 atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

あなたはgit merge origin/masterあなたがあなたのaqブランチにいるときにちょうどできるはずです。

git checkout aq
git merge origin/master

55
リベースが「より良い」かどうかは、特定の状況に完全に依存します。
ボンベ

13
なぜ「git merge origin / master」の代わりに「git merge master」を呼び出さないのですか?
MichaelKüller2013年

145
rebaseブランチがローカルで、にプッシュされていない場合に使用しますoriginmergeブランチがすでにプッシュされている場合に使用します。rebase履歴を書き換えます。
garbagecollector 2014

17
@Toskanを使用すると、ローカルマスターがリモートで最新でないという問題が発生する可能性があります。これにより、コードのリモートコピーに確実にマージされます。
Chris Kooken

8
@garbagecollectorリベースに反対です(リベースはできますが、リベースはしません)リベースでギャンブルする理由はありません。それは物事を不必要に複雑にするだけです。「これをリモートにプッシュしましたか?」という質問が常にあります。熟考し、新規参入者に説明するのは苦痛です。マージコミットを回避すると言う人もいます。しかし、私はマージコミットをしたいです。それらは乱雑ではなく、ブランチがマージされるときに文書化されます。だから最後に、私たち全員がマスターすることを約束しているように、私たちは最終的に行動をやめることができますか?ログのマージコミットが嫌いな場合は、-no-mergesを使用してそれらをフィルタリングしてください。
ヌレッティン

92

まず、マスターにチェックアウトします。

git checkout master

すべての変更、修正プログラム、コミットを行い、マスターをプッシュします。

ブランチ「aq」に戻り、マスターをマージします。

git checkout aq
git merge master

あなたのブランチはマスターで最新になります。マージの良い基本的な例は、3.2 Gitブランチ-基本的なブランチとマージです。


25

マスターのバグ修正が他のコミットに含まれていないという保証はないため、単純にマージすることはできません。行う

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

これらのコミットがバグ修正を表すと仮定します。

ただし、今後は、バグ修正を別のブランチに保管してください。あなただけができるようになります

git merge hotfixes

それらすべてを通常のdevブランチにまとめたい場合。


17

cherry-pick関連するコミットをブランチにaqマージするか、ブランチmasterをブランチにマージしaqます。


5
@Sleeあなたは自分で答えました...それはこの状況の解決策ではありません
mtet88



7

私にとっては、すでに変更があり、ベースブランチから最新のものを入手したいと思っていました。私にはできなかったしrebasecherry-pick永遠にかかるはずだったので、次のようにした:

git fetch origin <base branch name>  
git merge FETCH_HEAD

したがって、この場合:

git fetch origin master  
git merge FETCH_HEAD

7

これ(ここから)は私のために働きました:

git checkout aq
git pull origin master
...
git push

引用:

git pull origin masterマスターブランチのコンテンツをフェッチしてブランチにマージし、マージコミットを作成します。マージの競合がある場合は、この段階で通知され、続行する前にマージコミットを解決する必要があります。新しいマージコミットを含むローカルコミットをリモートサーバーにプッシュする準備ができたら、を実行しgit pushます。


このソリューションは、特にマージが必要な場合、つまり、何らかの理由でマスターブランチをリベースできない場合に最適であることに注意してください。
cudacoder

3

いくつかのオプションがあります。git rebase master aqコミット名を保持するブランチに。ただし、これがリモートブランチの場合はリベースしないでください。git merge master aqコミット名を保持する必要がない場合は、これを行うことができます。コミット名を保持する必要があり、それがリモートブランチである場合git cherry-pick <commit hash>、コミットはブランチにコミットされます。


0

これは、1行で実行することもできます。
git merge aq master

これは

git checkout aq
git merge master

これはあなたが思っていることをしていません。git merge a bブランチaをマージbして現在のブランチに入れます。しかしgit merge a、ブランチにいるときaは何もしません(これが、あなたが思っていることをやっているように見える理由です)。(git-scm.com/docs/git-merge#Documentation/…を参照してください。)
MikeBeaton

0

編集:

ドキュメント以下の私の答えマージへの道masteraqあなたはそれが上で行われた変更一覧表示されますマージの詳細表示する場合、aqマージする前には、いない変更がで作られましたmaster。あなたがそう思っているとしても、それはおそらくあなたが望むものではないことに気づきました!

ただ:

git checkout aq
git merge master

結構です。

はい、この単純なマージは、からの変更masteraqその時点で行われたことを示します。その逆ではありません。しかし、それは大丈夫です–それが起こったことだからです!後で、最終的にブランチをにマージするとmaster、つまり、マージが最終的に加えられたすべての変更を表示しますmaster(これはまさにあなたが望むものであり、人々がとにかくその情報を見つけることを期待するコミットです)。

私が確認したところ、最後のすべてをにマージすると、上記の通常のアプローチとまったく同じ変更(のとの間の分割aq以降に行われたすべての変更)も表示されます。だから私はその唯一の本当の欠点(複雑すぎて非標準であることを除いて...:-/)は、最近の変更をn回巻き戻し、これがマージを超えた場合、以下のバージョンがロールバックすることです「間違った」ブランチ。手動で修正する必要があります(例:&)。aqmastermastergit reset --hard HEAD~<n>git refloggit reset --hard [sha]


[つまり、私が以前考えていたのは、次のことでした。]

に問題があります:

git checkout aq
git merge master

マージコミットに表示される変更(たとえば、Github、Bitbucket、またはお気に入りのローカルgit履歴ビューアーで現在または後で確認する場合)は、マスターで行われた変更であり、希望どおりではない場合があるためです。

一方

git checkout master
git merge aq

ショーおそらく水溶液に加えられた変更、ですあなたが欲しいものを。(または、少なくとも、たいていはそれが私が欲しいものです!)しかし、正しい変更を示すマージは間違ったブランチにあります!

対処方法は?!

(上記の2番目のマージに従って)aqに加えられた変更を示すマージコミットで終了するが、マージがaqブランチに影響を与える完全なプロセスは次のとおりです。

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

これ:aqをマスターにマージし、同じマージをaqに早送りし、マスターで元に戻し、再びaqに戻します!

私は何かが足りないように感じます-これは明らかにあなたが望んでいるものであり、実行するのが難しいもののようです。

また、リベースは同等ではありません。aqで行われたコミットのタイムスタンプとIDが失われます。これも私が望んでいることではありません。


0

シナリオ:

  • 私はマスターからブランチ1を作成し、ブランチ1をローカルにプルしました。
  • 私の友人はマスターからブランチを作成し、ブランチ2と言います。
  • 彼はいくつかのコード変更をマスターにコミットしました。
  • 次に、これらの変更をマスターブランチからローカルブランチに適用します。

解決

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

「git stash apply」を実行すると、ファイルの競合を見つけることができます。手動で修正する必要があり、プッシュする準備が整いました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.