Python学習【365日チャレンジ!】364日目のマスターU(@Udemy11)です。
Python学習365日チャレンジも、今日を含めてあと2日、ようやくここまでたどり着いたか〜という感じです。
話は全く変わるのですが、久しぶりに釣具屋を覗いてみると、常に在庫切れになっている【餌木猿スーパーシャロー枯茶】が入荷されていたので、速攻イレパクしてしまいました。
この【餌木猿スーパーシャロー枯茶】は、秋の浅場での投げて巻くだけエギングでめっちゃイカが釣れるので、どこの釣具屋にいっても売ってないし、ヤフオクやメルカリだと手数料や送料も関係して結構割高の値段でしか出品されていません。
なので、ほんと今回はラッキーでした。
気分がいいこの状態をキープして、今日もPython学習をはじめましょう。
昨日の復習
昨日は、Tkinterを使って、入力フォームから【スプレッドシートキー】と【秘密鍵ファイル名】、【検索キーワード】を取得して、検索結果をGoogleスプレッドシートに書き出すMac用アプリを作成しました。
コード自体は一昨日完成していましたので、秘密鍵のPATHを、作成したMac用アプリと同じ階層にするためのコードを付け足しました。
あとは、virtualenvで環境を作って、必要なライブラリをインストールして、setup.py
を作成し、py2appで実行すれば完成です。
Google検索の結果をCSVに書き出すアプリのときはうまくデータを書き出せませんでしたが、今回はスムーズにスプレッドシートに抽出したデータを書き込むことができました。
詳細については、こちらの記事をごらんください。
今日は、いまさらながらになりますが、バージョン管理のgitについて、理解を深めたいと思います。
gitとは
プログラムに関わるものとして【git】は避けて通れないバージョン管理システムですが、コマンドで操作するのでかなり敷居が高く感じてしまうんですよね。
commit
、pull
、push
なんてコマンドを使ってファイルのバージョン管理をするということくらいはわかっていますが、gitを理解していなくても、なんとなくGitHubは使えるので、詳しく理解しようとしたことはありませんでした。
ある程度Pythonには慣れてきたので、次のステップとしてgitを本格的に取り入れたいと思います。
gitとは
Git(ギット)は、プログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。Linuxカーネルのような巨大プロジェクトにも対応できるように、動作速度に重点が置かれている。現在のメンテナナンスは濱野純 (英語: Junio C Hamano) で、2005年7月から担当している。
Gitでは、各ユーザのワーキングディレクトリに、全履歴を含んだリポジトリの完全な複製が作られる。したがって、ネットワークにアクセスできないなどの理由で中心リポジトリにアクセスできない環境でも、履歴の調査や変更の記録といったほとんどの作業を行うことができる。これが「分散型」と呼ばれる理由である。
引用元: Wikipedia
この解説を見ると、複数の人で一つのプログラムを作るためのシステムであることがわかります。
例えばエクセルやワードの場合、共有フォルダに入れているファイルを一人が開いていると他の人はそのファイルを編集することができません。
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
コマンドを実行します。
mkdir test
cd test
git init
この3つのコマンドを実行すると、フォルダ内に.git
フォルダが作成されます。
(.
で始まるフォルダは不可視フォルダになっているので、Macの場合は【コマンド】+【Shift】+【.】で不可視フォルダ・ファイルの表示・非表示を切り替えることができます。)
これでこの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 add
でhello.py
をステージングエリアに追加したので、git status
を実行すると次のような答えが返ってきます。
新しいファイルhello.py
がマスターブランチ上のステージングエリアに追加されていることがわかります。
お寿司屋さんに例えるなら、魚をまな板の上にのせた状態ですね。
ホントなら、魚を捌いたり料理する作業が編集作業になるのですが、今回は編集する必要がないので、すでに料理されて出来上がったお寿司をまな板の上にのせたようなものです。
git commit
git commit
が、編集内容をリポジトリに記録するコマンドです。
オプションの-m
を入れてコミットメッセージを入れないと、使い慣れていないエディタのvi
が立ち上がって困ってしまうので、次のコマンドでコミットを実行します。
git commit -m 'first commit'
これでコミットが完了したと思って、git status
で状態を確認してみると、なんとびっくり!コミットするファイルがありませんとの表示が!
しかしこれは正常なレスポンスです。
というのが、git status
は、次の状態のコンテンツを表示するコマンドだから、コミットしたコンテンツは表示されないんです。
git add
したけどgit commit
されていないファイル- 編集・変更・削除したけど
git add
されていないファイル - gitで管理されていなくて
.gitignore
(git管理対象外ファイル一覧)にもないファイル
コミットの状態を確認するためのコマンドは、git log
です。
きちんとコミットされて、コメントが保存されているのがわかります。
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
だけで大丈夫かと思って実行してみました。
すると、上記のようにupstream branch
がないので、git push --set-upstream origin main
を実行しろという指摘が返ってきたので、おとなしく指示に従ってみます。
git push --set-upstream origin
を実行したところ、GitHubのUsernameをたずねてこられたので、入力して次にパスワードを聞いてきたので、パスワードも入力ししたところ、無事、GitHubのリモートリポジトリにコミットを反映させることができました。
git pull
git pull
は、リモートリポジトリからローカルリポジトリに変更したファイルを反映させるコマンドです。
リモートリポジトリにコミットしたhello.py
にGitHub上でコードを追加してみました。
次のコマンドを使って、変更した内容をローカルリポジトリに反映させてみます。
git pull origin main
変更した内容を確認するために、git pull
コマンドを実行する前のhello.py
ファイルをcat
コマンドで確認してからpull
コマンドを実行し、再度、同じファイルを確認してみました。
ちょっと文字が小さくて分かりづらいかと思いますが、最初に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 World
とYes!!
が表示される単純なコードを書いたファイルなので、必要なければ、普通にフォルダごとゴミ箱に捨てるか、rm -rf gittest
コマンドで削除してください。
まとめ
今回、gitのコマンドを実際に使いながら記事を書きましたが、試行錯誤しながら実行していたので、ある程度gitへの理解が深まったような気がします。
基本的には、ローカルリポジトリのステージングエリアに追加したファイルを編集して、commit
とpush
でリモートリポジトリに追加していくような感じです。
複数端末で作業するには、まずpull
でリモートリポジトリを同期したあと、ローカルリポジトリで作業して、再びpush
すればいいということです。
今回はあと2日ということでかなり長文になってしまいまいしたが、かなりgitのことが理解できる内容になったのではないかと勝手に思っています。
ただ、説明した内容だけでは、gitを使いこなせたうちには入りませんが、まずは入り口に立って、扉をあけたところまでは行けたかと思うので、これからしっかりと使い込んでいこうと思います。
それでは、明日もGood Python!