web-dev-qa-db-ja.com

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

私はdmgr2(development)と呼ばれるブランチを持っていて、マスターブランチ(live site)から引っ張って全ての変更を私の開発ブランチに取り入れたいです。これを行うより良い方法はありますか?変更をコミットした後に、これが私が計画していたものです:

git checkout dmgr2
git pull Origin master

これは実際の変更を私の開発部門に引き込むべきですか、それとも私はこれが間違っているのですか?

378
Matthew Colley

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

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)に移動して、「すべてを手に入れます」と言うため、フェッチとチェックアウトの順序を入れ替えることができます。つまり、すべてのブランチでのすべてのコミット。これらはリポジトリにコピーされますが、リモートのbranchという名前のブランチの場合はOrigin/branchという名前になります。

この時点で、ビューアー(git loggitkなど)を使用して、「持っているもの」とそうでないものを確認できます。これは、Warm Fuzzy Feelingsにのみ有用な場合もあります(「ああ、そうです、実際に私が望むものです」)場合によっては、戦略を完全に変更するのに役立ちます(「おっと、まだそんなものは欲しくない」)。

最後に、mergeコマンドは、Origin/masterという名前の指定されたコミットを取得し、mergeを実行するときにどのブランチに対しても、そのコミットとその祖先を取り込むために必要な処理を実行します。 --no-ffまたは--ff-onlyを挿入して早送りを防止したり、必要に応じて結果が早送りの場合にのみマージしたりできます。

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

git checkout dmgr2
git pull Origin master

pullコマンドはgitにgit fetchを実行し、次にgit merge Origin/masterに相当するものを実行するよう指示します。ですから、これはほぼ 2つのステップを手作業で行うのと同じですが、微妙な違いがいくつかあります。 (特に、fetchによって実行されるpullステップは、onlyOrigin/masterを持ち込み、リポジトリの参照を更新しません。1 新しいコミットは、特別なFETCH_HEAD参照によってのみ参照されます。)

より明示的なgit fetch Origin(オプションで周囲を見回す)を使用し、その後git merge Origin/masterシーケンスを使用する場合、ネットワーク上で実行されるmasterが1つだけで、独自のローカルfetchをリ​​モートで最新の状態にできます:

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機能も有効になります。

602
torek

シチュエーション :私のローカルブランチで働いていますが、devという名前の開発ブランチで最新の情報を入手したいと思います。

解決策 :通常は、次のようにします。

git fetch
git rebase Origin/dev
8
greenridinghood

シナリオ

マスター更新とブランチ更新があり、すべての履歴を適切に追跡し続けるために、ブランチにマスターを追跡し、ブランチをMybranchと呼びましょう。

解決策

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git Push -f Origin Mybranch
  • git mergetool&とのすべての衝突を解決する必要があります - git rebase - 続行、git rebase --skip、git add -u、状況とgitヒントに従って、すべてが解決するまで

(最後の段階への修正、Tzachi Cohenの好意により、 " - f"を使うことでgitはサーバーで "更新履歴"を強制する

ブランチはmasterに合わせてリベースし、またリモートで更新する必要があります。そのため、git logには "behind"や "ahead"はありません。すべてのローカルの競合* .origファイルを削除してフォルダを "clean"にします。

0
user10556443