Web開発で効率的なバージョン管理と協力作業で使われるのが、Gitですが
基本的な「add」、「commit」、「push」だけでは、効率的なバージョン管理と言うには不十分かもしれません。
そこで本記事では、「add」、「commit」、「push」の基本以外で便利だと思った機能を紹介します。
rebase
あるブランチのコミットを別のブランチの先端に移動させることができます。
これにより、ブランチの分岐点を変更し履歴をより直線的にすることが可能になります。
例えば、以下のような状況のとき
E---F---G topic / A---B---C---D main
topicブランチをmainブランチにrebaseすると、以下のようになります。
E'--F'--G' topic / A---B---C---D main
使い方
rebaseしたいブランチに切り替えます。
git checkout topic
基点となるブランチを指定してrebaseを実行します。
git rebase main
メリット
- 履歴がクリーン
マージコミットが生成されないため、履歴が直線的で読みやすいです。 - コンフリクトの解決が容易
各コミットごとにコンフリクトを解決できるため、大規模な変更でも管理がしやすいです。
注意点
- コンフリクトが発生する可能性
複数のコミットで同じ箇所を変更している場合、コンフリクトを解決する必要があります。
メリットで書いた通り、各コミットごとにコンフリクトを解決できるため、落ち着いて対処はしやすいかもです。 - rebase後は強制プッシュが必要
ローカルの履歴が変更されるため、リモートにプッシュする際はgit push –forceが必要になります。
個人的な作業やfeatureブランチの整理には非常に便利ですが、共有ブランチでの使用には注意して下さい。
archive
Gitリポジトリの特定のスナップショット(コミット、ブランチ、タグなど)の内容をアーカイブファイルとして出力できます。
これにより、変更があったファイルだけを出力して、アップロードなどを効率的に行うことが可能になります。
最も基本的な使用方法は以下です。
git archive --format=zip HEAD > archive.zip
このコマンドで現在のHEADの状態をZIPファイルとしてエクスポートします。
使用例
特定のタグの状態を.tarファイルとしてエクスポート
git archive --format=tar v1.0 > release-1.0.tar
特定のブランチの状態を.tarファイルとしてエクスポート
git archive --format=tar feature-branch | gzip > feature-branch.tar.gz
特定のディレクトリのみをエクスポート
git archive --format=zip HEAD:src > source_code.zip
特定のコミットの状態をエクスポート
git archive --format=tar 3abc123 > specific_commit.tar
などなど、たくさん使用例はありますが
個人的によく使うのが下記
特定のブランチの最新コミットから特定コミットまで(今回は最新から3番目まで)の差分を.zipファイルとしてエクスポート
git archive feature-branch `git diff --name-only HEAD HEAD~3` -o feature-branch.zip
注意点
- Gitで追跡されているファイルのみがエクスポート対象です。
- .gitignoreされているファイルは対象に含まれません。
- 大規模なリポジトリの場合、処理に時間がかかる可能性があります。
worktree
1つのリポジトリに対して複数のワークツリー(ディレクトリ)を作成でき、複数のブランチの扱いが効率化できる機能です。
これにより、異なるブランチの作業を同時に進めることが可能になります。
使い方
新しいワークツリーの作成
指定したパスに新しいワークツリーが作成され、指定したブランチがチェックアウトされます。
git worktree add
ワークツリーの一覧表示
現在、存在するすべてのワークツリーを表示します。
git worktree list
ワークツリーの削除
指定したパスのワークツリーを削除します。
git worktree remove
不要なワークツリー情報の削除
既に存在しないワークツリーの情報を削除します。
git worktree prune
メリット
- ブランチの切り替えが不要
異なるブランチの作業をディレクトリ単位で進められるため、頻繁なブランチ切り替えが不要になります。 - コンテキストスイッチの減少
複数の作業を並行して進められるため、作業の中断・再開によるコンテキストスイッチが減ります。 - クリーンな作業環境
各ワークツリーは独立しているため、作業が他の作業に影響を与えることがありません。 - 効率的なレビュー
レビュー中のブランチと作業中のブランチを同時に開けるため、レビュー作業が効率化されます。
注意点
- 各ワークツリーは独立していますが、.gitディレクトリは共有されます。
- 同ブランチを複数のワークツリーにチェックアウトすることはできません。
- 大量のワークツリーを作成すると、ディスク容量を圧迫する可能性があります。
まとめ
Gitの基本的な機能以外で便利な機能として、rebase、archive、worktreeについて紹介しました。
rebase、archive、worktreeの機能は、個人的に実現したいことを調べていたら再現できるコマンドがそれだっただけで
Gitには他にも便利な機能がたくさんあり、場面に適切に活用することでより効率的なバージョン管理が可能になります。
これからも継続的に学び、実践することで、より生産性の高い開発環境を構築していきたいと思います。