コンテンツにスキップ

Gitlabの使い方

Git(ギット)とは?

  • バージョン管理システム(Version Control System)の一種です
  • ウィキペディアによるGit解説@
  • 班が開発しているプログラム群やドキュメント類は,班員全員で共有して使う必要があります.そのために,Gitを使います.
    • グループ開発の場合,特にバージョン管理が重要です
    • この講義では,2017年まではSubversion(サブバージョン)を使っていました
    • 2018年からGitに切り替えました.
  • Gitを便利に使えるようにしたウェブサービスとして, GitLab@を使います.
    • gitlabの開発元では「GitLabを誰でも使えるようにした公開サーバ」が運営されていますが,この講義で使うのは情報コース内に立てた以下のサーバです.
    • 情報コースのGitLabサーバ https://gitlab.cis.iwate-u.ac.jp/

GitLabを用いたプログラムの共同開発の流れ

Gitの概念図

大まかな流れは次のようになります.

  • GitLabサーバ上に,開発中のプログラムの格納場所(リポジトリ)を作る
    • この格納場所は,URI(https://gitlab.cis.iwate-u.ac.jp/xxx/yyyとか)でアクセス可.
    • ここに格納されたファイル群がすべて バージョン管理 される
  • 格納場所からプログラムを読み出し(clone, pull)て,自分用のコピー(作業コピーという)を作る
    • 自分用の作業コピーで修正・追加を行い,独自に開発を進める
    • 自分が修正追加した作業コピーを,適当なタイミングで格納場所に書き戻す(commit, push)
  • 他の人と修正が衝突した時にはマージする

事前設定

gitlabサーバにログイン

情報コースのGitLabサーバ https://gitlab.cis.iwate-u.ac.jp/にアクセスし,LDAPタブが選ばれていることを確認してユーザ名とパスワードを入力してください(大学のアカウントとパスワード).

課題

GitLabサーバにログインしてみましょう


ユーザ名とメールアドレス設定

Gitを使うことが初めての場合は,変更履歴に記録される名前とメールアドレスを設定する必要があります.端末(ターミナル)を開いて以下で設定してください.

$ git config --global user.name (名前)
$ git config --global user.email (大学のメールアドレス)

設定した名前とメールアドレスは以下のようにして確認できます.きちんと設定できているか確認してみましょう.

$ git config user.name
$ git config user.email

課題

Gitで使う名前とメールアドレスを設定しましょう


グループの作成(班長のみ)

以下の作業は班長だけが実行してください.

GitLabでは,(GitLab内の)ユーザが所属できる「グループ」を作ることができます.班ごとにグループを作りましょう.下の図の「2018_g00」は, 本年度, 自分のグループNo.に置き換えて下さい(3班ならグループ名を2022_g03にします).

グループ

グループ作成

グループが出来たら,他の班メンバーを招待します.下の画像を参考に,班員全員を招待してください.

招待

(班長の)課題

班のグループを作成して,メンバー全員をGitLabグループメンバーとして追加して下さい

班のリポジトリを作る

班長がGitLabに新しい「プロジェクト」(今の段階ではリポジトリと同義に捉えてもらって構いません)を作り,そこにファイルを追加して,他のメンバーはその作業コピーを取り寄せる,という練習をしてみます.

先に流れを説明します.個々の詳細手順はその後で.

  1. 班長がGitLabで新規プロジェクトを作成(Web GUIから).中身が空のリポジトリが出来る.
  2. リポジトリを複製し,手元(ローカル)に作業コピーを作成する.(git clone
  3. 手元にある空の作業コピーにファイルやディレクトリを追加してみる.(git add
  4. 変更をコミットする.(git commit
  5. コミットした変更を,GitLabサーバに送り込む(git push).ここで初めて,リポジトリに修正が反映される
  6. 班長以外の他のメンバーが,GitLabのリポジトリを複製(git clone)してみる.班長が追加したファイルやディレクトリが手元の作業コピーに存在していることを確認する.

プロジェクトを作る(班長)

以下の画像を参考に作ります.リポジトリ名称を適切に決めて下さい.

プロジェクト作成

これで空のプロジェクトが作られます.以下のような画面が表示されるはずです.これ以降は,「Create a new repository」に記載してある手順に沿って作業します.

リポジトリ作成

(班長の)課題

新規プロジェクトを作成しましょう


空のリポジトリの複製(clone)

SSHでクローンする方法と,HTTPSでクローンする方法があります. 教育用計算機の構成の都合上,SSHは利用することが難しいのでHTTPSを使います.

$ cd ~; mkdir csd
$ cd csd
$ git clone https://gitlab.cis.iwate-u.ac.jp/グループ名/プロジェクト名.git

ユーザ名とパスワードを聞かれると思いますので(GitLabのログインに使ったユーザ名とそのパスワードを)入力して下さい.なお,URIについては,Web GUIからクリップボードにコピーしておけば入力の手間が省けます.

URIコピー

これで手元に「プロジェクト名」という空のディレクトリができます.このディレクトリが作業コピーです.空ですが,実際には不可視ディレクトリ.gitが含まれています.確認しましょう.

$ ls -a プロジェクト名
.    ..   .git

(班長の)課題

プロジェクトの作業コピーを手元に作りましょう


ファイルやディレクトリを追加する

手元の(空の)作業コピーに,ディレクトリとファイルを追加してみます.

$ cd プロジェクト名
$ mkdir work
$ touch work/README

READMEファイルは適当に編集(本当に中身は何でもOK)して下さい. お好みのエディタで編集してください.以下のコマンドでは vs-code を使用しています.

$ code work/README

ここまでの状態で,作業コピーは以下のような状態です.

プロジェクト名
└── work
    └── README

もちろん,(GitLab上の)リモートリポジトリは空のままです.手元の作業コピーとリモートリポジトリとの違いの状況は,git statusで確認できます.(以下のように表示されると思いますが,メッセージは少し異なるかも知れません)

$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    work/

nothing added to commit but untracked files present (use "git add" to track)

メッセージにしたがってgit addしてみます.

$ git add work
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

    new file:   work/README

statusの出力も少し変化しています.このように,ディレクトリをaddした場合はその配下のファイルもすべて追加されます.

なお,ここでいう追加は,あくまでもGitに「これから追加修正するよ」という宣言をしているだけであり,実際にGitLabサーバ(上のリモートリポジトリ)に追加された訳ではないので注意して下さい.

(班長の)課題

作業コピーにディレクトリとファイルを追加し,git addしてみましょう


変更のコミット

先ほど宣言?しておいた変更をコミットします.

$ git commit -m "コメント"
[master (root-commit) 74e0faf] Initial commit   new file:   work/README
 1 file changed, 1 insertion(+)
 create mode 100644 work/README

-mで指定するコメントは必須項目です.Gitに限らず,バージョン管理システムでは「何をどう変更したか」という履歴の記録が重要ですので,必ず適切なコメントを入力しておく必要があります.今回の場合なら,"Add work dir and README"とか.いずれ,commit時には必ずコメント入力が必要と覚えて下さい.

ちなみに,-mを入力し忘れてしまっても,(勝手に)エディタが起動して必ずコメント入力を求められます.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
 
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
#       new file:   work/README
#

こんな感じにコメント入力を促されますので,適切に入力してからエディタを終了して下さい.面倒なら,適当なラインの#を消せばコメント扱いではなくなりますので,それでも構いません(上の場合なら,10行目のnew file: ...のラインを活かす,等).

なお,この際に立ち上がるエディタ(の種類)は,以下で設定可能です.

$ git config --global core.editor "(エディタ名)"

(班長の)課題

適切なコメントとともにgit commitしましょう


コミットした変更をGitLabサーバに送り込む

上記の手順まで進めても,まだGitLabサーバには変更が反映されていません(GitLabサーバ側には,workディレクトリやREADMEファイルは未だ存在しません).

以下のコマンドを実行して初めて,コミットしておいた変更が(サーバ上に)反映されます.

$ git push
Counting objects: 4, done.
Writing objects: 100% (4/4), 290 bytes | 290.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To https://gitlab.cis.iwate-u.ac.jp/グループ名/プロジェクト名.git
 * [new branch]      master -> master

(班長の)課題

git pushして変更をサーバに反映させましょう


他のメンバーがGitLabのリポジトリを複製する

班長がここまで頑張れば,ようやくGitLabサーバ側にも(コミットが反映されて)workディレクトリとREADMEファイルが追加されます.他のメンバーも,ブラウザで https://gitlab.cis.iwate-u.ac.jp/グループ名/プロジェクト名 にアクセスすればファイルが見られるはずですし,今後は他の人が行った変更やその履歴も閲覧することができます

他のメンバーも,以下で作業コピーを作れます.

$ cd ~; mkdir csd
$ cd csd
$ git clone https://gitlab.cis.iwate-u.ac.jp/グループ名/プロジェクト名.git

今度は「プロジェクト名」ディレクトリの中に workディレクトリとwork/READMEファイルがあるはずです.確認してみましょう.

$ ls -R
work

./work:
README

課題

git cloneして,班長が行った変更が反映されているか確認しましょう

再びグループ開発の流れ

班員全員がいったん,作業コピーを手元に置けば,グループ開発を進めることができます.以降の作業はおおよそ次のような流れです.

Gitの日常

班員Aの作業

  1. 手元の作業コピー内で普通に開発を進める.ファイルやディレクトリの追加はgit addコマンドで.
  2. ある程度進んで切りのいいところまで来たら,コミットする(git commit -a
  3. commitをGitLabサーバに送り込む(git push

班員B,班員Cの作業

  1. 手元で開発を進めながらも,時折,適当なタイミングで他のメンバーがpushした変更を取り込むgit pull
  2. 自身の変更も,適度なところでコミット(git commit -a)してサーバに送る(git push

コミット時の注意点

git commitは,実はaddコマンドで指定されたファイルしか,変更済とみなしてくれません.要するに,既に存在しているファイルをただ変更しただけでは,commitはそれには気づきません.そこで,大抵の場合は-aオプションを追加する必要があります.

$ git commit -a -m "コメント"

覚えておくべき基本コマンド

手元に作業コピーを作る

  • git clone ...

日常の開発作業のために・・・

  • git add ...
  • git commit -a -m "コメント"
  • git push
  • git pull

手元の作業コピーの状態(サーバ上のリポジトリとどう違うか)を調べるために・・・

  • git status
  • git diff
  • git log

これだけ覚えておけば当面は何とかなると思います.なお,各コマンドの詳細については,git help "(コマンド名)"と入力すればマニュアルが閲覧できます.(git help commitとか)

Gitのもう少し進んだ使い方

Gitに限りませんが,バージョン管理システムには非常に多くの機能があり,それを使いこなすことで生産性が高められます.興味のある人は,ぜひ,次のような機能の使い方も(自分で調べて)試してみて下さい.

  • ステージ
    • git resetgit stashなど
    • 特定のファイルを特定のバージョンに戻したりもできます(git checkout
    • コミットすべき重要なファイルと,そうでもないファイルを分けて扱うことができるようになります
  • ブランチ(branch)タグ(tag)
    • git branchなど
    • タグは「ある時点での作業コピーのスナップショット」,ブランチは「本流(trunkという)とは異なる別の開発版」のイメージ
  • push前のまずいcommitを消す
    • git rebase

(ほか執筆中)

SSHの公開鍵登録

教育用端末を使う範囲内であれば,SSH公開鍵を(GitLabに)登録・設定しておくことで,git pushgit pullの度にユーザ名を入力する手間が省けます.(パスワードは,毎回入力する必要があるようです.)

まずは公開鍵を作ります.

$ ssh-keygen -t rsa -C "git configで設定したuser.emailアドレス" -b 4096

途中,パスフレーズを聞かれますので適切に入力します(面倒なら空EnterでもOK).正常に終われば,ホームディレクトリ以下に.sshという不可視ディレクトリが作成され,その下にid_rsaid_rsa.pubという二つのファイルが生成されます.このid_rsa.pubが公開鍵になります.(id_rsaの方は秘密鍵なので間違わないように!)

この公開鍵id_rsa.pub(の中身)をGitLabに登録します.以下の画像を参考にしてください.

SSH

次に,ホームディレクトリ内に存在する.sshディレクトリの中にconfigという名前のファイルを作ります.そのファイルの中身は,以下のようにします.

Host           ssh02
HostName       192.168.0.176
User           「自分のユーザ名」
IdentityFile   ~/.ssh/id_rsa

Host           gitlab
HostName       gitlab.cis.iwate-u.ac.jp
User           git
IdentityFile   ~/.ssh/id_rsa
ProxyCommand   ssh -CW %h:%p ssh02

これで設定は終わりです.例えば,以下のようにgit cloneすれば,自分の班のリポジトリを clone できると思います.

git clone gitlab:2022_gXX/test_project.git