私のリポジトリには、というブランチがあります aq
私が作業しているあります。
その後、で新しい作業とバグをコミットしましたmaster
。
これらのコミットをaq
ブランチに入れるための最良の方法は何ですか?から別の新しいブランチを作成し、master
それをaq
?
git pull origin my_branch_name
私のリポジトリには、というブランチがあります aq
私が作業しているあります。
その後、で新しい作業とバグをコミットしましたmaster
。
これらのコミットをaq
ブランチに入れるための最良の方法は何ですか?から別の新しいブランチを作成し、master
それをaq
?
git pull origin my_branch_name
回答:
aq
ブランチをチェックアウトし、からリベースしmaster
ます。
git checkout aq
git rebase master
git merge
より良いでしょう。両方のブランチが時間とともに進化した場合は、どちらが最適かを検討する必要があります。
あなたはgit merge origin/master
あなたがあなたのaqブランチにいるときにちょうどできるはずです。
git checkout aq
git merge origin/master
rebase
ブランチがローカルで、にプッシュされていない場合に使用しますorigin
。merge
ブランチがすでにプッシュされている場合に使用します。rebase
履歴を書き換えます。
まず、マスターにチェックアウトします。
git checkout master
すべての変更、修正プログラム、コミットを行い、マスターをプッシュします。
ブランチ「aq」に戻り、マスターをマージします。
git checkout aq
git merge master
あなたのブランチはマスターで最新になります。マージの良い基本的な例は、3.2 Gitブランチ-基本的なブランチとマージです。
マスターのバグ修正が他のコミットに含まれていないという保証はないため、単純にマージすることはできません。行う
git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...
これらのコミットがバグ修正を表すと仮定します。
ただし、今後は、バグ修正を別のブランチに保管してください。あなただけができるようになります
git merge hotfixes
それらすべてを通常のdevブランチにまとめたい場合。
これ(ここから)は私のために働きました:
git checkout aq
git pull origin master
...
git push
引用:
git pull origin master
マスターブランチのコンテンツをフェッチしてブランチにマージし、マージコミットを作成します。マージの競合がある場合は、この段階で通知され、続行する前にマージコミットを解決する必要があります。新しいマージコミットを含むローカルコミットをリモートサーバーにプッシュする準備ができたら、を実行しgit push
ます。
これは、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/…を参照してください。)
編集:
ドキュメント以下の私の答えマージへの道master
にaq
あなたはそれが上で行われた変更一覧表示されますマージの詳細表示する場合、aq
マージする前には、いない変更がで作られましたmaster
。あなたがそう思っているとしても、それはおそらくあなたが望むものではないことに気づきました!
ただ:
git checkout aq
git merge master
結構です。
はい、この単純なマージは、からの変更master
がaq
その時点で行われたことを示します。その逆ではありません。しかし、それは大丈夫です–それが起こったことだからです!後で、最終的にブランチをにマージするとmaster
、つまり、マージが最終的に加えられたすべての変更を表示しますmaster
(これはまさにあなたが望むものであり、人々がとにかくその情報を見つけることを期待するコミットです)。
私が確認したところ、最後のすべてをにマージすると、上記の通常のアプローチとまったく同じ変更(元のとの間の分割aq
以降に行われたすべての変更)も表示されます。だから私はその唯一の本当の欠点(複雑すぎて非標準であることを除いて...:-/)は、最近の変更をn回巻き戻し、これがマージを超えた場合、以下のバージョンがロールバックすることです「間違った」ブランチ。手動で修正する必要があります(例:&)。aq
master
master
git reset --hard HEAD~<n>
git reflog
git 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が失われます。これも私が望んでいることではありません。
シナリオ:
解決
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」を実行すると、ファイルの競合を見つけることができます。手動で修正する必要があり、プッシュする準備が整いました。