git超入門 ~複数のPCを使ってプログラム開発する

 本記事では、git初心者の方を対象に、実際にgitを動かしてみながら使い方を説明します。

 gitはプログラミングコードやWEBコンテンツ、ドキュメントの分散バージョン管理システムです。大規模なアプリケーション開発にも対応しており、便利で多機能です。ただ、多機能であるがゆえに、初心者にとって入口の敷居が高いものになっています。

 本記事では、開発中のプログラムコードを複数のPCで同期し、どのPCでもプログラム開発ができるようになるところまでを中心に説明します。

 gitの基本的な使い方を覚えると、自身が開発したソースコードをインターネットで公開/配布したり、複数のメンバーで共有して共同開発したり、公開されたリポジトリのソースコードを入手することができるようになります。
 また、実際に使ってみることで、高度なバージョン管理機能も理解しやすくなるのではないかと思います。

1.gitの基本構成

 gitは、gitサーバで最新のソースコードを管理し、これを複数のローカルPCで共有します。図1.は、gitの基本構成を図にしたものです。
 gitサーバは、githubgitbucketなどのクラウドサービスのものを利用することができます。いずれも個人の場合は無料で利用できます。本記事では、githubの無料gitサーバを使う前提で説明していきます。

00.gitの構成.drawio

図1. gitの基本構成

 ソースコードの作成/編集は、テキストエディタやIDE(統合開発環境)を使ってローカルPCで行います。

 gitは、フォルダ単位でソースコードを管理します。
 gitを使って複数のPC間でコードを同期するフォルダのことを、リポジトリとよびます。プログラム開発の場面では、プロジェクトフォルダをリポジトリとすることが多いです。

 ローカルPC上に作成するリポジトリを、ローカルリポジトリといいます。  ローカルリポジトリは、作成済のフォルダに対してgitコマンドを使ってgitリポジトリ化することにより作成します(後で説明)。そのためには、ローカルPCにgitクライアントアプリをインストールする必要があります(後で説明)。

 ローカルリポジトリでソースコードの作成/編集が完了すると、gitコマンドを使ってgitサーバのリポジトリと同期させます。
 gitサーバ上に作成するリポジトリのことを、リモートリポジトリといいます。リモートリポジトリは、githubのwebで作成します。そのためには、githubに無料アカウントを登録する必要があります。

 別のPCでコード編集を再開する場合は、gitコマンドを使ってリモートリポジトリからローカルリポジトリに最新の変更を取り込み、再開します。

2.実際にgitを使ってみる

2.1.gitを使うプロジェクトフォルダの作成

 gitで共有したいプロジェクトフォルダを作成します。gitリポジトリ化するフォルダはどのフォルダでも構いません。linux、windows、iOS、androidなどの主要なOSで利用できます。
 本記事では、Ubuntuのホームフォルダ直下にgit_testという名前のフォルダを作成し、これを使ってgitの使い方を説明していきます。

$ cd ~
$ mkdir git_test

 git_testフォルダの中に、libという子フォルダを作成します。 

$ cd ~/git_test
$ mkdir lib

 作成したそれぞれのフォルダに、以下の簡単なpythonコードを作成します。ここはgitの使い方の説明なので、pythonが動く環境かどうか気にする必要はありません。

~/git_test/tashizan.py

from lib.shisoku_enzan import tashizan

a = 3
b = 5
wa = tashizan(a, b)

print("a + b =", wa)

~/git_test/lib/shisoku_enzan.py

def tashizan(x, y):
    return x + y

2.2.githubにアカウントを登録する

 githubの無料gitサーバを利用するために、githubにアカウントを作成/登録します。アカウントの登録は、https://github.comから行います。

サインナップ画面

図2.githubのアカウント登録画面

githubで作成するリモートリポジトリのurlは、ここで登録したusernameを使って、

https://github.com/<username>/<リポジトリ名>

となります。

 アカウントの登録が完了したら、こちらのページの手順にしたがって、アクセストークンを生成します。

 アクセストークンは、ローカルリポジトリからgithubのリモートリポジトリにアクセスする際のパスワード兼、githubで提供される各種サービスへのアクセス権限もセットになったものです。個人で利用する場合は、全サービスのアクセス権限をチェックして利用可の設定にしておくと楽ですが、複数メンバーで利用する場合はアクセス権限の内容を理解してトークンを生成しましょう。
 生成したトークンは後で必要になるので、コピーし、安全に保管しておいてください。
 図2はgithubのトークン生成の画面です。Expirationはトークンの有効期限です。図2の設定例の画面では30 daysとなってますが、私は個人で利用してるので、No expiration(無期限)を選択しています。

画像6

2.3.githubにリモートリポジトリを作成する

 アカウントの登録とトークンの生成が完了したら、githubにgit_testプロジェクトのリモートリポジトリを作成します。githubにログイン後は、画面上部のナビゲーションバーの左にある、猫のアイコンをクリックすると、ユーザーホーム画面(図3)に移動します。ユーザーホーム画面の左上のRepositoriesの右にあるNewボタンをクリックします。

画像3

図3 githubのユーザホーム画面

 リモートリポジトリ作成画面(図4)に移動します。
 Ownerは自身のgithubのユーザ名となります。
 Repository nameにリポジトリ名を入力します。ここでは、リモートリポジトリ名は、上記で作成したローカルリポジトリのフォルダ名と同じ"git_test"とします。
 次にpublicかprivateか選びます。ここでは、privateを選択します(あとで変更可能)。privateに設定すると、権限がある人しかリポジトリを閲覧することができません。publicに設定すると、リモートリポジトリのダウンロード(git clone)がインターネット越しに誰でもできるようになります。
 ここまで入力&選択したら、Create repositoryボタンをクリック。

githubにgitリポジトリを作成

図4.リモートリポジトリ作成画面

 リモートリポジトリの作成はこれで完了です。
 ローカルリポジトリとリモートリポジトリはhttpsで通信をしますので、urlがセットされます。githubの場合、リモートリポジトリのurlは

https://github.com/<ユーザ名>/<リポジトリ名>.git

の形式となります(url指定の際、拡張子.gitは省略可能)。

2.4.ローカルPCにgitをインストールする

 ローカルPCにgitクライアントをインストールします。
 Ubuntuの場合は、aptコマンドを使ってインストールできます。

$ sudo apt update
$ sudo apt install git

 windowsの場合は、こちらのサイトからgitのwindowsインストーラをダウンロードしてインストールください。

2.5.ローカルPCのプロジェクトフォルダをローカルリポジトリとして初期化する

 ローカルPCのプロジェクトフォルダを、ローカルリポジトリとして初期化し、上記で作成したgithubのリモートリポジトリと連携させます。

 ローカルリポジトリとするフォルダ(~/git_test)に移動し、git initコマンドを実行して初期化します。

$ cd ~/git_test
$ git init

 ~/git_testに、.gitという名前のフォルダが作成されます。

$ ls -al |grep git
drwxrwxr-x 7 ogs-digilife ogs-digilife 4096 11月 21 14:37 .git

 ちなみに、gitのローカルリポジトリを解除するのは、.gitフォルダを削除するだけでokです。

ここで、git branchコマンドでローカルリポジトリのブランチ名を確認します。ブランチについては後ろで説明します。

$ git branch
main

ブランチ名がmainと表示された場合は問題ありません。
もし、masterと表示された場合は、ブランチ名をmainに変更します。github(だけではなく、多くのgitサーバ)では、masterが差別用語だということで初期ブランチ名がmasterからmainに変更になりました。
ブランチ名は
git branch -m <古いブランチ名> <新しいブランチ名>
で変更することができます。

$ git branch master main
$ git branch
main

2.6.gitクライアントの初期設定

2.6.1. user.nameとuser.emailの設定

  初めてgitを使う場合は、初期設定が必要になります。user.nameとuser.emailの設定は必須設定項目なので、ご自身のものを設定してください。以下は設定例です。

設定例

$ git config --global user.name "ogs-digilife"
$ git config --global user.email "ogs-digilife@mail.com"

設定内容確認

$ git config user.name
$ git config user.email

設定の範囲のオプションについて
いくつかのgitの設定項目では、設定範囲のオプションを指定することができます。
--globalオプションは、自身のホームフォルダ配下に作成されるすべてのローカルリポジトリ向けのデフォルト設定となります。--globalオプションで設定された設定項目は、自身のホームフォルダ配下に新規作成(git init)するローカルリポジトリに自動的に適用されます。
--localオプションは、作成したローカルリポジトリにのみ設定値を適用するオプションです。また、--globalオプションで設定されたデフォルト設定値をそのローカルリポジトリだけ変更したい場合、--localオプションで--globalの設定値を変更することができます。

2.6.2. 自動ログイン(credential.helper)の設定

 credential.helperはgitサーバにアクセスするたびに認証情報を入力したりコピペしなくて良いようにするための設定です。
 credential.helperに"store"を設定すると、最初の1回目の接続はパスワード(githubの場合はgithub token)を入力する必要がありますが、初回接続時に認証情報を記録し、2回目以降はパスワード(token)の入力が不要になります。

設定

$ git config --global credential.helper store

確認

$ git config --global credential.helper

注意:
credential.helperに"store"を設定すると、初回接続時に入力したgitサーバの認証情報が平文で
~/.git-credentials
に保存されます。したがってファイルの管理には注意が必要です。
このファイルにgitサーバ毎に認証情報が保存されますので、複数のgitサーバ(例えば、github以外のgitサーバ)の認証情報も管理することができます。

2.6.3 リモートリポジトリのurlをセット

 ローカルリポジトリと連携するリモートリポジトリのurlをセットします。

設定

$ git remote add origin https://github.com/ogs-digilife/git_test

確認

$ git remote show -n origin


このコマンドの形式

$ git remote add origin <リモートリポジトリのurl>

"origin"は、リモートリポジトリのurlの参照名です。
以降、リモートリポジトリのurlは、"origin"と入力するだけでよくなります(詳細後述)。
 ちなみに、リモートリポジトリの参照名は"origin"以外の名前でも良いのですが、慣例的に"origin"が使われているので、慣れるまでは従ったほうが良いでしょう。

 これでローカルリポジトリの初期化と、リモートリポジトリとの連携設定は完了です。

2.7.最初の変更履歴をcommitする

 gitはバージョン管理システムです。プロジェクトフォルダ内のファイルの変更履歴を記録していきます。
 ローカルリポジトリとなるプロジェクトフォルダでリポジトリを初期化しただけでは、gitリポジトリには、まだ何の変更も記録されていません。
 本記事では、すでにプロジェクトフォルダ内に簡単なpyhonプログラムを作成しました。この状態を最初の変更として記録するために、以下のコマンドを実行します。

$ git status
$ git add .
$ git status
$ git commit -m "first commit"

 git statusコマンドは、変更差分のあるファイルの状態を表示する確認コマンドです。
 git addコマンドは、変更差分のあるファイルを指定して、変更を記録する(commitする)ファイルを指定します(ステージングという)。後ろの"."(ドット)は、「変更差分のあるファイルすべて」を表すワイルドカードです。つまり、上記例の"git add ."では、変更のあるものすべてを変更記録するファイルとして抽出しています。最初のステージングなので、"git add ."を実行するとプロジェクトフォルダ内のすべてのファイルが抽出されます。
 再度git statusコマンドを実行すると、git addコマンドでステージングしたファイルが表示されます。変更を記録したくないものがステージングされている場合は、git rmコマンドでステージングを解除することができます。また、.gitignoreに除外リストを記述しておくことで、自動的に除外することも可能です(後述)。
 git commitコマンドを実行すると、ステージングしたファイルの変更履歴がローカルリポジトリに記録されます。git commitコマンドを実行する際は、-mオプションで変更内容のコメントを入力します。

 gitリポジトリには、commitのタイミングで変更履歴が保存されていきます。
 本記事では詳しく説明しませんが、後でロールバックしたい場合は任意のcommitの時点にロールバックすることができます。

2.8.最新の変更履歴をリモートリポジトリに同期する

 git commitコマンドで最初の変更履歴が記録されました。この時点で、最新の変更が反映されているのは、ローカルリポジトリだけです。
 つづいてこの最新の変更履歴をgit pushコマンドを使ってリモートリポジトリに同期します。
 ここで、初回接続の認証を要求されます。githubの場合、Passowrdにはリモートリポジトリで作成したTokenを入力します。

$ git push origin main
Username for 'https://github.com': ogs-digilife
Password for 'https://ogs-digilife@github.com': 

 うまくリモートリポジトリとローカルリポジトリを同期できたでしょうか。github側でも同期されたファイルの中身を確認できますので、確認してみてください。
 ここで、"origin"は上記の"git remote add"コマンドで設定したリモートリポジトリのurlの参照名です。"main"はブランチ名です。git pushコマンドでローカルリポジトリとリモートリポジトリを同期させる場合は、どのブランチを同期するのかを指定します。ブランチについては、この記事の最後で概要を説明します。

2.9.git pull ~別のPCにローカルリポジトリを作成し、リモートリポジトリと同期する

 今度は別PCにローカルリポジトリを作成し、リモートリポジトリから最新の更新ファイルを取り込む方法について説明します。

 まずは別PCの任意の場所にプロジェクトフォルダを作成します。フォルダ名はリポジトリ名と同じ"git_test"で作成しましょう。
 続いて2.4〜2.6を実行し、別PCのローカルリポジトリとリモートリポジトリを連携させるための設定をします。

 ここまで完了したら、git pullコマンドで最新の更新を別PCのローカルリポジトリに取り込みます。

$ cd ~/git_test
$ git pull origin main

 上述のとおり、originはリモートリポジトリ、mainはブランチ名です。

2.11.同期不要なファイルを.gitignoreで除外する

 プロジェクトフォルダ(ローカルリポジトリ)のファイルの中には、リポジトリ間で共有したくないファイルもあります。例えば、プログラム実行のログファイルやコード実行時に作成されるファイル、IDEの設定ファイルなどです。
 リポジトリで共有したくないフォルダやファイルについては、リポジトリの直下に".gtignore"というファイル名のファイルを作成し、共有不要なファイルやフォルダを指定することで同期対象から除外できます。
 .gitignoreの簡単な書き方は、以下のとおりです。ローカルリポジトリ直下からの相対パスで指定します。

# ~/git_test/.gitignore

# コメントアウトは#で。
# ファイル名で指定
file_name

# ワイルドカードを使って指定
file_name.*
*.exe

# フォルダを丸ごと指定
dir_name/
__pycache__/

# 特定フォルダ配下のすべてのファイルを指定
dir_name/*
log/*

#特定フォルダ配下のサブフォルダも含めたファイルを指定
dir_name/**/*.exe

2.12.ここまでのまとめ

 説明は随分長くなりましたがいくつかコマンドを覚えるだけですので、慣れるとそれほど難しくないのではないでしょうか。MACとWindows、会社のPCと自宅のPC、のように複数のPCで開発する場合はこれだけでも相当便利です。
 以下、ここまでのまとめです。

■リモートリポジトリの作成

・githubにアカウント登録してアクセストークンを生成する
・リモートリポジトリを作成する

■ローカルリポジトリの作成

gitクライアントのインストール

ローカルフォルダの作成
$ mkdir ~/git_test

ローカルリポジトリの初期化
$ git init

user.nameとuser.emailの設定
$ git config --global user.name "ogs-digilife"
$ git config --global user.email "ogs-digilife@mail.com"

credential.helperの設定
$ git config --global credential.helper store
※)初回接続時はuserとpasswordを聞かれる

リモートリポジトリのurlをセット
$ git remote add origin https://github.com/ogs-digilife/git_test

■ リモートリポジトリとの同期(push)

変更のステージング
$ git add .

変更のコミット
$ git commit -m "any comment"

リモートリポジトリへのpush
$ git push origin main

■ リモートリポジトリとの同期(pull)

リモートリポジトリからのpull
$ git pull origin main

2.12.git cloneで公開されたコードをローカルにダウンロード

 githubやgitbucketには、さまざまな言語のたくさんの便利なコードが公開されています。
 git cloneコマンドを使うとこれらの公開されたコードを簡単に自身の開発環境にダウンロードすることができます。

$ git clone <リモートリポジトリURL>

 git cloneコマンドを使うと、コマンドを実行したフォルダに、リモートリポジトリのプロジェクトフォルダが丸ごとダウンロード&保存されます。
 git cloneは、単に公開されたフォルダをダウンロードしてくるだけなので、ダウンロード先のローカルフォルダをgit initでリポジトリ化する必要はありません。

 本記事で使ったgit_testリポジトリは、上記ではcd privateで作成しましたが、あとでpublicリポジトリに設定変更しました。
 git cloneの動作確認用に試してみてください。

$ git clone https://github.com/ogs-digilfe/git_test

3.ブランチの概要

 サービスやソフトウェア製品の開発サイクルについて考えてみます。開発したソフトウェアをリリースできる状態になると、version1.0としてリリースします。そしてリリース後もソフトウェアには機能が追加されていきます。

 gitにはブランチという概念があり、mainブランチから別のブランチを作成し、分岐させることができます。仮にmainブランチから開発用にdevブランチを分岐したとします。mainブランチとdevブランチを切り替えるだけでいつでも正式リリース済のコードと開発中のコードを参照したり編集したりできるようになります。

 開発がリリースできるところまで完了したら、次の正式リリース版としてdevelopブランチをmainブランチに”merge"(統合)します。実際のソフトウェア開発の現場では、場面にあわせてもっとたくさんのブランチを作い分けているようです。図5にイメージを図示し、続けてコマンドを補足します。


図5.ブランチの概要

図5では、はじめはmainブランチで開発。
リリースしたらdevブランチを分岐して開発を継続。
次にリリースができるところまで開発が完了したらmainブランチにdevブランチをmerge。
再びdevブランチで開発を継続するイメージを図にしたものです。
図中の枠で囲ったgitコマンドの意味は、以下の通りです。

ブランチの一覧と今アクティブになっているブランチの確認
$ git branch

ブランチの作成
$ git branch <新ブランチ名>

ブランチの切り替え
$ git checkout <切替先のブランチ名>

ブランチのマージ
step1 マージされるブランチへ切り替え

$ git branch <マージされるブランチ>
step2 マージするブランチをマージ
$ git merge <マージするブランチ>


 gitリポジトリには、すべてのブランチのコミット時点の変更履歴が残っていて、任意のブランチの任意のコミット時点にロールバックすることができます。リポジトリに保存しているのは変更履歴のみですので、保存容量も少なく抑えられています。









この記事が気に入ったらサポートをしてみませんか?