Gitとは

Python学習【365日チャレンジ!】364日目のマスターU(@Udemy11)です。

Python学習365日チャレンジも、今日を含めてあと2日、ようやくここまでたどり着いたか〜という感じです。

話は全く変わるのですが、久しぶりに釣具屋を覗いてみると、常に在庫切れになっている【餌木猿スーパーシャロー枯茶】が入荷されていたので、速攻イレパクしてしまいました。

餌木猿スーパーシャロー枯茶

この【餌木猿スーパーシャロー枯茶】は、秋の浅場での投げて巻くだけエギングでめっちゃイカが釣れるので、どこの釣具屋にいっても売ってないし、ヤフオクやメルカリだと手数料や送料も関係して結構割高の値段でしか出品されていません。

なので、ほんと今回はラッキーでした。

気分がいいこの状態をキープして、今日もPython学習をはじめましょう。

昨日の復習

昨日は、Tkinterを使って、入力フォームから【スプレッドシートキー】と【秘密鍵ファイル名】、【検索キーワード】を取得して、検索結果をGoogleスプレッドシートに書き出すMac用アプリを作成しました。

コード自体は一昨日完成していましたので、秘密鍵のPATHを、作成したMac用アプリと同じ階層にするためのコードを付け足しました。

あとは、virtualenvで環境を作って、必要なライブラリをインストールして、setup.pyを作成し、py2appで実行すれば完成です。

Google検索の結果をCSVに書き出すアプリのときはうまくデータを書き出せませんでしたが、今回はスムーズにスプレッドシートに抽出したデータを書き込むことができました。

詳細については、こちらの記事をごらんください。

今日は、いまさらながらになりますが、バージョン管理のgitについて、理解を深めたいと思います。

gitとは

プログラムに関わるものとして【git】は避けて通れないバージョン管理システムですが、コマンドで操作するのでかなり敷居が高く感じてしまうんですよね。

commitpullpushなんてコマンドを使ってファイルのバージョン管理をするということくらいはわかっていますが、gitを理解していなくても、なんとなくGitHubは使えるので、詳しく理解しようとしたことはありませんでした。

ある程度Pythonには慣れてきたので、次のステップとしてgitを本格的に取り入れたいと思います。

gitとは

Git(ギット)は、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。Linuxカーネルのような巨大プロジェクトにも対応できるように、動作速度に重点が置かれている。現在のメンテナナンスは濱野純 (英語: Junio C Hamano) で、2005年7月から担当している。

Gitでは、各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。

この解説を見ると、複数の人で一つのプログラムを作るためのシステムであることがわかります。

例えばエクセルやワードの場合、共有フォルダに入れているファイルを一人が開いていると他の人はそのファイルを編集することができません。

gitを使えば、作業をするすべての人にファイルの複製が作られて、その変更記録やファイルの状態が記録されるので、同時進行で同じファイルを編集できるということです。

【分散型】というと、最近1BTCが400万円を超えたビットコインのシステムであるブロックチェーンもマイニングをするすべてのPCが台帳を持つ【分散型台帳技術】が使われています。

たらればを言えばキリがありませんが、バブルが弾けて、1BTCが30万円くらいのときに買っておいたら10倍以上になってたわけですから、ビットコインでかなり儲けている人もいるんでしょうね。

gitの作業

先程のgitの解説だと、複数人での開発環境ということなので、一人で使うのなら必要ないんじゃない?と思ってしまいますが、一人でプログラムを開発するときも十分gitを使う意味があります。

普段、ワードやエクセルを使っている人でも、ちょっと前に保存していたファイルの状態に戻したいと思うときはありませんか?

gitは、変更履歴を記録するので、ちょっと前の状態に戻したいと思ったときに簡単に状態を戻すことができるので、一人でも使う価値があるわけです。

ワードやエクセルの場合はテキストデータではなくバイナリデータなので、gitでバージョン管理するにはちょっとした工夫が必要です。

Microsoft Officeファイルのgitを使ったバージョン管理は、こちらの記事が参考になるかと思います。

今回、この使い方はおいといて、普通に使うgitの流れをチェックしてみます。

gitの基本的な使い方は、次のように、サーバーにあるリモートリポジトリをローカルPCのローカルリポジトリにダウンロードして、ローカルリポジトリで作業を行い、変更した内容をリモートリポジトリに反映させる作業の繰り返しです。

  • git clone:リモートリポジトリをローカルリポジトリに複製する
  • ローカルリポジトリでコンテンツを編集
  • git commit:編集したコンテンツをローカルリポジトリにコミット(記録)する。
  • git push:コミットしたコンテンツをリモートリポジトリに反映させる
  • git pull:更新されたリモートリポジトリのコンテンツをローカルリポジトリに反映させる

これは複数人で一つのコンテンツを作る際の流れですが、一人で作業をする場合は、まず作業するローカルリポジトリを作成する必要があります。

リモートリポジトリを使用せずに、ローカルリポジトリだけでバージョン管理をすることはできますが、GitHubなどのホスティングサービスを使うことで、MacとiPadやiPhoneでコンテンツのバージョン管理をすることができます。

ローカルリポジトリを作成してからリモートリポジトリにコンテンツを反映する流れを見てみましょう。

  • git init:ローカルリポジトリを作成する
  • git add:ローカルリポジトリのステージングエリアににコンテンツを追加する
  • ローカルリポジトリでコンテンツを編集
  • git commit:ローカルリポジトリに編集したコンテンツをコミット(記録)する。
  • git push:コミットしたコンテンツをリモートリポジトリに反映させる

一人で作業する場合は、このような流れになります。

最初に説明した流れのgit cloneでリモートリポジトリを複製する場合も、作業フォルダでgit initを使い、ローカルリポジトリを作成しておく必要があります。

また、一人で複数端末を使って作業する場合も、git cloneでコンテンツをローカルリポジトリに複製してはじめますので、最初にgit initでローカルリポジトリを作成しておく必要があります。

それでは、それぞれのgitの基本的なコマンドについてチェックしていきます。

git init

git initはすでに紹介しましたが、作業フォルダにローカルリポジトリを作成します。

具体的には、作業フォルダ内に.gitというフォルダが作成されますが、そこでバージョン管理のための情報を管理することになります。

ターミナルを立ち上げて、mkdirコマンドでgitで管理するフォルダを作成し、cdコマンドでそのフォルダに移動して、git initコマンドを実行します。

gitでバージョン管理

mkdir test
cd test
git init

この3つのコマンドを実行すると、フォルダ内に.gitフォルダが作成されます。

.で始まるフォルダは不可視フォルダになっているので、Macの場合は【コマンド】+【Shift】+【.】で不可視フォルダ・ファイルの表示・非表示を切り替えることができます。)

gitでバージョン管理

これでこのtestフォルダをgitでバージョン管理ができるようになります。

もちろんmkdirコマンドを使わずに、マウスなどを使ってGUIからフォルダを作成してからターミナルを操作しても問題ありません。

git add

git addは、リポジトリ上で作業するためのステージングエリアにファイルを追加するコマンドです。

準備として、作業フォルダ内にテキストエディタで、次のコードを書いたhello.pyを作成しておきます。

print('Hello World')

ファイルを作成したら、git addにファイル名を続けてコマンドを実行します。

git add hello.py

このコマンドを実行することで、ローカルリポジトリのステージングエリアにhello.pyが追加されます。

git status

git statusは、ローカルリポジトリのコンテンツの状態を確認するコマンドです。

先程git addhello.pyをステージングエリアに追加したので、git statusを実行すると次のような答えが返ってきます。

gitでバージョン管理

新しいファイルhello.pyがマスターブランチ上のステージングエリアに追加されていることがわかります。

お寿司屋さんに例えるなら、魚をまな板の上にのせた状態ですね。

ホントなら、魚を捌いたり料理する作業が編集作業になるのですが、今回は編集する必要がないので、すでに料理されて出来上がったお寿司をまな板の上にのせたようなものです。

git commit

git commitが、編集内容をリポジトリに記録するコマンドです。

オプションの-mを入れてコミットメッセージを入れないと、使い慣れていないエディタのviが立ち上がって困ってしまうので、次のコマンドでコミットを実行します。

git commit -m 'first commit'

これでコミットが完了したと思って、git statusで状態を確認してみると、なんとびっくり!コミットするファイルがありませんとの表示が!

gitでバージョン管理

しかしこれは正常なレスポンスです。

というのが、git statusは、次の状態のコンテンツを表示するコマンドだから、コミットしたコンテンツは表示されないんです。

  • git addしたけどgit commitされていないファイル
  • 編集・変更・削除したけどgit addされていないファイル
  • gitで管理されていなくて.gitignore(git管理対象外ファイル一覧)にもないファイル

コミットの状態を確認するためのコマンドは、git logです。

gitでバージョン管理

きちんとコミットされて、コメントが保存されているのがわかります。

git branch

git branchは、変更バージョンの枝分かれであるbranchを操作するコマンドで、基本的にメインのブランチはmasterという名前でブランチが作成されています。

今回、リモートリポジトリにGitHubを使っているのですが、GitHubのメインブランチ名にはmainが使われているので、下記のコマンドを使ってブランチ名をmasterからmainに変更しています。

git branch -M main

masterのままですすめるとどうなるのか気にはなったのですが、今回はブランチを変更しました。

git remote

git remoteは、リモートリポジトリを操作するコマンドで、最初に次のコマンドでリモートリポジトリを追加します。

git remote add origin https://github.com/udemymaster/gittest.git

このコマンドを実行することで、ローカルリポジトリのコミットを反映させるリモートリポジトリを追加することができます。

続いてコミットをリモートリポジトリに追加します。

ちなみに、github.com/udemymaster/gittest.gitの部分は、リモートリポジトリのURLですので、コミットしたいリモートリポジトリを指定してください。

git push

git pushは、ローカルリポジトリのコミットをリモートリポジトリに反映させるコマンドです。

とりあえず、コミットしてるし、git pushだけで大丈夫かと思って実行してみました。

gitでバージョン管理

すると、上記のようにupstream branchがないので、git push --set-upstream origin mainを実行しろという指摘が返ってきたので、おとなしく指示に従ってみます。

git push --set-upstream originを実行したところ、GitHubのUsernameをたずねてこられたので、入力して次にパスワードを聞いてきたので、パスワードも入力ししたところ、無事、GitHubのリモートリポジトリにコミットを反映させることができました。

gitでバージョン管理

git pull

git pullは、リモートリポジトリからローカルリポジトリに変更したファイルを反映させるコマンドです。

リモートリポジトリにコミットしたhello.pyにGitHub上でコードを追加してみました。

gitでバージョン管理 GitHubでコードを追加

次のコマンドを使って、変更した内容をローカルリポジトリに反映させてみます。

git pull origin main

変更した内容を確認するために、git pullコマンドを実行する前のhello.pyファイルをcatコマンドで確認してからpullコマンドを実行し、再度、同じファイルを確認してみました。

gitでバージョン管理 GitHubでコードを追加

ちょっと文字が小さくて分かりづらいかと思いますが、最初にhello.pyを確認したときは、1行だけのコードでしたが、pullを実行したあとは、1行コードが追加されて2行のコードが書かれたファイルになっているのがわかるかと思います。

git clone

git cloneは、リモートリポジトリから、ローカルリポジトリにコンテンツを複製するコマンドです。

ここまでいろいろとgitコマンドを使ってきましたが、GitHubに今回のリモートリポジトリを公開しているので、そちらからリポジトリを複製してみましょう。

ターミナルを立ち上げてからcdコマンドで、gitで管理しているフォルダに移動し、次のコマンドを実行します。

git clone https://github.com/udemymaster/gittest.git

lsコマンドでフォルダ内のコンテンツを表示すると、gittestフォルダが作成され、その中にhello.pyが複製されているかと思います。

Pythonでhello.pyを実行すれば、Hello WorldYes!!が表示される単純なコードを書いたファイルなので、必要なければ、普通にフォルダごとゴミ箱に捨てるか、rm -rf gittestコマンドで削除してください。

まとめ

今回、gitのコマンドを実際に使いながら記事を書きましたが、試行錯誤しながら実行していたので、ある程度gitへの理解が深まったような気がします。

基本的には、ローカルリポジトリのステージングエリアに追加したファイルを編集して、commitpushでリモートリポジトリに追加していくような感じです。

複数端末で作業するには、まずpullでリモートリポジトリを同期したあと、ローカルリポジトリで作業して、再びpushすればいいということです。

今回はあと2日ということでかなり長文になってしまいまいしたが、かなりgitのことが理解できる内容になったのではないかと勝手に思っています。

ただ、説明した内容だけでは、gitを使いこなせたうちには入りませんが、まずは入り口に立って、扉をあけたところまでは行けたかと思うので、これからしっかりと使い込んでいこうと思います。

それでは、明日もGood Python!