リモートリポジトリーの変更をサーバー側へ反映する方法まとめてみた!

勉強を兼ねて、WEBアプリの開発をしているのだが、デプロイする際、gitコマンドで悩んだので、備忘のためにもまとめておく。

普段から、Gitを用いての開発は行なっているのだが、SourceTreeなどのいわゆるGUIベースのツールでサラサラっと流してしまっていたので、いざWEBサービスのデプロイに際して、CUI(コマンドライン)ベースで操作するにちょっと詰まった。

間違えた操作をしてもいいか!?と割り切りも考えたが、WEBサービスの場合は一旦デプロイ済みだと突然サービスが死ぬ、もしくはおかしくなってしまうことが考えられ、結果既存ユーザーのユーザビリティ低下は半端ない…よって、やっぱり慎重にやらなきゃね!?ってことです。

この点、単純なネイティブアプリの開発とは違うところだな〜と、一つ勉強になった。

そもそもいきなり本番サーバーにあげるのではなく、一旦テスト環境にデプロイして、最終検証後のリリースが然るべき手続きではあるが、今は勉強中でもあるので、そこのところは割り切り!!

今後、デプロイの自動化もやってみたい
<イメージ>

  1. ローカル開発
  2. リポジトリへgit push
  3. テスト環境で自動検知 & 更新(git pull)
  4. テスト環境で自動テスト (& エラーがあったら通知)
  5. 本番環境でテスト成功を検知 & 更新(git pull)
    が、とりあえずは先の話。


環境

クライアントPC

  • MacOSX 10.13.4

サーバー

サーバー側の環境には依存しない
但し、サーバーへSSH接続できることを前提とする。

サーバーの環境構築とSSH設定の詳細に関しては、
ConoHa VPS の Debian9 に Djangoベースのサービスデプロイしてみた!!〜その①〜
SSH conf を簡単に接続する方法まとめた!
を参照

あと肝心のgitがインストールされていること

gitのインストール方法

Debian(もしくはUbuntu)へのインストール

$ apt-get install git

Step1. ローカルの変更をリポジトリにpush

本稿のメインではないので詳細は割愛するが、ローカル(手元)でWEBアプリを開発し、一通りのデバックが完了したら、いよいよデプロイできるので、全てのコードをgit pushすして、リモートリポジトリへ!!

ちなみに
gitのインストールに関しては、GUIベースのツールsource treeをインストールすると全て解決する



Step2. サーバー側のコードを更新

ローカルで完成したアプリをgit pushしたら、サーバー側ではリモートリポジトリからそれらを入手して、更新が必要になる。この結果WEBサービスが最新へと更新される。

まずサーバー側に変更がないことを確認

$git status
On branch master
Your branch is up-to-date with 'xxx/master'.
nothing to commit, working tree clean

基本的にサーバー上で直接コードを編集することはないので、nothing to commit, working tree clean(訳:特に変更はないよ)であることを確認

以下のコマンドで、最新のコードを入手

$ git pull

エラーメッセージが出なければ完了!非常に簡単!!

<ポイント>
どこのリモートリポジトリからgit pullしてくるか?に関しては以下のコマンドを実行するとわかる

$ git remote -v
bitbucket https://hogehoge@bitbucket.org/hogehoge/xxx.git (fetch)
bitbucket https://hogehoge@bitbucket.org/hogehoge/xxx.git (push)

補足:pullfetchの違い

gitコマンドを調べていくと、pullfetchが似ていることがわかる。
今回もここで少し悩んだので、ざっと違いをまとめてみる。

git pull

リモートリポジトリからデータを全て取ってきて、手元のデータを更新!!
手元とリモートを同じ状態にするので、「同期」するイメージ。
この場合、mergeしたい変更がある場合には大変なことになるので、注意が必要!!

最悪、事故ってgit pullしちゃった場合も、戻したい先のIDを調べて、
git reset --hard ID--
で元に戻せるから大丈夫!!

<ポイント>
一応事前のgit statusで確認、回避できるから安心

git fetch

リモートリポジトリの変更履歴だけをとってくる。手元のデータは更新しない!!
リモートと手元と同じブランチで作業していて、且つmerge情報がある場合にはこちらがオススメ!!