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には他にも便利な機能がたくさんあり、場面に適切に活用することでより効率的なバージョン管理が可能になります。
これからも継続的に学び、実践することで、より生産性の高い開発環境を構築していきたいと思います。