【Git】すぐ使えるバージョン管理【Github】
こんにちは、なかだ(@newNakata)です。
VSCode から仮想サーバに接続してプログラムも書くことができました。
前回投稿したプログラムはあえてコメントは書きませんでした。
今回の投稿でコメントなどを追加しようと思うのですが、プログラムに限らず html や CSS など、作成したファイル内に都度変更点(の具体的内容など)を記載するとソースが読み辛くなります。
またバックアップと言う名の変更前ファイルに日付を付けたりする方法は無駄にファイルだけが増えていきます。
そのような状況を防ぐため、本稿ではバージョン管理システム(Git)を使って自分が書いたファイルの差分を管理する方法を記載します。
本稿ではコードエディタは VSCode を使いますが git 操作は主にコマンドとなります。
目次
Git(ギット)とは
プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムです。
「ん?」って思いますよね。僕もです。
最初に、Git は CUI(ターミナルなどを使ってキーボードでコマンド入力する操作)ツールです。
後述する GitHub とはここが違います。
次に、分散型とはレポジトリがリモートリポジトリとローカルリポジトリの2種類に分けられる事から言われます。
リポジトリとはファイルやディレクトリの状態(履歴)を記録する入れ物(場所)とイメージしてください。
・ローカルリポジトリ
ユーザーが一人で使用するために手元のPC上に配置するリポジトリ
・リモートリポジトリ
サーバに配置し複数人のユーザーで共有するためのリポジトリ
このように2種類に分ける事で普段の作業はローカルリポジトリを使用します。
作業内容を共有したい場合はまずローカルリポジトリに commit(コミット)し、リモートレポジトリへ反映するために push(プッシュ)を行います。
またリモートリポジトリからローカルリポジトリへ pull(プル)を行う事で他人の変更分を取り込む事ができます。
蛇足ですが、最近あまりは聞かなくなった他のバージョン管理システムに CVS(Concurrent Versions System)や SVN(Subversion)があります。
この2つは集中型と言われるバージョン管理システムです。
集中型の場合ローカルで管理を行う事はできず commit が Git で言うところの push になります。
GitHub(ギットハブ)とは
Git の Hub(拠点)です。
「ん?」って思いますよね。僕もです。
GitHub は Git の仕組みを利用して、世界中の人々が自分のプログラムやデザインデータを保存、公開できるようにした Web サービスの名称です。
Git とは違い Web 上でグラフィカルな操作が可能なのが Git とは異なります。
また、その他のサービスとして、wiki やタスク管理ツールなどもあります。
個人・企業問わず無料で利用する事ができ、有料サービスもあります。
ちなみに GitHub では有料サービスとして長らく有料会員のみ作成する事ができたプライベート(非公開)レポジトリですが2019年から無料で作成できるようになっています。
構成
Git はシステム、GitHub はサービスであることがわかりました。
”一人でやるなら Git だけでいいのでは?”と思うかもしれません。
ファイル管理と言う観点だけで言えばそうだと思いますが、例え一人で使うとしても用途と利便性が断定されてしまいます。
と言うわけで”GitHubを使う”場合は大体が以下の構成になります。
Git(ソフト)がインストールされた環境(PCなど)をローカル
GitHub(サービス)で作成した環境(アカウントなど)をリモート
別物なのでシステムとサービスを使う用意をする必要があります。
Git 環境(ソフト)の用意
まず最初に Git を使用する場合、Git ソフトが必要になります。
本稿では仮想サーバ(Linux)にインストールされている Git を使用します。
使用する環境の詳細は前回の投稿(【VSCode】Remote-SSH で SSH 接続【VirtualBox】の Remote – SSH で仮想サーバに接続)を是非見て頂ければと思います。
ちなみに Windows で使用したい場合は公式の Git for Windows からダウンロードできます。
Git Bash など便利ですので機会があれば本ブログでも取り上げようと思います。
Git1系から2系に変更
※既に2系が入っている方は読み飛ばしてください。
前回の投稿で気にしないと記載しましたが、2系にします。
1系と2系の変更点は大きいので詳細は割愛しますが、より安全に細かいところに手が届く方向で改善されているため1系を使い続ける理由はありません。
git --version
git version 1.8.3.1
と表示されると1系がインストール済みなのがわかるので、まず Git をアンインストールします。
yum -y remove git
...
(略)
...
削除しました:
git.x86_64 0:1.8.3.1-23.el7_8
依存性の削除をしました:
gettext-devel.x86_64 0:0.19.8.1-3.el7 intltool.noarch 0:0.50.2-7.el7 perl-Git.noarch 0:1.8.3.1-23.el7_8
完了しました!
完了しました!と表示されれば正しく削除されています。
次に ius レポジトリを追加します。
レポジトリについては【VirtualBox】開発環境を作る – Apache編 【CentOS】のパッケージインストールで少し触れていますので、興味がある方は読んでみてください。
yum -y install https://repo.ius.io/ius-release-el7.rpm
...
(略)
...
インストール:
ius-release.noarch 0:2-1.el7.ius
完了しました!
こちらも”完了しました!”と表示されればレポジトリがインストールされています。
また ius レポジトリは yum コマンド実行時に自動で読み込まれる設定になっているので変更します。
レポジトリの読み取り設定は【VirtualBox】開発環境を作る – PHP編 【CentOS】のパッケージインストールで触れていますので、興味がある方は読んでみてください。
vi /etc/yum.repos.d/ius.repo
↓
[ius]
(略)
enabled = 1 ← ここをゼロに変える
(略)
変更したらインストールを行う前にパッケージ名を検索します。
yum list --enablerepo=ius | grep git2
↓
(略)
git236.x86_64 2.36.6-1.el7.ius ius
(略)
レポジトリを指定してインストール。
yum install -y --enablerepo=ius git236
↓
(略)
インストール:
git236.x86_64 0:2.36.6-1.el7.ius
依存性関連をインストールしました:
git236-core.x86_64 0:2.36.6-1.el7.ius git236-core-doc.noarch 0:2.36.6-1.el7.ius git236-perl-Git.noarch 0:2.36.6-1.el7.ius pcre2.x86_64 0:10.23-2.el7
完了しました!
”完了しました!”と表示されれば正しくインストールされています。
この度の場合であれば git –version コマンドで 2.36.6 が表示されます。
初期設定
ここでは必要最低限の設定を記載します。
ターミナルから以下のコマンドを実行します。
git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"
この設定はユーザーのホームディレクトリに作成される .gitconfig ファイルに記録されます。
このファイルが無い状態で手動で作成し直接記載する事もできます。
この設定はリポジトリに対してコミットした人の情報として履歴などに表示に使われます。
コマンド入力後、ホームディレクトリに .gitconfig ファイルが作成されているのがわかります。
cat コマンドで作成された中も確認する事ができます。
これで Git ソフトの更新は終了し、環境の準備はできました。
基本コマンド
ここではよく使うコマンドを記載します。
git init
新しくリポジトリをローカル(お使いの開発環境)に作成します。
Git 管理をしたいディレクトリに移動してコマンドを入力してください。
ディレクトリ内に .git ディレクトリが作成されます。
この .git ディレクトリがあるディレクトリが git の管理対象になります。
蛇足ですが .git ディレクトリさえ消してしまえば git 管理から外れ git とは無関係(と言えば解り易いのかはちょっとわからないのですが)になります。
git clone [URL(https://~.git)]
リモートリポジトリの内容をダウンロード(複製)し、ローカルリポジトリとして作成します。
クローンしたリポジトリは変更履歴も複製されており、操作は新しく作ったローカルリポジトリと全く変わりません。
git pull
リモートリポジトリからローカルリポジトリを更新します。
複数人で使っている場合、他人の変更した内容を取り込む時などに使用します。
git status (-sb)
現在の状況(や差分)を確認するコマンドです。
上記カッコ()内はよく使うオプションになります。
-s は簡易フォーマット表示です。
M:変更
A:追加
D:削除
R:ファイル名の変更
-b はブランチ名の表示です。
git add [ファイル名または.]
add の後にファイル名(半角スペースを空けて複数指定可)または .(ドット) で全て、をステージングエリア(またはインデックスとも呼ぶ)に登録します。
ワークツリーとインデックスの詳細な説明は割愛しますが、ステージングエリア(インデックス)は変更内容を一時的に保存しておく場所になります。
なので、ファイルの追加や変更したファイルでコミットに含めたいファイルはまず add コマンドと覚えておけば大丈夫です。
git commit (-m “コメント”)
ローカルリポジトリに差分を反映します。
ファイルの追加などで履歴の追跡対象になっていないファイルは追跡対象となり、既に追跡対象のファイルは更新履歴が登録されます。
-m コマンドでコメントを入力しない場合は vi が表示されコメント入力を求められます。
git push (origin master)
ローカルリポジトリの変更履歴をリモートリポジトリにアップロード(反映)します。
この操作を行った直後はリモートリポジトリとローカルリポジトリは同じ状態になります。
GitHub 環境(サービス)の用意
アカウントの作成
まず GitHub 公式サイト にアクセスしサインアップを押下します。
入力項目に必要な情報を入力していきます。
Verify your account で検証に成功すると上記画像の様にチェックが表示され、Create account ボタンがクリックされる様になります。
Create account ボタンをクリックすると入力したメールアドレスにメールが届きます。
メールを開くと以下の内容が表示されます。
一応消していますが、水色の箇所に数字が表示されています。
Open GitHub ボタンをクリックします。
上記ページが表示されるので、先ほどメールに届いていた数字を入力するとログイン後の GitHub のトップページ(Dashboard)が表示されます。
こんな感じ。
これで GitHub 環境の用意はできました。
ファイル管理(レポジトリ作成時)
流れ
- リモートリポジトリを作成する
- ローカルリポジトリを作成する(init)
- 変更(追加、更新)ファイルをインデックスに追加(add)する
- インデックスにあるファイルをリポジトリに追加(commit)する
- ローカルレポジトリとリモートレポジトリを紐づける
- ローカルレポジトリの内容をリモートレポジトリに反映(push)する
リモートレポジトリ作成
※2の方が先でも構いません。
リモートなので GitHub での操作になります。
今回は Private(非公開) レポジトリを develop-1 と言う名前で作成します。
トップページの以下から作成が可能です。
develop-1 を入力する前の入力欄にはプレースホルダーで name your new repository… と表示されているので、そこに任意のレポジトリ名を入力します。
入力が終わったら Create a new repository ボタンをクリックします。
上記のようなページが表示され、プライベート(非公開)リモートレポジトリの develop-1 が作成されました。
以降の作業はこのページに書かれているので表示されているコマンドで完結します。
本稿では1つずつ詳しく解説します。
まず以下がリモートレポジトリのURLになります。
https://github.com/nakadalog/develop-1.git
次に上記コマンド内にある origin はリモートレポジトリのアクセス先に対して git がデフォルトでつける名前(リモートレポジトリの別名)になります。
あえて変な言い方をしますが、現時点ではリモートレポジトリが作成されただけです。
余談ですが、上記ページのURLを見て貰えばわかる通り、ダッシュボードとは違うページになります。
ダッシュボードに戻ると画面左メニューにレポジトリのリンクが追加されいます。
よって次回から作成したレポジトリはダッシュボードからすぐ遷移できます。
また別の方法として、画面右上のアカウントのアイコンをクリックするとメニューが表示されるので Your repositories をクリックするとレポジトリ一覧へ遷移できます。
ローカルレポジトリ作成(init)
準備
ローカルなので Git ソフトがインストールされた開発環境で行います。
上記 Git 環境(ソフト)の用意でも記載しましたが、使用する環境の詳細は前回の投稿(【VSCode】Remote-SSH で SSH 接続【VirtualBox】の Remote – SSH で仮想サーバに接続)を元に解説します。
※以降ディレクトリなどは自分の環境に置き換えてください。
VirtualBox を立ち上げて仮想サーバを起動し VSCode の Remote-ssh を使ってログインします。
/var/www/nakadalog/ ディレクトリが表示されているかと思います。
今回はここにディレクトリを作成しファイルを移動します。
ファイルが表示されているメニューの上部にカーソルを持って行くと”ファイル”、”フォルダ”、”メニュー内コンテンツの(最新状態へ)更新”、”メニュー折りたたみ”アイコンが出てきます。
フォルダ追加アイコンをクリックし、作成するフォルダ名を入力します。
今回は dev1 にします。
dev1 フォルダを git 管理フォルダにしたいので index.php ファイルを選択してドラッグ&ドロップで dev1 フォルダに移動させます。
確認ダイアログが出たら”移動”を選択してください。
今後不要であれば”今後このメッセージを表示しない”にチェックを入れてください。
dev1 フォルダ以下に index.php ファイルが移動しました。
ちなみにターミナルを使ってコマンドで行う場合は以下になります。
cd /var/www/nakadalog
mkdir dev1
mv index.php dev1
Document root 直下にあったファイルを dev1 フォルダ以下に移動したため、URLも以下の通り変わります。
http://nakadalog.local/index.php
↓
http://nakadalog.local/dev1/index.php
本題
本稿では VSCode のターミナルからコマンドで行います。
cd dev1
git init
1行目でディレクトリ移動。
2行目でローカルレポジトリ作成。
ローカルレポジトリ作成はこの2行目のコマンドだけです。
コマンドを走らせるとヒントが表示されます。
重要なのは最初の1文です。
Using ‘master’ as the name for the initial branch.
最初のブランチの名前として「master」を使用します。
git がつけるローカルレポジトリのデフォルトブランチ(名)は master になります。
本稿で詳しくは触れませんが、ブランチとは”平行して行われるバージョン管理を支援するための機能”です。
支援と言っても必ず必要で、レポジトリ内にはブランチが必ず1つ必要です。
git init はレポジトリを構成(レポジトリ名は無し)し最初のブランチを作成する事を言い、それをわかりやすくローカルレポジトリ作成と言っています。
またローカルレポジトリを作成する事で .git と言う隠し ディレクトリが作成されます。
変更(追加、更新)ファイルをインデックスに追加(add)
ローカルレポジトリ(ブランチ名master)が出来たので、ブランチ(=master)へコミットの準備をします。
コミットに含めたい変更(ファイルの追加やファイルの更新)を準備するためには add コマンドを使用します。
git add index.php
git add コマンドの実行に対しての結果は何も出力されません。
よって git status コマンドで状況などを確認する事ができます。
最初の status コマンドではインデックスに追加されていないファイルは ?? で表示されます。
add コマンド実行後にもう1度 status コマンドで確認すると A(追加)になっている事がわかります。
今回は1ファイルしか無いですが、追加、編集ファイルが複数あっても add コマンドでインデックスに追加していないファイルはコミットされません。
余談ですがインデックスに何も追加されていない状態でコミットなどを行った場合、現在の状況とともに”何も無いよ”と表示されます。
インデックスにあるファイルをリポジトリに追加(commit)
コミットには2パターンあります。
コミットコマンドと一緒にメッセージを入れる
git commit -m '最初のコミット'
-m オプションを付けてコミットコマンドを実行します。
-m の後に’(シングルクォート)または”(ダブルクォート)で囲い、その中にメッセージを記入します。
これでコミットは完了です。
コミットコマンド後に編集画面(自動起動)からメッセージを入れる
git commit
-m オプションを付けずにコミットすると既定(デフォルト)のテキストエディタが開きます。
Linux 環境では vi が起動します。
vi については簡単な説明が【VirtualBox】開発環境を作る – Apache編 【CentOS】にもあります。
ページ内検索「viコマンドはLinuxに標準で入っているテキストエディタです。」で該当の箇所を読めます。
i で入力モードに切り替えてメッセージを入力したら Esc で入力モードを閉じ :wq で書き込んで閉じます。
これでコミットは完了です。
コミットコマンドと一緒にメッセージを入れた時の表示と同じものが表示されます。
メッセージについて
コミット時にメッセージを空(もしくは半角スペース)にするとコミットが失敗(Abort)します。
システムがチェックするくらいメッセージはとても重要です。
抽象的な内容は避け、他人(過去の自分も含む)が見ても「なるほど」となる内容にするのが好ましいです。
ローカルレポジトリとリモートレポジトリを紐づける
git remote add origin https://github.com/nakadalog/develop-1.git
リモートレポジトリ作成時に解説した origin が出てきました。
こちらもコマンドの実行に対しての結果は何も出力されません。
コマンドの意味は以下の通りです。
git remote add <リモートレポジトリ名> <リモートレポジトリURL>
これで dev1 ディレクトリで作成したローカルレポジトリが develop-1 と言うリモートレポジトリに関連付け(登録)されました。
この関連付けを持って dev1 は develop-1 のローカルレポジトリになります。
ローカルレポジトリの内容をリモートレポジトリに反映(push)
最初の1回目
git push -u origin master
2回目以降
git push
反映なのでリモートレポジトリとローカルレポジトリが一緒になります。
そのまま push して一緒になるかと言うと最初の1回目はなりません。
この状態で push するとエラーが表示されます。
説明を読んでもパッとはわかりません。
コマンドが書いてあるので理解せずともそれを入力すれば終わりなのですが、せっかくなので詳しく説明します。
ひとまず今までの作業をおさらいします。
・リモートレポジトリ(名前はorigin)を作っただけ(ブランチは無い)
・ローカルレポジトリ(名前は無い)を作った(ブランチはmaster)
・色々作業してローカルレポジトリのmasterブランチにコミットしていった
・リモートレポジトリとローカルレポジトリを紐づけてdevelop-1のローカルレポジトリとした
・オプション無しのプッシュでエラー
つまり、紐づけたのはいいけどリモートレポジトリにブランチが無いのがエラーの原因です。
以上からプッシュの最初の1回目は -u オプション(–set-upstreamでもいい)を使用する事でリモートブランチに対応するトラッキングブランチを設定します。
”トラッキングブランチの設定”を言い換えると”develop-1 リモートレポジトリ(origin)に現在の develop-1 ローカルレポジトリのブランチ(master)を登録(作る)”と言えます。
VSCode で初めて GitHub に接続に行く時は以下のダイアログが開きます。
許可をクリックするとブラウザが開きます。
Authorize Visual-Studio-Code ボタンをクリックします。
この画面が表示されずに以下の画面が表示される場合もあります。
GitHubへのログインパスワードを入力して Confirm ボタンをクリックします。
また直接このページが表示された場合はログインIDも入力する必要があります。
ブラウザにアラートが表示されるのでVSCodeを開いていたとしても Visual Studio Code を開くボタンをクリックします。
コマンドが実行され VSCode のターミナルにメッセージが表示されます。
branch ‘master’ (が) set up (され) to track ‘origin/master’(origin/masterがトラッキングされました)
これでプッシュは完了です。
この設定(作業)を行う事で2回目以降のプッシュはオプション無しで行う事ができます。
また GitHub のレポジトリページが以下の様に変わっています。
ファイル管理(レポジトリ作成以降)
- –
- –
- 変更(追加、更新)ファイルをインデックスに追加(add)する
- インデックスにあるファイルをリポジトリに追加(commit)する
- –
- ローカルレポジトリの内容をリモートレポジトリに反映(push)する
リポジトリさえ作成してしまえば後はリポジトリ作成時に行った3、4、6の繰り返しです。
先ほどプッシュした index.php にコメントを追加してみましょう。
またリモートレポジトリはいつでも取り出せ(clone)ます。
git clone https://github.com/nakadalog/develop-1.git dev1
URL 後ろの dev1 はクローンした時のディレクトリ名(ルートディレクトリ)の指定です。
何も指定しない場合はリモートレポジトリ名の develop-1 で作成されます。
つまりローカルレポジトリの .git が格納されているディレクトリ名がリモートレポジトリと同じであれば URL 後ろの dev1 は必要ありません。
しかし本稿では dev1 が URL の一部で名前を変える事ができないためクローンする時にルートディレクトリ名を変更しています。
”リモートレポジトリとローカルレポジトリの名前は必ずしも同じじゃなくていい”と言う事が言いたかったのであえてこの様な形を取りました。
ですので、リモートレポジトリとローカルレポジトリの名前(ルートディレクトリ)は合わせておいた方が楽と言えば楽です。
以上の事からクローンでいつでも取り出せるため、普段使いではないPCで作業したい時も何の問題もありません。
まとめ
本稿はここまでになります。
僕はもともとcvsを使っていたため Git を触った時の概念と言うか考え方が難しく感じました。
また Git について質問された時も本稿を押さえておかないと説明が難しい事が多々ありました。
本稿で触れた事は Git の初歩でまだまだ色々な機能がありますが、これを押さえておけばツールを使用する時もイメージし易いと思います。
さて、本稿では主にコマンドメインでお伝えしました。
使い辛かったり、疑問があったり、説明不足な箇所もあります。
次回の投稿ではもう少し Git について解説、便利に使う方法を書いて行こうと思います。