eljefeblog 

Any sufficiently advanced technology is indistinguishable from magic

programming python-basic-lectures

【基本を学ぶ10:超初心者向け】Pythonプログラミング入門【Git/Githubバージョン管理編】

Pythonプログラミング入門【Git/Githubバージョン管理編】




(初めからしっかり学びたい方はこちら↓↓)


このシリーズではプログラミング初心者の方向けに情報をまとめたものです。


このシリーズを最後まで学習することで
エンジニアとして太い知識の主軸を積み上げる事ができます。


今回はソフトウエア開発で非常に重要となる『バージョン管理』
に関するお話です。



具体的に以下のような疑問に答えていきます。

悩むペン銀

プログラミングの基礎基本についてこれまで勉強してきたけど、自分か前に書いたコードと、今書いているコードの違いが知りたいな。これまでのコードの履歴を保存したり、参照する方法が用意されているのであれば教えて欲しい。




本記事を読み終わった後、
得ることができる主な知識・内容は以下3点です。


本記事の内容

  • バージョン管理の重要性について理解できる
  • Gitに関する基礎知識が身につく
  • Githubの使い方の基礎を学び、チーム開発がスムーズに行えるようになる

  • この記事を書いている僕は国立大学にてCSの学位を保有しており
    エンジニアとしての仕事でGit・Github等を頻繁に利用しています。


    バージョン管理はエンジニアにとって必須スキルの1つなので
    ある程度基礎を知っておくと、後々かなりお得です。



    それでは見ていきましょう!









    バージョン管理とは何か?


    バージョン管理って何?



    バージョン管理とはズバリ、システムの変更を管理することです。


    もう少し噛み砕くと
    『プロジェクトの中で更新されていく、生産物の変更履歴を記録すること』に当たります。


    ここでの生産物とはプログラムが記述されたソースコードに始まり
    音声・画像・動画ファイルなどプロジェクトに関係するありとあらゆる
    様々なデータの事を指します。


    今回はプログラミングにおけるバージョン管理に関する表題なので
    プログラミングに関して当てはめると


    『書いたコードの変更履歴を記録する事』となります。




    なんでバージョン管理が必要なの?



    ここでバージョン管理の概念については理解できたけど、
    何故ざわざバージョン管理をする必要があるのか?
    という疑問が湧いてくるかもしれません。


    少し例を上げて考えてみましょう。


    例えばプログラミングをしていると、

  • プログラムにある機能を追加するため、コードを修正したい
  • 今のプログラムにあるエラーを解決するため、コードを修正したい


  • このようにソースコードを幾度も書き直す場面が多々あります。
    ここでプログラマがバージョン管理を知らなかったと仮定してみましょう。
    そしたら以下のような事件が発生しました。


    悩むペン銀

    複数箇所ソースコードを変更して、数日経って見返したんだけどエラーが発生して正しく動作しなくなってた…変更した場所も覚えてないし、どうしたらいいんだろう。。

    コードを開発していて、他のファイルと一緒に重要なコードも消してしまった。。復元しようとしても完全には戻りそうもない。。




    さて、地獄ですね笑

    しかしこんな事態が発生したら、
    もしくは発生する前に。どんな解決策があるでしょうか?




    1番簡単な解決策はバックアップ



    この場合、できる事なら元の状態(バージョン)に戻したいと思うはずです。


    故に考えられる一番簡単な解決策は
    事前に編集前のファイルのバックアップ(コピー)を取る事っておく事ですよね?
    また具体的にファイル名には編集した日付を残していく方法が考えられるでしょう。


    しかし想像するとすぐ分かりますが
    編集する度に自分でコピーを残し、ファイルに日付を入れる作業が非常に大変。
    そんなこと毎度毎度してられません。


    加えて仮に間違えて適当な名前で保存してしまうと
    最新のファイルを区別できなくなってしまい、扱うファイル数に比例して
    大量の時間を取られてしまいます。


    個人での開発であれば百歩譲って考えられなくはないですが
    仕事としてプログラムを書き、加えてチームとして取り組んでいるのであれば
    システムやアプリケーションはチームで一つ分担して実装することが大半。


    それぞれが別々にコーディングを行ってしまっては
    使用している言語のバージョンや、フレームワーク等の整合性が取れなく
    なってしまうため非効率、かつ運用の観点から見てもかなり危険です。


    そこで『適切なバージョン管理』が必要となってくるわけです。



    適切なバージョン管理を知ろう




    具体的に適切なバージョン管理とは以下の情報を付加しつつ
    記録を残す管理方法のことを意味します。

  • いつ
  • 誰が
  • どこに
  • どのような変更を
  • 何の目的で行ったのか


  • しかし過去にこう言った管理を簡単に行える便利なツールは
    あまり存在していませんでした。


    そこで簡単にバージョン管理ができるツールの開発が進められたわけです。


    特に初心者の方は必要性を感じ難いかも知れませんが
    チームで開発を行う場面を経験すると、強烈に重要性を感じてくるはずです。




    そこで生まれたGit



    こういった要望を実現するため、開発されたのがGitです。
    wikipediaでは次のように説明されています。

    Git(ギット[2][3][4])は、プログラムソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムである。Linuxカーネルのソースコード管理に用いるためにリーナス・トーバルズによって開発され、それ以降ほかの多くのプロジェクトで採用されている。Linuxカーネルのような巨大プロジェクトにも対応できるように、動作速度に重点が置かれている。

    cite from https://ja.wikipedia.org/wiki/Git



    要点をまとめるとGitとは
    『プログラムが記述されたソースファイルの一括管理を実現するためのツール』と理解できます。


    開発者によって複数回書き換わるソースコードにおいて、
    いつ誰が、どの部分をどのような理由で書き換えたのか。
    最新バージョンのコードはどれなのか。
    こう言った情報を全ての記録として残してくれます。


    Gitを正しく使いこなす上で最低限押さえておくべき用語は以下6つです。

  • Repository(リポジトリ)
  • Revision(リビジョン:コミットログ)
  • Branch(ブランチ)
  • Working Directory(作業用ディレクトリ)
  • Commit(コミット)
  • Index(インデックス)


  • 今からざっくり要点のみ説明しますが、
    全てをいきなり理解しようとせずとも大丈夫です。

    少しずつ覚えてみましょう。


    Repository(リポジトリ)



    リポジトリとは、
    ファイルやディレクトリの状況を記録する場所』のことです。

    バージョン管理したいディレクトリをリポジトリの管理下におくことで、
    そのディレクトリ内に存在するファイルおよびディレクトリの変更履歴を
    全て記録する事ができます。


    具体的にはこのリポジトリ内で後に紹介するcommit(コミット)を実行する事で
    リポジトリ内の変更履歴を記録します。


    Revision(リビジョン)



    リポジトリに記録されるファイル及びディレクトリの変更履歴のことを
    リビジョン(コミットログ)と呼びます。


    Branch(ブランチ)



    先ほどの変更履歴であるリビジョンは
    リポジトリが保有するブランチ毎に管理されます。

    最初に作成した1つのリポジトリには必ずmasterブランチが指定されており、
    必要に従って新たなブランチを作成可能です。


    この際ブランチ名は好きな名前で設定でき、
    好きなだけブランチを複数作成する事ができます。


    各ブランチはそれぞれ独立しており、このブランチを切り替える事で、
    リビジョンが切り替わる仕組みです。


    Working Directory(作業用ディレクトリ)



    リポジトリが存在するディレクトリの事です。
    隠れファイルとして(.git)が存在するディレクトリを指します。


    またそのディレクトリ以下全てのファイル・ディレクトリが
    ワーキングディレクトリとして認定されます。


    自分専用のディレクトリであり、共有リポジトリとは完全に独立している理由で大元に影響を与える事がないため自由に編集などを行う事ができます。


    Commit(コミット)



    Commitはファイル及びディレクトリの追加・削除といった
    変更情報をリポジトリに記録要求を行います。


    即ち作成したリポジトリにリビジョンを作成するために、コミットを行います。


    このコミットを行う際、コミットメッセージを付加する事で、
    変更した場所、理由等の情報を記録する事ができます。


    チームでの開発を行う場合、このコミットメッセージから
    ファイル状況を理解する場面がよくあります。


    自分は勿論のこと、他者にとっても理解しやすいように記述する事が
    推奨されます。


    Index(インデックス: ステージングエリア)



    ステージングエリアとはコミットの対象となるファイルを保管しておく場所です。
    インデックスとも呼ばれます。


    このステージングエリアにファイルやディレクトリを記録するためには
    addを実行する必要があります。


    インデックスにはaddされたファイルのみコミットの対象となるため、
    基本操作としてadd➡︎commitの順番になります。



    実際にGitを使ってみよう



    それでは早速、手を動かしてGitを体験してみましょう。
    物事を理解するときは、実際に自分で実行してみる事が一番です。


    まずgitコマンドがインストールされているか確認しましょう。


    以下の入力gitに対し、以下の出力が確認できればokです。

    [ユーザー名]$ git
    
    usage: git [--version] [--help] [-C <path>] [-c <name>=<value>]
               [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
               [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]
               [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
               <command> [<args>]
    
    These are common Git commands used in various situations:
    ......
    
    
    



    (出力が確認できなければ、インストールされていません。
    インストールされていない場合はこちらの記事によくまとめられています。
    参考にしてインストールしましょう)



    gitコマンドの存在が確認できた方は
    ターミナルを起動し、新しいディレクトリを作成しましょう。(ディレクトリ名はなんでも良いです。)
    新規作成したディレクトリに移動し、以下のコードを実行してください。

    [ユーザー名]$ git init



    このコマンドを入力することで、
    そのディレクトリに初期リポジトリを作成することができます。
    (コマンドを入力した階層に.gitの隠れファイルが自動生成され
    そのディレクトリがWorking Directoryとして扱われます)



    共同開発では自分のコード変更を把握し、共同開発相手に
    共有すべき部分を選択できるようになることが大切です。


    故にgitでは以下のようなコマンドが用意されています。

    [ユーザー名]$ git status     // 自分が変更したファイルのファイル名を表示。add済みファイルが緑・addされてないファイルが赤
    
    [ユーザー名]$ git diff // 変更前のコードは赤・変更後のコードは緑で表示
    
    
    [ユーザー名]$ git log // 自分や他人のコミットを確認。ログの上の方が新規のコミット
    
    [ユーザー名]$ git log -p // 変更内容を表示。上下キーで表示範囲を変更
    
     



    基本的にstatusとdiffを確認し、
    問題がなければ以下コマンドを入力し、addします。

    [ユーザー名]$ git add





    GitとGithubの違いとは?


    Githubとは何か



    Githubとは即ちGit + Hubであり、
    Gitの集合体・拠点(ハブ)の意味を持っています。


    具体的にはGitの仕組みを利用し、インターネットに接続する全ての開発者が自分のコードを保存・共有できるようにしたWebサービスの名称です。



    2008年にOSS開発向けの共同プラットフォームとしてサービスを開始しており、
    現在およそ3100万人の世界中のエンジニアに利用されています。


    また2018年10月に75億ドルでMicroSoftに買収され、
    現在ではIBM、Facebookをはじめとする210万以上の組織・団体に利用されるまで成長しました。


    国内外のソフトウエアエンジニアがクリエイティブに仕事できるよう
    現在も精力的に開発が進められているプラットフォームと言えます。



    Githubの特徴



    Githubが素晴らしいところは
    自分が書いたコードの履歴をネット上に無料で保管できることは勿論
    『他者(プロ)が書いたコードを閲覧・ダウンロードすることも可能』という点です。

    加えて面白いプロジェクトがあれば、開発に参加する事さえできてしまいます。


    ここでGit同様、Githubを正しく理解するため、
    追加で押さえておきたい用語があるのでいくつか紹介します。

  • ローカルリポジトリとリモートリポジトリ
  • Push(プッシュ)
  • Pull(プル)

  • ローカルリポジトリとリモートリポジトリ



    リポジトリにはLocal Repository(ローカルリポジトリ)と
    Remote Repository(リモートリポジトリ)の2種類があります。


    ローカルリポジトリは自分のパソコンでバージョン管理を行なっているリポジトリを指します。


    一方でリモートリポジトリは書いて字のごとく遠隔にあるリポジトリです。


    自分ではない複数人数がもつローカルリポジトリの内容を共有できるよう、リモート環境にリポジトリが存在しています。


    このリモート環境としてネット上に場所を提供しているのがGithubになります。


    Gitが行うのはただのバージョン管理ではなく、
    『分散型バージョン管理システム』であるという理由はここにあります。


    Pull(プル)


    Pullは直訳で「引き寄せる」という意味です。


    例えばGithub上にあるリモートリポジトリの情報を
    ローカルリポジトリに取り組みたい場合、プルを実行します。


    しかし注意事項としてこのPullを実行する場合、gitではFetch(フェッチ)と
    Merge(マージ)の動作を自動で行うため、注意が必要です。


  • フェッチ:リモートリポジトリの情報をローカルリポジトリに取り込む
  • マージ:取り込んだリモートリポジトリのブランチ情報をローカルのブランチに反映する



  • Push(プッシュ)



    Pushは直訳で「押し出す」という意味です。


    ローカルリポジトリで管理している情報をGithub上の
    リモートリポジトリに反映させる際、プッシュを行います。


    これにより作業用ディレクトリにて指定しているブランチの履歴を
    そのままリモートリポジトリの指定ブランチに反映する事が可能となるわけです。




    Githubを上手に活用しよう



    オープンソースのプロジェクトではブランチを切って開発に参加することもでき、
    各分野におけるトップエンジニアのコードを無料で閲覧し、
    開発に参加できる機会が提供されているので是非参加してみましょう。


    独学で本をコツコツ読んでいくことも大切ですが、
    他者と開発をする事も非常に良い経験になるはずです。


    またGithubはエンジニアとして企業に就職する際に提示を求められる場合が多々あります。
    自分がこれまで作成したアプリケーションや仕事をGithubに記録しておく事で
    持っているスキルをアピールする事ができます。


    以下にGithubをざっくりと紹介している動画を掲載しています。
    中々面白くまとめられているので見てみると良いでしょう。



    (音声は英語なので日本語字幕をonにして試聴できます。




    Githubのアカウントを作成してみる



    早速アカウントを作成して自分の仕事を管理しましょう!
    Githubにpushしたコードは世界中のプログラマが閲覧可能となります。
    (非公開にすることも可能です)


    彼らとコミュニケーションを取りながら開発を進めてみるのも
    とても良い体験になるはずです。


    この記事がよくまとめられています。
    参考にしてみてください。



    まとめ



    バージョン管理についてなんとなく理解できたでしょうか?


    バージョン管理はソフトウエア開発には欠かせない要素ですので
    実際にGit/Github等を利用していつでも利用できるようにしておきましょう。


    ある程度基礎を抑えたら、オープンソースのプロジェクト開発に関わってみることがおすすめです。
    開発を通し、非常にたくさんの知識を習得することができます。


    本記事は興味を持ってもらう事を目的に知識を提供しています。
    是非この基礎知識を元に自分で学習を進めてみましょう!


    それでは今回はここまでにしておきます。
    ではでは



    人気記事【初学者必見】効率的なプログラミング勉強方法を紹介します

    人気記事 CS学位取得者がプログラミングスクールを調査してみた件【おすすめのスクール】







    このエントリーをはてなブックマークに追加
    data-ad-format="rectangle" data-ad-format="rectangle"

    返信する

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    某国立大学大学院(理系)に所属しています。 最近の趣味は人工知能関連の論文を読む事で 研究ではComputer Vision周りを中心に活動しており、 サイドワークとしてデータ分析の業務に関わっています。 本ブログはこれまで筆者が学んできた様々な知識の中から 有益だと思えた情報のみをまとめたものです。 内容は個人の見解であり、所属する機関と関係するものではありません。 Research: is related to Computer Vision Hobby: is to study Artificial Intelligence / Machine Learning.