Git の使い方

Git (ぎっと) とは

分散ファイルリポジトリと呼ばれるシステムですが,ここでは ファイルの バックアップ をとって,記録 をするための道具程度だと 思ってください.

ここでは,単純にファイルのバックアップ機能だと捉えておいて もらって構いません. 実験のソースコードや書きかけのレポートなどがPCの故障や 操作ミスで消えたという悲劇を防ぐための道具でもあります.

注釈

詳しく調べたい人がいれば

などを読んで下さい.

Git を用いた基本的な流れ(Workflow)

先に述べたとおり、Git は プロジェクト と呼ばれる単位でファイル群を管理します. このプロジェクトの実態は,開発プロジェクトを行っているフォルダやディレクトリだと 思ってもらえれば良いです. Git にファイル管理を委ねると,各バージョンの変更などを 全て保持したデータベースを作成します. Gitではこのデータベースを含めたプロジェクト全体のことを リポジトリ (Repository)と呼びます. 今後リポジトリという言葉は多用されますが,開発を行っているフォルダ/ディレクトリの ことだと思ってもらってOKです.

Gitにおけるバージョン管理のフローは以下の様な形をとります。

  1. 下準備:

    とりあえず git で管理するフォルダを作成しましょう.

    • 現在の作業フォルダを git の管理に委ねる (git init)
    • もしくは,どこか(Github とか)から, git に管理されたリポジトリを クローン(コピー)( git clone )してきます.

    この操作により .git という作業フォルダができてきます. この .git フォルダには,差分情報とかが入ってきます. git さんの管理から外す場合は,このフォルダを中身ごと消せば良いですが, 差分情報なども全てキレイに消え去ります.

    このあとに,場合によっては,元の開発プロジェクトを,そのままにしておいて 新たにプロジェクトを派生させるために,ブランチと呼ばれる派生操作を する場合があります.

  2. プロジェクト開始.

    普通にファイルを編集します.(プログラムを書くとか,文書ファイルを更新するとか) クローンしてきた場合はそれをベースに変更を行います.

    いつでももとに戻せるのでガンガン変更しちゃって構いません.

  3. ステージング.

    とりあえず,変更したら git に更新をお願いしましょう. git は便利ですが,自動的に監視して作業をしてはくれません.

    git の更新は,2段階構造になっています. 最初の段階はステージングとかインデクシング(git add)と呼ばれる作業で, 今回行った更新作業が,どのファイルたちに該当するか を指定します. git add することで,git さんに どのファイルたち を登録してくれとお願いすることが できます.ただし,この段階では,変更ファイルリストが作られるだけで変更詳細は記録されてはいません.

  4. コミット.

    次の段階は,ステージングされたファイルの変更を記録します.この作業は コミット (git commit) などと呼ばれます. git commit を行うを行うことで,実際の差分が記録されます. このとき, 何のために変更を行ったのか というメッセージを記録します. git さんは "いつ","だれが","どこを" 変更したかは記録できますが, "なぜ" に関しては知ることができません. この理由をコミットメッセージとして書いていきましょう.

    通常は,この 2. と 3. のプロセスを繰り返して更新作業を行っていきます. コミットは,どのような段階で行ってもよく,中途半端な状態でも, 作業の中断や,一日の終わり とかの状況での保持したほうが良いです.

  5. 必要ならばリポジトリをリモートサーバにアップロードする(git push) これで,各受講者の PC が壊れても良い状態(良くは無いですが最悪の自体は防げます)です. コードや解きかけの課題本体は Github においてあるのですから.

    また,作業場を変えても,ネット環境さえあれば,クローン操作を行ない 更新されたものをクローンしてしまえば,問題なく作業を続行できます.

    また,すでに存在している git の管理フォルダで作業を再開するときは, 最初に git pull を行うことで,更新作業を行えば常に最新版での 作業を行うことが可能です.

例えば Hoge とかいうプロジェクトでプログラム等を作る場合,

  1. ProjectHoge/ というディレクトリをつくり,git に管理させることを考えます.

    $ mkdir ProjectHoge
    $ cd ProjectHoge
    $ git init
    
  2. ProjectHoge/hogehoge.py などといったプログラムを作成,テストする.

    $ cat > hogehoge.py
    print("Hello World.")
    

    この作業を行い,Ctrl-D などで抜けて編集作業終了します. 適宜テキストエディタで編集してもOKです.

  3. ある程度書いたり,動いたり,疲れて中断したいと思ったら,変更を git add でステージングします.

    $ git add hogehoge.py
    

    あるいはディレクトリの中にある全てを更新対象としたければ

    $ git add .
    

    といったようにディレクトリを指定します.

  4. どういったこと内容で更新させたか等のコメントを付与し, git commit でコミットします.

    $ git commit
    

    このようにオプションなしに git commit するとエディタが立ち上がり,コメント入れるように促されます.

    エディタでコメント書く作業するほどでもないなという場合は -m オプションをつけてコマンドラインで コメントを付与します.

    $ git commit -m '今日は疲れたから帰る'
    

    このように, -m オプションのあとにコメントをクォートでくくって追加します. このコメント部分が,何を目的にしたか,どういう状況での更新だったのかを示す情報になります.

    逆説的に言えば,複数の目的を行った際に,それらの目的を一つのコミットでくくるのは, 好ましくありません. 何故かといえば,複数目的でコミットしてしまうと,その中のどれかの更新をなかったことにして, 一部分だけもとに戻したいと思っても,その更新部分だけを抽出することが難しくなるからです. ですから コミットは,なるべく細かい粒度で行ったほうがよいという話になります. (特に複数人で一つのプロジェクトを取り扱う場合は.)

    このように考えると,git が git addgit commit に2段階で登録する意味は, git add で,ある目的の更新作業を行ったファイルをピックアップし, git commit で それを登録するという構えになっていることにあるように思えます. git add で,登録し忘れたりすることを確認しながら作業できるような仕様は, 複数ファイルを開いて同時更新するプログラマ向けのものと言えるでしょう.

  5. バックアップのために GitHub に git push する

    $ git push (適宜オプションをつける)
    

    で,バックアップを行います.クローンしてきた場合は,引数なしでもOKです.

というのが基本的なフローになります.追記する場合もその繰り返しです。

導入

マシン上には Anaconda3 を既に導入済みであることを仮定しています.

  • Windows の場合

    Windows の場合は,Git for Windows https://gitforwindows.org/ を使いましょう. ダウンロードしてインストールを標準で行います.

    ここらへんが参考になるかと↓ https://qiita.com/elu_jaune/items/280b4773a3a66c7956fe

  • MacOSX の場合

    git さんはデフォルトで入っていますが,少々古い場合もあるので, Homebrew などを利用して入れてしまいましょう.

    homebrew https://brew.sh/index_ja

    を入れて

    $ brew install git
    

    で導入できます.

  • Linux さんの場合

    普通は標準で入ってきますので特に何もしなくてもOKです

もちろん,GUI環境もありますが,ここでは(プロらしく)コマンドライン(CUI) 操作で操作を説明していきます.

以下では Jupyter のターミナルで全て済ませることを考えていますが, 好きなものを用いてもらって構いません.Jupyter Noteboo もしくは Jupyter Lab は Anaconda を入れるとついてきます.

Jupyter Notebook で,新規のボタンをおして Terminal を選び端末を開いてください.

_images/selectterminal.png

すると,ほぼ真っ黒(もしくは真っ白)な端末画面が出てくるはずです.

おまじない設定

gitを使う前に行わなければならない最低限のお作法があります. これは,'誰が' 修正を行うかに関わる部分です. この登録には git さんに自分の名前とメールアドレスを教えてあげます.

$ git config --global user.name "Hayaru SHOUNO"
$ git config --global user.email "shouno@uec.ac.jp"

メールアドレスは有効なものであれば,大学のじゃなくてもOKです.

注釈

また,Windows などで,Git GUI を使ってなんとかしたいんだけど, 日本語コードが化けるような場合は,

$ git config --global gui.encoding utf-8

などで回避すること

次に, git commit するときにコメントを付与することが要求されるので, これの編集に用いるエディタを指定します. 好きなエディタを設定してもらって構いません.

git さんの標準は vi (もしくは vim) か,nano と呼ばれる割とプロ向けのエディタが 標準で設定されています.これらは初心者向けかと言われるとちょっと首肯し難いものでもあります. 好きなエディタに変えたいといった場合は,

下記のリンクなどを参考に変えてみてください.

https://qiita.com/takeo-asai/items/9bc7e25cd94cd8c9adee https://help.github.com/ja/github/using-git/associating-text-editors-with-git

この文書では混乱を避けるためにコミットのメッセージは -m オプションで

$ git commit -m 'なんたらかんたら'

という形で与えることとします.

基本的な使い方

さて,それでは,gitを使ってみましょう

自分でプロジェクトをゼロから構築する場合

最初に適当なフォルダ下にプロジェクトの管理単位となるフォルダをつくり移動します. その後,ディレクトリを git init で git さんの管理下におきます

$ cd `適当なフォルダ名`
$ mkdir ProjectHoge
$ cd ProjectHoge
$ git init

このコマンドを実行すると .git/ というフォルダができるはずです.

この .git/ 以下にファイルの変更の情報などが書き込まれます. このディレクトリ以下の情報を直接変更することは基本的にありません. むしろリポジトリ構成を壊すことになるので触らないようにしましょう.

git リポジトリの作成手順は以上です. もし git さんによる管理をやめる場合には .git/ ディレクトリを削除するだけでOKです.

端末上での作業をみてみると,こんな感じになります.

_images/gitinit.png

注釈

上記の作業は Linux の端末作業なので,ls コマンドを用いてファイルを見ていますので 使っている端末が Windows の場合は異なる確認コマンドが必要になるケースがあります.

ファイルの編集作業

さて、リポジトリを作ったら何でもいいのでファイルを追加してみましょう. まずは,ファイルの編集作業からです. ソースコードでもテキストでも何でも構わないので, 作成した ProjectHoge/ 以下にファイルを作成します. ここではエディタを練習がてら hoge.py を作って何か変更を加えてみます.

エディタで一行だけのファイル hoge.py を作成しましょう.内容は

print("Hello World.")

で構いません.

更新ファイルのステージング

さて,変更したので,この hoge.py ファイルを git による バージョン管理下に置くことを考えます.

まずは現状確認からです.現状確認には git status を使います.

$ git status

とすると, " hoge.py なんてファイルが管理フォルダの下にあるけど,登録されてへんぞ" と怒られます.

_images/gitstatus1.png

そこで, hoge.py を登録ステージに上げるために git add を使います.

$ git add hoge.py

これで 変更を加えた時点での hoge.py が gitの管理下に入りステージングされます.

_images/gitstatus2.png

ファイル名の指定が面倒であれば,カレントディレクトリ全てを管理下に入れる

$ git add .

を実行してもOKです.

変更のコミット

ファイル登録をしたら リポジトリへコミットする必要があります. git add は,このファイルを,今回の変更のファイルとして取り扱いますよという 宣言にすぎないので,具体的なファイルの更新情報を登録する必要がでてきます. これが git commit というコマンドになります.

$ git commit -m '最初の変更記録'

と打つと,変更した hoge.py が晴れて git リポジトリへ登録されたことになります.

また,オプションなしで git commit を実行すると,設定したエディタが立ち上がります.

_images/commit1.png

最初の1行目がコミットメッセージの記録場所になりますので,1行以内で適宜記録してください. ここでは "最初の変更記録" をコミットメッセージにしています. このメッセージを記録しないとコミットはできない仕組みなので必ずなにか埋め込んでください.

保存後,エディタを終了します.

これで変更の保存が出来ました. コミット後, git status で,状態確認すると最新の状態に保たれている ことがわかります.

追加でファイルの修正をしてみる

さらにファイルの修正をしてみます.エディタ等でファイルに追加を行います. たとえば2行目に付け足して

print("Hello World.")
print("My name is hoge.py")

といったファイルにしてみます.

_images/nano2.png

この状態で git status をとると,変更が加えられているよというメッセージが 出てきます.変更を記録していくなら git add を,変更を破棄するなら git checkout -- hoge.py をしてくださいというメッセージがでてきます.

_images/gitstatus3.png

さらに追加する場合は, git addgit commit を行っていってください. 更新登録は自動的に行われないので,毎回行う必要があることに留意してください.

記録保存のタイミング

記録保存のタイミングですが,これはいろいろな流儀があります. とにかくきれいなコミットログしか残したくない人もいれば, 一行の変更を逐一残していくスタイルの人もいます.

ただ,これは講義で使っているファイルのバックアップ目的なので, できるだけ細かい粒度で行うことを心がけてください. 特にレポート課題作成などでは,思考の変遷を追っかけたい場合があるので 最低でも一日一回git commit を行ってください.