みなさんこんにちは。teratail開発チームの出川幾夫です。
gitはデファクトスタンダードとなっているバージョン管理システムで、
gitは非常に強力なツールで開発者の多くが日常的に利用していますが、
そこで今回は開発でgitを利用している人のために、
バージョン管理をするもの、しないもの
gitはファイルであれば何でもバージョン管理が可能ですが、
基本的に開発者の書いたソースコードは全てバージョン管理を行い、
- コンパイル/ビルド後に生成される実行ファイル
- パスワードやアクセスキーを含むファイル
- ユーザによって変更が行われるディレクトリのファイル
- 外部ライブラリ
バージョン管理をしないファイルは、.gitignore
にそのファイル名を記述しておくと混乱やミスが防げます。
ここでは上に挙げた、
コンパイル/ビルド後に生成される実行ファイル
コンパイル後に生成される実行ファイルなどはバージョン管理に含めません。履歴として残すべきなのはコンパイル前のソースコードであり、
パスワードやアクセスキーを含むファイル
パスワードやアクセスキーを記述する必要のあるファイルなど、
- 参考:githubにプッシュするapiのkeyやpassなどについて
- https://
teratail. com/ questions/ 17010
ユーザによって変更が行われるディレクトリのファイル
Webアプリケーションでユーザのアップロードするファイルや画像を格納するディレクトリ内も当然バージョン管理は行いません。この変更は開発者による変更ではなく、
外部ライブラリ
外部ライブラリやリポジトリもなるべくgitでバージョン管理すべきではありません。バージョン管理をするリポジトリの容量が大きくなりパフォーマンスが悪くなりますし、
- 参考: Laravelデフォルトのgitignoreファイルについて
- https://
teratail. com/ questions/ 13162
外部ライブラリはパッケージ管理ツールをうまく活用することで管理がしやすくなります。RubyならBundler、bundle install
やcomposer install
、pod install
で落としてくるようにするのが定石です。パッケージ管理システムで管理できないものはgit submodule
を利用して依存関係を記録しましょう。
近年のWebアプリケーションフレームワークでは、.gitignore
に記述します。注意が必要なのが.lock
ファイルもバージョン管理すべき点です。インストール時に生成されるファイルなので管理しないものと思われがちですが、
操作ミスを防ぐ、柔軟な操作をする
gitの操作は開発中は随時行う作業です。gitの強力な機能を積極的に活用することで、
変更をインデックスに記録する際に非常に有用なのがgit add -p
の-p
オプションです。これを利用することで同一ファイル内の一部分だけをインデックスに記録してコミットすることができます。git add .
は複数のファイルを一度にインデックスできますが、git add -p
などのオプションを使って柔軟かつ確実にコミットの内容を指定するとミスが少なくなります。
- 参考: git diffで表示される修正を次のcommitに含みたくない
- https://
teratail. com/ questions/ 20907
git stash
はワーキングツリーの内容を一時的に保存することのできる機能です。git 2.git worktree
というコマンドが追加され、
過去の履歴の中で発生したと思われるバグがあった場合、git bisect
を使えば二分探索でバグが発生したコミットを効率的に探すことができます。git bisect start <bad-commit> <good-commit>
で2つのコミット間での二分探索が開始され、git bisect good
、git bisect bad
を実行します。インストラクションにしたがってこの操作を続けることで、
git blame
で行ごとのコミットや作業者を特定したり、git revert
で特定のコミットを打ち消すようなコミットを利用してバグを解消しましょう。
git reset
はHEADを任意の場所に移動させるためのコマンドで、
git reset --soft {ref}
はHEADのみを、git reset --mixed {ref}
もしくはgit reset {ref}
はHEADとインデックスを、git reset --hard {ref}
はHEADとインデックスとワーキングツリーの全てを、
それぞれ{ref}
で指定したコミットに戻します。git reset
前のコミットに戻る場合はgit reflog
でコミットを探すのが便利です。
- git checkout . (ピリオド)とgit reset --hard HEADの違い
- https://
teratail. com/ questions/ 24069
さまざまな開発フロー
gitはプロジェクト管理としても非常に有用です。チーム開発の際にはブランチ戦略をはじめに決めておくことが非常に大切です。ここではgitを利用した開発フローの幾つかを紹介します。
Vincent Driessenが提唱したもっとも有名な開発フローがgit-flowです。git-flowでは開発者はdevelopブランチからfeatureブランチを切って完成したものをdevelopブランチにマージしていき、
GitHub Flowはgit-flowのこうした問題点が指摘される中生み出されました。ブランチは、
GitLab-flowはGitHub flowを改良したもので、
チームの開発のやり方やプロジェクトの性質によってどのフローが最適かは大きく変わってきますので、
終わりに
今回はgitのツールとしての基礎について、
gitはいまも非常に積極的に開発されていて、
- teratail
【テラテイル】 |思考するエンジニアのためのQAプラットフォーム - https://
teratail. com/