コーディングしたファイルのバージョン管理を行うGit(ギット)について簡単に学習します。

このGitを使用すれば、ファイルをいつどのように変更したのかを確認したり、その時々のバージョンに戻したりすることが可能になります。

また、Github(ギットハブ)やBitbucket(ビットバケット)のようなサービスを使えば、複数人でファイルの作成や更新ができ、その内容を共有できるためチーム開発には必須のものとなっています。

ファイルのバーションを管理するための管理システムです。

Gitを使用すれば、ローカルのパソコン内でバージョン管理を行うこともできますし、リモートのサーバーで複数人が参照・更新可能なバージョン管理を行うこともできます。( 分散型バージョン管理

このGitを使用する場合は、Gitのシステムをパソコンにインストールする必要があります。

Gitをインストール

Macには最初からGitが入っているので必要はないのですが、Windowsをお使いの方は下記のリンクからインストールしてください。

Git – Downloading Package

Gitがパソコンにインストールされているか確認するには以下のコマンドを実行してください。 ※コマンドラインを使用します(Mac: Terminal、Windows: コマンドプロンプト)


$ git --version
git version 2.24.3 (Apple Git-128)
                

バージョンが表示されたらインストール済みです。

Gitを実際に使ってみよう

Git init

リポジトリについて

Gitがバージョン管理する領域(フォルダ/ディレクトリ)をリポジトリといいます。

ローカルのパソコン内のリポジトリのことをローカルリポジトリといい、リモートのサーバーにあるリポジトリをリモートリポジトリといいます。

個人情報の初期設定

Gitにユーザ名とメールアドレスを設定します。

これからファイルを変更してバージョンを更新(コミット)するたびに、誰が更新したのか識別するためにGitはこの情報を参照しますので必ず設定しましょう


$ git config --global user.name "Hanako Rakuma"
$ git config --global user.email "h.rakuma@rabico.dev"
                

現在登録している情報を確認する場合は $ git config [情報名] を実行します。以下はユーザ名を確認しています。


$ git config user.name
Hanako Rakuma
                

リポジトリを作成(初期化)する

バージョン管理を行いたいフォルダ/ディレクトリ内で以下のコマンドを実行し、新しくローカルリポジトリを作成(初期化)します。

$ git init
                

バージョン管理について

ファイルの新規作成や修正後にコミットすることで、前回コミットした時点からのリポジトリ内の差分をバージョンとして追加します。

いつの変更からバグが出るようになったか」を調査することが容易になったり、コミット時にはコメントなどを残せるため「誰が、いつ、なぜこの修正を行ったか」「どのバグの修正をどの様に行ったか」などをひと目見て分かるように編集することができます。

バージョンに追加する

変更したファイルをコミットする手順は2つです。

バージョンに追加するファイルを選択する

まず、変更したどのファイルをコミットするかを選択する必要があります。(ステージング/インデックスに追加

以下のように $ git add [ファイル名またはディレクトリ名] コマンドを実行します。


$ git add index.html
                

現在のディレクトリ直下にあるすべてのファイルをステージングに追加するには以下のコマンドを実行します。


$ git add .
                
コミットする

選択された(ステージングされた/インデックスに登録された)ファイルをコミットします。

ダブルクォート("")内のテキストがコミット時のコメントになります。


$ git commit -m "メッセージ"
                

変更があった全てのファイルのコミットを実行します。この方法は、ステージングへの追加を省略することができますが、新規作成したファイルなどはコミットされません。


$ git commit -a -m "メッセージ"
                

ファイルの変更を確認する

以下のコマンドを実行してローカルのファイルに変更があるかどうかを確認することができます。

場合により「コミットされてないけど変更がある」や「ステージングされているけどコミットされていない」ファイル名が出力されます。


$ git status
                

コミット履歴を確認する

$ git log コマンドを実行してこれまでコミットした履歴を閲覧することができます。


$ git log
commit 03d6303b6314418951cb911649abd00f1de8aa30 (HEAD -> master)
Author: Hanako Rakuma <h.rakuma@rabico.dev>
Date:   Tue Aug 4 14:37:30 2020 +0900

    2回目のコミットのメッセージです

commit cc2cbba72dacc813aaca4d652efeb8cd8de37be5
Author: Hanako Rakuma <h.rakuma@rabico.dev>
Date:   Tue Aug 4 14:35:31 2020 +0900

    最初のコミットのメッセージです
                

特定のコミットの変更点を確認する

$ git show [コミットのハッシュ値] を実行してコミット時の変更箇所を確認することができます。


$ git show 03d6303b6314418951cb911649abd00f1de8aa30
commit 03d6303b6314418951cb911649abd00f1de8aa30 (HEAD -> master)
Author: Hanako Rakuma <h.rakuma@rabico.dev>
Date:   Tue Aug 4 14:37:30 2020 +0900

    2回目のコミットのメッセージです

diff --git a/index.html b/index.html
index de8b69b..6b4fd92 100644
--- a/index.html
+++ b/index.html
@@ -1 +1 @@
-<h1>Hello World!</h1>
+<h1>Hello World! Changed</h1>
                

ここまでがローカルリポジトリでバージョン管理を行うための Git の基本的な使い方と知識になります。

他にもブランチマージといった重要な機能があります。

ブランチについて

Git branch

Gitにはデフォルトでmasterというブランチが作成され使用されます。

コミットを行う度に、このmasterブランチのバージョンが更新されていきます。

Gitでは新しくブランチを作成することで、コミットした時点から分岐したバージョン管理を行うことができます。

ブランチを作成する

以下のコマンドでは test というブランチを作成しています。


$ git branch test
                

ブランチを切り替える

上記のコマンドでtestブランチは作成されましたが、まだtestブランチを使用するといった指定はできていません。

testブランチにバージョン管理を切り替える場合はチェックアウトを行います。


$ git checkout test
                

これで、次のコミットからは testブランチにバージョンが追加されます。masterブランチは切り替え前に行った最後のコミット時点のものとなります。

ブランチをマージする

Gitのマージとは、あるブランチと別のブランチを併合して差分をなくすことを言います。

別のブランチで作成していた機能が完成してmasterブランチに反映させる時などに使用します。

先程作成したtestブランチをmasterブランチにマージしてみましょう。

この場合、まずはmasterブランチを使用するようにチェックアウトする必要があります。

※マージする前に testブランチのコミットを行ってください。


$ git checkout master
                

以下のコマンドを実行してtestブランチをmasterブランチにマージします。


$ git merge test
                

マージが無事に完了したら、もうtestブランチは不要なので削除します。削除する場合は以下のように -d オプションを指定します。


$ git branch -d test
                

マージでコンフリクト(衝突)が発生

これまでの例で、masterブランチとtestブランチをマージする際に、どちらも同じ箇所を修正していた場合はコンフリクト(衝突)が発生しマージを行うことができません。

以下はマージをしようとしてコンフリクトが発生した時の例です。


$ git merge test
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
                

index.html でコンフリクトが発生している」とメッセージに出力されています。
また、「自動でのマージには失敗しました。コンフリクトを解決してコミットしてください。」とのメッセージが出ています。

どのファイルでコンフリクトが発生しているか調べる

どのファイルでコンフリクトが発生しているかを調べる時は git status コマンドを実行します。

実行結果は以下のようになります。


$ git status
On branch master
You have unmerged paths.
    (fix conflicts and run "git commit")

Unmerged paths:
    (use "git add <file>..." to mark resolution)

    both modified:      index.html

no changes added to commit (use "git add" and/or "git commit -a")
                

最初にmasterブランチでマージできなかったパス(ファイル)があるから修正してコミットしてください」と出力されていて、コンフリクトが解決されていないファイルが Unmerged paths: に出力されています。

最後に「コミットのために追加(ステージング)された変更はありません。(修正したら) git add でステージングしてコミット(git commit)するか、git commit -a でステージング&コミットしてください。」

とのことで、ファイルのコンフリクトを修正してコミットする必要があります。

コンフリクトを解決する

コンフリクトが発生しているファイルを開いて修正します。

ファイルを開いて以下のように表示されている箇所を探します。


<<<<<<< HEAD:index.html
<h1>Hello World</h1>
=======
<h1>こんにちは 世界</h1>
>>>>>>> test:index.html
                

======= より上がマージする前のmasterブランチで、下が今回マージするtestブランチのコードです。

どっちの内容を反映させるかを手動で修正します。

今回はtestブランチのコードを反映させたいので <<<<<<< から >>>>>>>までのコードを以下のように変更します。


<h1>こんにちは 世界</h1>
                

修正後は、git add でステージングすることでコンフリクトを解決したことをGitに通知します。

ステージング後にもう一度 git status を実行して、コンフリクトが解決しているかどうかを確認します。


$ git status
On branch master
All conflicts fixed but you are still merging.
    (use "git commit" to conclude merge)

Changes to be committed:

    modified:   index.html
                

masterブランチの全てのコンフリクトは解決されていますが、まだマージの途中です。コミットする変更は以下です。」となっており、修正したコンフリクトのすべてがステージングされていることを確認したら、$ git commit を実行してマージを完了します。

ブランチに関するより詳しい情報は以下の公式ドキュメントを参考にしてください。

Git – ブランチとは

課題

Gitのバージョンを確認してください。Gitがない場合はインストールしてください。

ローカルリポジトリを作成してください。

ファイル(index.html)を作成し、ステージングしてください。

ステージングされたファイル(index.html)をコミットしてください。メッセージは「新規作成」としてください。

testブランチを作成してください。

testブランチのindex.htmlを変更してコミットしてください。

masterブランチにtestブランチをマージしてください。