マスターから開発ブランチへのgit pull


496

dmgr2(開発)というブランチがあり、マスターブランチ(ライブサイト)からプルして、すべての変更を開発ブランチに組み込みたいです。これを行うより良い方法はありますか?変更をコミットした後、私が計画していたことは次のとおりです。

git checkout dmgr2
git pull origin master

これにより、ライブの変更が開発ブランチに取り込まれますか、それとも間違っていますか?


1
まず、dmgr2ブランチですべての変更をコミットします。次に、masterをポイントします1.git checkout masterそして最新の変更を取得します2.git pull 3.git merge dmgr2 4.git push -u origin masterその後、dmgr2に戻ります5.git checkout dmgr2
mat_vee

私はすでにすべての変更をdmgr2ブランチにコミットしました。それを追加するのを忘れてしまいました
Matthew Colley

1
手順4を実行すると、開発の変更がマスターにプッシュされますか?やりたくない
マシュー・コリー

それで、あなたが言っていることは、あなたのマスターブランチからあなたの開発ブランチに変更をもたらしたいということですか?
JcKelley 2013年

9
devブランチに切り替えますgit checkout dev。その後git pull --rebase origin master。運が良ければ、競合は発生せず、開発者はマスターからの最新の変更を取得します。
jww 2016年

回答:


725

リストした手順は機能しますが、より多くのオプションを提供する長い方法があります。

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

fetchコマンドは、前の任意の時点で行うことができますmergeので、つまり、あなたは、フェッチとチェックアウトの順序を入れ替えることができますfetchだけでリモート(という名前にオーバー行くorigin)とそれに言う:「あなたは私にはないことを持っているギミのすべてのもの"、つまり、すべてのブランチですべてのコミット。それらはリポジトリにコピーされますが、リモートでorigin/branch名前が付けられたブランチの名前が付けられますbranch

この時点git loggitk、任意のビューア(、、など)を使用して、自分が「持っていないもの」を確認したり、その逆を行ったりできます。これはウォームファジーフィーリングにのみ役立つ場合があります(「はい、そうです、それが実際に私が望んでいることです」)。

最後に、mergeコマンドは指定されたコミットを受け取ります。これはと名付けることができorigin/master、そのコミットとその祖先を、を実行するときに現在のブランチに持ち込むために必要なことをすべて実行しmergeます。挿入し--no-ffたり--ff-only、早送りを禁止したり、結果が早送りの場合のみマージしたりできます。

シーケンスを使用する場合:

git checkout dmgr2
git pull origin master

このpullコマンドはgitに実行を指示しgit fetch、次にと道徳的に同等のものを指示しますgit merge origin/master。したがって、これは2つの手順を手作業で行うのとほとんど同じですが、微妙な違いがあり、あまり気にしていない可能性があります。(特に、fetchstep runはpullbringover only origin/masterであり、リポジトリのrefを更新しません。1新しいコミットは、特別なFETCH_HEAD参照によってのみ参照されます。)

より明示的なgit fetch origin(次にオプションで見回す)git merge origin/masterシーケンスを使用する場合は、独自のローカルをmasterリモートで最新にしfetchて、ネットワーク全体で1つだけ実行することもできます。

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

例えば。


1この2番目の部分は変更されました(私は「修正済み」と言います)git 1.8.4で、「リモートブランチ」参照を便宜的に更新します。(リリースノートにあるように、更新をスキップするという意図的な設計上の決定でしたが、より多くの人がgitによる更新を好むことがわかりました。古いリモートブランチのSHA-1が必要な場合は、デフォルトで次の場所に保存されます。 、したがってreflogから回復可能です。これにより、上流のリベースを見つけるための新しいgit 1.9 / 2.0機能も有効になります。)


28
私は、ええと、友達を求めています-ここにある最初のコードブロック(チェックアウト/フェッチ/マージ)を元に戻すにはどうしますか?
リッチブラッドショー

10
@RichBradshaw:git checkout通常は非破壊的で、通常はを元に戻す理由はないためgit fetch、マージコミットを取り消す方法を尋ねているように見えます。答えは他のコミットと同じです:git resetまたはgit revert。以下のために公開されていない変更git resetが最善の方法です。他の人がすでに持っている変更のために、git revertより良いかもしれないが、マージを元に戻すにリーナス・トーバルズのアドバイスを参照してください。kernel.org/pub/software/scm/git/docs/howto/...
torek

2
@WeDoTDD:質問が理解できません。そこコミットグラフを表示するためのコマンドの数が(あるgitkgit log --graphの有無にかかわらず--oneline、など)とのことができgit showたりgit show -m、マージコミット、または使用git diff。これらすべてのケースで、コマンドラインでコマンドを入力するときにプログラムを指定しています。
torek

1
@torek:git checkoutブランチ、次にgit pull origin masterを試しましたが、すべてのマスターの変更を単一の変更としてプルしましたが、コミット履歴とメッセージでプルするのではなく、ローカルで更新した後マスターしてブランチに切り替えると、「git rebase master」が解決するすべての競合を処理します。次に「git pull --rebase」に追加してすべての競合を再度処理し、次にgit push originブランチを調整してすべてを調整します。私にはそれのためのより良い方法があるはずだと思います-私は正しいですか?
user10556443

1
@torek:私が得た結果は、リベースとマージの繰り返しを処理することを余儀なくさせる面倒なプロセスであることに同意します...マスターから更新を取得するたびに...しかし、私が認めている提案された方法は非常により簡単に、マスターコミットの順序/履歴を維持せずに、ローカルブランチで単一のコミットされていない変更の下にすべての変更を取得 私は「プル」などを使用するために使用する「フェッチ」と必要なく、マスターのトラックを保つためにどのようにより良い提案を学ぶために喜んでいるよ
user10556443

14

状況:自分のローカルブランチで作業していますが、という名前の開発ブランチで最新情報を入手するのが大好きdevです。

解決策:通常、私は次のことを行います:

git fetch
git rebase origin/dev

15
通常の免責事項では、ローカルブランチがローカルのみである場合、つまり履歴を書き換えるときにプッシュされていない場合にのみ、リベースを実行する必要があります。
軌跡


3

シナリオ

私はマスターの更新とブランチの更新を行っています。ブランチにマスターのリベースを追跡させ、すべての履歴を適切に追跡させたいので、ブランチをMybranchと呼びましょう

ソリューション

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git push -f origin Mybranch
  • すべてが解決されるまで、状況とgitヒントに従って、git mergetool&、git rebase --continue、git rebase --skip、git add -uとのすべての競合を解決する必要があります

(Tzachi Cohenの厚意により、「-f」を使用して最後のステージに修正すると、サーバーでgitが「更新履歴」に強制されます)

ブランチはマスターに合わせてリベースし、リモートも更新する必要があります。そのため、gitログに「後ろ」または「先」はなく、ローカルの競合* .origファイルをすべて削除して、フォルダーを「クリーン」に保つ必要があります。

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