私はdmgr2(development)と呼ばれるブランチを持っていて、マスターブランチ(live site)から引っ張って全ての変更を私の開発ブランチに取り入れたいです。これを行うより良い方法はありますか?変更をコミットした後に、これが私が計画していたものです:
git checkout dmgr2
git pull Origin master
これは実際の変更を私の開発部門に引き込むべきですか、それとも私はこれが間違っているのですか?
リストした手順は機能しますが、より多くのオプションを提供するより長い方法があります。
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 log
、gitk
など)を使用して、「持っているもの」とそうでないものを確認できます。これは、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機能も有効になります。
シチュエーション :私のローカルブランチで働いていますが、dev
という名前の開発ブランチで最新の情報を入手したいと思います。
解決策 :通常は、次のようにします。
git fetch
git rebase Origin/dev
シナリオ :
マスター更新とブランチ更新があり、すべての履歴を適切に追跡し続けるために、ブランチにマスターを追跡し、ブランチをMybranchと呼びましょう。
解決策 :
git checkout master
git pull --rebase
git checkout Mybranch
git rebase master
git Push -f Origin Mybranch
(最後の段階への修正、Tzachi Cohenの好意により、 " - f"を使うことでgitはサーバーで "更新履歴"を強制する
ブランチはmasterに合わせてリベースし、またリモートで更新する必要があります。そのため、git logには "behind"や "ahead"はありません。すべてのローカルの競合* .origファイルを削除してフォルダを "clean"にします。