分みなさんこんにちは。teratail開発チームの出川幾夫です。gitはデファクトスタンダードとなっているバージョン管理システムで,チーム開発で今ではもはや必須のツールです。gitは非常に強力なツールで開発者の多くが日常的に利用していますが,機能や概念が複雑で学習コストが高く,きちんと理解して利用するのは難しいのが欠点と言われています。その分きちんと理解して利用すれば,一人での開発もチームでの開発も非常に効率的かつ安全に行うことが可能になります。そこで今回は開発でgitを利用している人のために,日常の開発にあたって必要となるgitによるバージョン管理の考え方について,あらためてまとめていきたいと思います。バージョン管理をするもの,しないものgitはファイルであれば何でもバージョン管理が可能ですが,バージョン管理すべきものとそうでないものがあります。新たにリポジトリを作成して開発を始めるときは,はじめにこれらをはっきりさせておくことが非常に重要です。基本的に開発者の書いたソースコードは全てバージョン管理を行い,以下に該当するものはバージョン管理しないとするのが一般的です。コンパイル/ビルド後に生成される実行ファイルパスワードやアクセスキーを含むファイルユーザによって変更が行われるディレクトリのファイル外部ライブラリバージョン管理をしないファイルは,プロジェクト開始時に.gitignoreにそのファイル名を記述しておくと混乱やミスが防げます。ここでは上に挙げた,バージョン管理すべきでないファイルについて詳しく見ていきましょう。コンパイル/ビルド後に生成される実行ファイルコンパイル後に生成される実行ファイルなどはバージョン管理に含めません。履歴として残すべきなのはコンパイル前のソースコードであり,実行ファイル等は履歴として本質的でないからです。CやGoなどのビルド後のバイナリパッケージや,Sassから生成されるCSS等がこれに該当します。パスワードやアクセスキーを含むファイルパスワードやアクセスキーを記述する必要のあるファイルなど,ネットワークに流すと危険な情報もバージョン管理を行いません。これらの情報は個別に手動で管理するか,環境変数から読み込むようにします。参考:githubにプッシュするapiのkeyやpassなどについてhttps://teratail.com/questions/17010ユーザによって変更が行われるディレクトリのファイルWebアプリケーションでユーザのアップロードするファイルや画像を格納するディレクトリ内も当然バージョン管理は行いません。この変更は開発者による変更ではなく,機能の拡張や修正とは無関係だからです。外部ライブラリ外部ライブラリやリポジトリもなるべくgitでバージョン管理すべきではありません。バージョン管理をするリポジトリの容量が大きくなりパフォーマンスが悪くなりますし,今後ライブラリの更新に追従することが難しくなるからです。Laravelデフォルトのgitignoreファイルについてhttps://teratail.com/questions/13162外部ライブラリはパッケージ管理ツールをうまく活用することで管理がしやすくなります。RubyならBundler,PHPならcomposer,iOSであればCocoaPodsなどを使用します。installで落としてくるようにするのが定石です。submoduleを利用して依存関係を記録しましょう。近年のWebアプリケーションフレームワークでは,アプリケーション本体やそれに依存するパッケージもパッケージ管理ツールに任せる例が多くなってきました。パッケージをインストールするディレクトリをはじめに必ず明示的に決めておき,そこを.gitignoreに記述します。注意が必要なのが.lockファイルもバージョン管理すべき点です。インストール時に生成されるファイルなので管理しないものと思われがちですが,これは実際にインストールされた依存関係を記述するファイルです。これがないとインストールのたびにパッケージのバージョンが変わるということが起こりえます。操作ミスを防ぐ,柔軟な操作をするgitの操作は開発中は随時行う作業です。gitの強力な機能を積極的に活用することで,ミスを防いだり柔軟な操作をしたりと,作業の大きな効率化が実現できます。-pの-pオプションです。これを利用することで同一ファイル内の一部分だけをインデックスに記録してコミットすることができます。-pなどのオプションを使って柔軟かつ確実にコミットの内容を指定するとミスが少なくなります。stashはワーキングツリーの内容を一時的に保存することのできる機能です。worktreeというコマンドが追加され,一つのリポジトリで複数の作業を同時に行うことができるようになりました。bisectを使えば二分探索でバグが発生したコミットを効率的に探すことができます。インストラクションにしたがってこの操作を続けることで,最終的に問題のあるコミットを特定することができます。revertで特定のコミットを打ち消すようなコミットを利用してバグを解消しましょう。resetはHEADを任意の場所に移動させるためのコマンドで,コミットミスや漏れを修正するなどさまざまなシーンで利用可能なコマンドです。オプションによりどこに移動させるかが変わり,どう違うのかを正しく理解しておく必要があります。{ref}はHEADとインデックスとワーキングツリーの全てを,それぞれ{ref}で指定したコミットに戻します。reflogでコミットを探すのが便利です。HEADの違いhttps://teratail.com/questions/24069さまざまな開発フローgitはプロジェクト管理としても非常に有用です。チーム開発の際にはブランチ戦略をはじめに決めておくことが非常に大切です。ここではgitを利用した開発フローの幾つかを紹介します。Driessenが提唱したもっとも有名な開発フローがgit-flowです。git-flowでは開発者はdevelopブランチからfeatureブランチを切って完成したものをdevelopブランチにマージしていき,それをreleaseブランチにマージすることでリリースとします。masterブランチは,リリース済みのreleaseブランチをマージしてタグをつけることで成長します。これは効率的にバージョン管理ができるようになる一方,ブランチの操作や管理が非常に煩雑になります。Flowはgit-flowのこうした問題点が指摘される中生み出されました。ブランチは,デプロイ可能なものが積み上げられるmasterブランチと,開発を行うトピックブランチの2つという,git-flowと比較して非常にシンプルな構成です。masterブランチが更新されるたびに随時その変更がデプロイされます。ブランチの進行方向が一つなので非常にわかりやすく,変更を直ちにデプロイするような開発体制に向いています。flowにリリースに必要なブランチを追加したものとなっています。masterブランチはproductionブランチへマージされ,このブランチを自動テストの対象やステージング環境と紐付けます。その後productionブランチがreleaseブランチにマージされ,このブランチを本番環境にデプロイします。teratail開発チームではこのGitLab-flowを採用しています。チームの開発のやり方やプロジェクトの性質によってどのフローが最適かは大きく変わってきますので,よく考えながらブランチ戦略を決定しましょう。終わりに今回はgitのツールとしての基礎について,バージョン管理の考え方や日常の開発に役立つ部分を紹介しました。gitはいまも非常に積極的に開発されていて,開発を安全かつスムーズに行うための機能が随時追加されています。さまざまな機能を利用して開発をうまく進めていきましょう。teratail開発エンジニア。サーバサイドの開発を中心に,フロントエンドやインフラなど幅広い領域を担当。物心ついた時からのApple信者で,Appleのデバイスをそれぞれじっくり使い倒すのを至上の喜びとしている。2019」を開催しました。DAY1・DAY2の様子を注目セッションとともにお伝えします。LINEのエンジニア3名がイベントに先駆けて見どころを紹介します。コードの安全性・安定性を高める開発サイクル~テスト管理の効率を上げ,脆弱性診断を自動で行う~本連載では,連載「業務を改善する情報共有の仕掛け」を受けつつ,安全性・安定性を加えた開発サイクルについて考えていきます。若者世代から圧倒的な人気を誇るライブ配信&動画投稿コミュニティアプリ「MixChannel」(ミクチャ)の裏側(レコメンドシステムやサーバサイド開発など)について解説していきます。その他の連載CSS3アニメーションでつくるインターフェイス表現CSS3によるアニメーション表現を紹介していきます。その中でも,幅広い読者に応用してもらえるだろうインターフェイスを主なお題とします。MySQL道普請便り本連載では,MySQLを使ったアプリ開発・運用に関するノウハウをご紹介していきます。RecipeUbuntuの強力なデスクトップ機能を活用するための,いろいろなレシピをお届けします。JavaScriptセキュリティの基礎知識JavaScriptに関するセキュリティ上の問題はどこで発生し,どうすれば防ぐことができるのか?について解説していきます。〜システムをきちんと運用するための基礎知識システムは「作って終わり」ではなく,運用の中でさまざまな問題が発生します。問題の発生に備えて事前にどのような対応をしておくべきなのか,問題発生時に何をしなければならないのか,ポイントを解説していきます。きたみりゅうじの聞かせて珍プレーソフトウェア開発の現場で体験したトホホな失敗,思わずうなる珍プレーをきたみりゅうじ氏が四コママンガで紹介。Linuxのメンテナンスの傍ら,Linuxやオープンソースソフトと日々を過ごす著者が,その魅力とつきあい方を,エッセイ風味でお届けします。PRESS特別編集部員,さわやか笑顔のスーパーハカーはまちちゃんとネット大好き14歳わかばちゃんが,毎号,読者の皆さんから寄せられたおたよりを紹介します。皆さんの日頃の悩みにも答えちゃいますよ。]メールでのお知らせメールで次の案内をお送りしております。メールの配信を希望する方は,利用したい項目をチェックしてメールアドレスを入力し,[登録]ボタンをクリックしてください。UPDATES[ほぼ週間に1回]新刊メールマガジン[ほぼ週間に1回]電脳会議の各号案内[ほぼ1ヵ月半に1回]※変更する場合や停止する場合は,登録情報変更ページをご覧ください。※登録いただいたメールアドレスには,そのお知らせ以外,配信いたしません。Ltd.ページ内容の全部あるいは一部を無断で利用することを禁止します。個別にライセンスが設定されている記事等はそのライセンスに従います。