リモートリポジトリの内容をローカルリポジトリへ取り込む場合は下記2つの操作のどちらかを行います。
- プル
- フェッチ
プル
取得内容がワークツリーまで反映されて、ローカルリポジトリ内のローカルブランチに取り込まれる為物理ファイルが即座に書き換わります。非常に便利なのですがプルには注意点もあるので後述しております。
コマンド
1 |
git pull プル先のリモートリポジトリ名 プルするブランチ名 |
プル先のリモートリポジトリ名は「origin」という名前になっていることが多いでしょう。
用途
ローカルリポジトリで開発を行なっていて、リモートリポジトリが他のプルリクエストをマージして状態が変わってしまった際にリモートリポジトリの変更情報をローカルリポジトリにも取り込みたい場合に行います。
基本的に、Gitフローに従うのであればこのプルという動作はローカルリポジトリのmasterブランチに対してのみ行うことが多くなります。(自分が作業中のトピックブランチが他に人によって別途進められることは基本的にはない為。)、ローカルのmasterブランチの最新内容を別ブランチにも適応させたい場合はローカルでgit mergeコマンドを実行してマージさせることになります。
Gitフロー(またはGitHubフロー)とは?
GitHub社が自社で用いているGitを使用したワークフローのことです。
作業ごとにトピックブランチを一つ作り、その中で作業を行い細かい単位でサイクルを回すことです。基本的にmasterブランチの内容は常に安定しており本番反映をいつでもできるようにし、実作業はしません。
各作業をシンプルに管理することが可能で、Webアプリの開発で言えば頻繁なデプロイを前提としています。
ルール
- masterブランチはいつでも本番反映が可能
- 新しい作業に取り組む際はその作業内容のブランチを作成する。
- アドバイスが欲しい場合やコードの作成が完了したらプルリクエストを送る。
- masterブランチにマージできるのは、他メンバーにレビューをしてもらったソースだけ。
- masterブランチにマージされたら直ちにリリースする。
- 定期的にPushをすること。
直ちにデプロイする理由
masterブランチの内容とリリースされている内容に差分がないので今何をリリースしているのかがすぐにわかります。
すぐにデプロイする上で重要なこと
テストとデプロイ作業は自動化しておくことが重要です。
定期的にPushする理由
他のチームメンバーが今どのような開発状況なのか確認することができるためです。チームでの開発がスムーズになります。
メリット
作業の影響範囲を限定的にできること。
例えば、複数の機能のリリースを予定する場合だった際に、ブランチが分かれていない場合片方の実装が早く終わったが、片方の機能の開発が予定より伸びてしまった場合にリリースができなくなったりしてしまいます。
バグが見つかった時の切り戻しが容易なこと。
また、どちらかの機能にバグが混入されていた場合にブランチが分かれていた場合はどちらかのブランチだけ切り戻しを行えば片方の機能だけは使うことができます。このようにブランチを細かく切っておくと素早く柔軟な対応を行うことが可能なのです。
プルの種類
下記の2種類に分かれます。
- マージ型
- リベース型
マージ型
上でご紹介させて頂いた通常のgit pullコマンドの挙動になります。マージコミットが残るので履歴を残したい場合に使いましょう。
リベース型
--rebaseオプションを付加します。マージコミットは残りません。
1 |
git pull --rebase <リモート名> <ブランチ名> |
例えば、「git pull --rebase origin master」のように使います。
フェッチ
ローカルリポジトリへの情報取得しか行わずワークツリーには反映されません。仕組み的には、ローカルリポジトリの中にあるリモート追跡ブランチ(origin/master)に取り込んでいます。ワークツリーに反映させる場合はプル操作を再度行うか、ローカルでマージ操作 を行う必要があります。
リモート追跡ブランチについては下記の記事でも解説しています。
コマンド
1 |
git fetch フェッチ先のリモートリポジトリ名 |
どこにファイルは保存されるのか。
下記ブランチがローカルに生成されて保存されます。「git branch -a」コマンドにて確認することが可能です。
1 |
remotes/リモートリポジトリ名/ブランチ名 |
用途
「リモートリポジトリから最新の状態は取得したいが、まだローカルブランチに反映させたくない」と言う場合に使います。
ワークツリーに反映させたい場合
下記コマンドにてワークツリーに反映させます。
1 |
git merge リモートリポジトリ名/ブランチ名 |
プルとフェッチどちらを使えば良いか。
プルは特殊な動作をするので慣れるまでは「フェッチ」を使うようにしましょう。
プルの特殊な動作とは?
プルしてきたブランチの内容が、今現在いるブランチにマージされるという挙動になります。(仮に現在masterブランチにいて、testというブランチの最新情報をプルで取得してきた場合はそのままmasterブランチにtestブランチの情報がマージされてしまうことになります。)
ローカルでブランチを切り替えていた場合に別ブランチの情報をプルしてしまうとローカルの別ブランチにそのままマージされてしまいソースがぐちゃぐちゃになってしまう可能性があります。フェッチの場合は明示的にマージするブランチを指定できるので安心です。
それでもプルを使いたい場合
「現在作業中のブランチ」と、「取り込むブランチ」が必ず同じと安心できる場合のみに使うようにしましょう。
この記事へのコメントはありません。