Gitとは
Gitは、バージョン管理システム(VCS)の一種で、コードの変更履歴を効率的に管理することができます。チーム開発で複数の開発者が同時に作業を行っても、それぞれの変更を追跡し、統合することが容易になります。gitの構成要素として大まかにコミット、ローカルレポジトリ、ブランチ、リモートレポジトリが挙げられます。
-
リモートリポジトリ
- プロジェクトデータと履歴が保存される場所。
-
ローカルリポジトリ
- ローカルでのプロジェクトデータを保存する場所。
-
コミット
- 変更を記録する操作。コミットは一連の変更を表し、一意のIDが付与されます。
-
ブランチ
- 独立した開発のための分岐。新しい機能やバグ修正を行うために、メインブランチ から分岐し、作業を行います。
これらを図にすると以下のイメージになります。
githubという言葉を聞いたことがあると思いますが、これはGitリポジトリ(=リモートレポジトリ)のホスティングサービスであり、ウェブ上でGitリポジトリを管理できるプラットフォームです。
gitはシステムの一種で、githubはサービス名を意味していることを覚えましょう。
Gitのブランチについて
gitのブランチには、メインブランチとサブブランチの二種類があります。
メインブランチはプロジェクトの中心的なブランチで、安定したバージョンのコードが保持されます。一般的に「master」または「main」という名前が付けられ、リリース用のバージョンが保管されています。
サブブランチはメインブランチから派生したブランチで、新機能開発やバグ修正などの作業を行います。作業が完了し、安定したらメインブランチにマージされます。
マージとは、サブブランチでの更新をメインブランチに統合することです。
図ですると以下のイメージです。
Gitの基本操作について
gitを使った基本的なプログラム管理の流れは
- 初期設定
- リモートレポジトリの設定
- ステージング
- コミット
- ブランチ作成
- リモートレポジトリにプッシュ
となっています。
ここでは実際に手元で操作してもらうことを想定して解説していきます。
初期設定
まず、デスクトップに適当なフォルダを作成しましょう。
作成したら、Windowsの方はコマンドプロンプト(またはWSL)、Macの方はターミネルを起動して
作成したフォルダに移動しましょう。
作業は作成したフォルダ内で実施していきます。
まず、githubのアカウント情報を設定しましょう。
以下のコマンドを実行して、アカウント名とメールアドレスを設定しましょう。
git config --global user.name "アカウント名"
git config --global user.email "メールアドレス"
完了したら、gitの初期化コマンドを実行しましょう。
git init
Initialized empty Git repository in /home/user1/work/git-lesson/.git/
これで初期設定は完了です。
リモートレポジトリの設定
リモートレポジトリを設定しましょう。
今回は既にリモートレポジトリを作成してあるので、設定のみをしましょう。
リモートレポジトリの作成方法を知りたいかたはこちらを参照してください。
以下のコマンドを実行してください。
git remote add origin https://github.com/kitaharalab/git-lesson.git
これでリモートレポジトリが設定されます。git remote -vで設定されているリモートレポジトリを確認できます。
ステージング
ステージングをしていきましょう。
ステージングは、コミットする一つ前の段階です。
以下のコマンドを実行しましょう。
echo "print('test')" > sample<学生番号の下二桁>.py
git add sample<学生番号の下二桁>.py
ステージングするファイルを作成しています。
gitのステータスを確認しましょう。
git status
作成したファイルが赤文字で表示されています。
色々と書いていますが
赤文字のファイルを追跡できません。git addしてコミットできる状態にしてねと言われています。
それではgit addでステージングしていきます。
git add ファイル名
再度git statusを実行してみましょう。
緑色で表示されているファイル名がステージング出来ているファイルです。
これで変更をコミットする準備が出来ました。
コミット
それでは変更をコミットしていきましょう。
git commit -m "fisrt commit"
-mはコミットにメッセージを含めるためのオプションです。
コミットする際には何を変更したかをメッセージで簡単に記述するのが一般的です。
git statusを実行してみましょう。
"nothing to commit, working tree clean"とメッセージが出ています。
ステージングしたファイルをコミットしたので、現在はコミットできるファイルがないということを示唆しています。
ブランチ作成
ブランチを作成していきましょう。
git checkout -b features/add-file-<学籍番号の下二桁>
git checkout <ブランチ名> は作業ブランチを切り替えるコマンドで、-bオプションをつけると"ブランチを作成して切り替える"という意味になります。
ブランチを作成できたか確認してみましょう。
git branch
git branchは現在の作業ブランチを確認するコマンドです。
指定した名前のブランチが出来ていれば完了です。
リモートレポジトリにPUSH
リモートレポジトリにPUSHしていきましょう。
git push
実行すると、以下にように表示されると思います。
これはリモートレポジトリにローカルでの作業ブランチが存在しないために表示されています。
--set-upstream origin ブランチ名でリモートレポジトリにロー化カルブランチを設定しましょう。
git push --set-upstream origin ブランチ名
実行するとユーザ名とパスワードの入力を求められるので入力しましょう。
以下のように表示されればPUSH完了です。
また、他の開発者が同じブランチで変更をした場合、続きから作業をする必要があります。
その場合、以下のコマンドを実行します。
git pull pullしたいリモートブランチ名:ローカルブランチ名
これを実行すると、指定したリモートブランチのプロジェクトを指定したローカルブランチに持ってこれます。
単にgit pullとした場合には、ローカルブランチと同じ名前のリモートブランチのプロジェクトを持ってきます。
コンフリクトについて
Gitのコンフリクトとは、複数の開発者が同時に同じファイルの同じ部分を変更し、それらの変更が競合する状態のことを指します。これは、変更のマージが自動的に行えず、手動で解決する必要がある場面が生じることを意味します。
ここで、実際の例を用いてコンフリクトの発生と解決方法を解説します。
例えば、AさんとBさんが同じリポジトリで開発作業を行っているとします。AさんとBobさんは共にREADME.mdというファイルを編集し、以下のような変更を加えました。
Aさんの変更:
# Project Title
This is a simple project.
-A
Bさんの変更
# Project Title
This is a simple project.
-B
AさんとBさんが同時に変更をリモートリポジトリにプッシュしようとすると、コンフリクトが発生します。これは、両者の変更が同じ部分を編集しているため、Gitが自動的にマージすることができないためです。
このような場合、まずAさんまたはBさんのどちらか一方が変更をプッシュします。その後、もう一方の開発者はリモートリポジトリから最新の状態をプルし、ローカルリポジトリにマージしようとします。すると、以下のようなコンフリクトが表示されます。
git pull
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
README.mdファイルを開くと、以下のように表示されるでしょう。
# Project Title
This is a simple project.
<<<<<<< HEAD
-A
=======
-B
>>>>>>> 9cc223c95c... Add signature by B
コンフリクトが発生している部分は、"<<<<<<< HEADと>>>>>>>"で囲まれた部分です。HEADは現在のブランチを示し、その次の行はBさんのコミットハッシュの一部とコミットメッセージが表示されています。
このコンフリクトを解決するために、手動で編集を行います。AさんとBさんの両方の変更を含めるようにファイルを修正しましょう。
# Project Title
This is a simple project.
-A
-B
変更を保存した後、以下のコマンドを実行してコンフリクトを解決し、コミットを行います。
git add README.md
git commit -m "Resolve merge conflict in README.md"
git push
これにより、コンフリクトが解決され、変更がリモートリポジトリにプッシュされます。この結果、README.mdファイルは以下のようになります。
Project Title
This is a simple project.
-A
-B
コンフリクトの解決は、開発者間のコミュニケーションが重要です。適切なコンフリクト解決のために、開発者は変更の意図や理由を共有し、適切な修正を行う必要があります。また、競合を最小限に抑えるために、定期的にリモートリポジトリの変更をプルし、ブランチ活用を効果的にすることが推奨されます。
git diffについて
ここでは、git diffという変更点を確認したりコードの変更履歴を把握するのに役立つコマンドの使い方を簡単に解説します。
git diff
ワーキングディレクトリとステージングエリアの差分を表示します。
git diff
git diff "commit1" "commit2"
2つのコミット間の差分を表示します。コミットハッシュやブランチ名、タグ名を使って指定できます。
git diff commit1 commit2
git diff リモート名/ブランチ名..HEAD
リモートレポジトリとローカルの最新コミットを比較します。
git diff リモート名/ブランチ名..HEAD
Discussion