🛠️

Gitの仕組みとチーム開発の流れを理解する

2022/12/08に公開約4,800字

この記事は「つながる勉強会 Advent Calendar 2022」の8日目の記事です。

背景

チーム開発を始めてからよりgitの仕組みやできること理解する必要性を感じたので、記事にまとめてみました。

Gitとは

Gitとは、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムです。Gitを使用することで1つのプロジェクトをチーム開発していくときに、他メンバーの開発を考慮せずに進めることができます。

Gitリポジトリの作成

Gitリポジトリとは、プロジェクトのリビジョン(修正)と履歴を維持管理するデータベースで、オブジェクト格納領域インデックスから構成されています。

  • オブジェクト格納領域(4つのオブジェクトから構成されています)
    • ブロブ
      ファイルを圧縮したもの。ブロブにはファイルのデータが含まれていますが、ファイルのメタデータは含まれていません。
    • ツリー
      ブロブオブジェクトや別のツリーオブジェクトを管理して階層構造を構築します。
    • コミット
      単一のスナップショットとして、コミットが実行された時点におけるリポジトリの状態を記録しています。
    • タグ
      特定のオブジェクトに、人が読める情報を加えます。名前を付けるオブジェクトは、通常コミットオブジェクトです。
  • インデックス
    一時的かつ動的なバイナリファイルです。ある瞬間のプロジェクト全体の構造を捉えています。

オブジェクト格納領域とインデックスについてはこれらの記事がわかりやすくまとめてありました。

参考記事

ソースコードをGitで管理していくためにはGitリポジトリ必要なので、プロジェクトの開始時にGitリポジトリを作成します。

  1. 作業ディレクトリの作成
$ mkdir git_practice
  1. 作業ディレクトリにGitリポジトリを作成
$ cd git_practice
$ git init
  1. .gitと呼ばれる隠しディレクトリがあるかを確認
    git ls -aでディレクトリ内にあるすべてのフォルダ・ファイルを確認できます。
$ git ls -a
# .	..	.git

チーム開発の流れ

チーム開発の流れは基本的に下記の通りです。

  1. リモートリポジトリをローカルにクローン(最初のみ実行)
  2. ローカルリポジトリのdevelopブランチを更新する
  3. 作業ブランチを作成
  4. 実装
  5. リモートリポジトリにプッシュ
  6. リモートリポジトリのdevelopブランチにマージ
  7. リリース

▼イメージ図

ここからは2・3・5に関して詳細に述べていきます。

リモートリポジトリをローカルにクローン

既存のプロジェクトに参加した場合、git cloneを使用して既存のリポジトリをローカル環境に複製します。新しいクローンでは、デフォルトでリモートリポジトリのアクセス先に対してoriginと名付けられます。リモートリポジトリのブランチは、クローンにおいてorigin/developorigin/developのようにoriginから始まる名前のブランチ(追跡ブランチ)を利用できます。

リポジトリのクローンの参考記事

ローカルリポジトリのdevelopブランチを更新する

前提として、複数人で開発作業をするときはブランチを使い、他人の開発の影響を受けることなく開発していきます。私の会社ではGit-flowを使用しているので、実装時はdevelopブランチから作業ブランチを作成します。
あるイシューを実装するとき、まずローカルリポジトリのdevelopブランチとリモートリポジトリのdevelopブランチの差分がない状態を作ります。git pull <リモートのリポジトリ名> <リモートのブランチ名>またはgit fecth <リモートのリポジトリ名>&git merge <リモートのブランチ名>でローカルのdevelopブランチを更新します。
git pullの場合

git pull origin develop

git fecth&git mergeの場合

$ git fetch origin
$ git merge origin/develop

作業ブランチの作成

ブランチはgit branch [ブランチ名]で作成できます。作成したブランチを作業ディレクトリの作業ブランチに設定します(チェックアウト)。ブランチを作成して、そのままチェックアウトする場合はgit checkout -bというコマンドを使用します。

  1. ブランチの作成
$ git branch feature
  1. チェックアウト
$ git checkout feature

リモートリポジトリにプッシュ

ステージング(git add)・コミット(git commit)・プッシュ(git push)の3ステップを行うことでリモートリポジトリにプッシュができます。実装が完了したら、
インデックスにファイルを登録することをステージングと呼びます。インデックスの役割は、ファイルの変更を記録して、コミットできる段階になるまで安全な状態にしておくことです。gitはファイルを3つに分類しており、git addされたファイルは追跡ファイルとみなされます。ファイルの状態はgit statusで確認できます。

  • 追跡:リポジトリに入っているか、インデックスに登録されているファイル
  • 無視:リポジトリから「見えない状態」。.gitignoreファイルで指定することができる
  • 未追跡:「未追跡ファイル=作業ディレクトリー追跡ファイル+無視ファイル」

コミットをすると、Gitはインデックスのスナップショットを記録し、そのスナップショットをオブジェクト格納領域に送ります。Gitはインデックスの現在の状態と直近のスナップショットを比較し、変更されたファイルとディレクトリのリストを作成します。変更されたファイルに新たなブロブを作成、変更されたディレクトリに新たなツリーを作成、変更されていないブロブとツリーは再利用します。
コミット後にプッシュをするとリモートリポジトリにコミットが反映されます。

ステージングからプッシュまでのgitの動きをコマンドで確認していきます。

  1. index.htmlファイル作成
    index.htmlはまだインデックスに登録していないので、Untracked filesに分類されている
$ touch index.html

$ git status
#On branch feature
#
#No commits yet
#
#Untracked files:
#  (use "git add <file>..." to include in what will be committed)
#
#	index.html
#
#nothing added to commit but untracked files present (use "git add" to track)m
  1. git addでファイルをステージすると、追跡状態のファイルになる
$ git add index.html

$ git status
#On branch feature
#
#No commits yet
#
#Changes to be committed:
#  (use "git rm --cached <file>..." to unstage)
#
#	new file:   index.html
  1. git commitをするとコミットオブジェクトが作成されます。
$ git commit -m"initial commit"
#[master (root-commit) 3315537] initial commit
#1 file changed, 0 insertions(+), 0 deletions(-)
#create mode 100644 index.html

$ git log
#commit 33155373baed947a86475ea37472f57cd0e88639 (HEAD -> master)
#Author: XXXXX <test@gmail.com>
#Date:   Sat Oct 29 15:12:03 2022 +0900
#
#    initial commit
  1. git pushでリモートリポジトリのfeatureブランチにプッシュします。
$ git push origin feature

この後、プルリクエストをしてレビューでOKがでればdevelopブランチにマージしてイシューは完了です。

参考

https://www.amazon.co.jp/実用Git-Jon-Loeliger/dp/4873114403
https://qiita.com/kaitoy/items/ce6cd3426a16268389d9

Discussion

ログインするとコメントできます