Gitlabの使い方
Git(ギット)とは?
- バージョン管理システム(Version Control System)の一種です
- ウィキペディアによるGit解説@
- 班が開発しているプログラム群やドキュメント類は,班員全員で共有して使う必要があります.そのために,Gitを使います.
- グループ開発の場合,特にバージョン管理が重要です
- この講義では,2017年まではSubversion(サブバージョン)を使っていました
- 2018年からGitに切り替えました.
- Gitを便利に使えるようにしたウェブサービスとして, GitLab@を使います.
- gitlabの開発元では「GitLabを誰でも使えるようにした公開サーバ」が運営されていますが,この講義で使うのは情報コース内に立てた以下のサーバです.
- 情報コースのGitLabサーバ https://gitlab.cis.iwate-u.ac.jp/
GitLabを用いたプログラムの共同開発の流れ
大まかな流れは次のようになります.
- 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.に置き換えて下さい.
グループが出来たら,他の班メンバーを招待します.下の画像を参考に,班員全員を招待してください.
(班長の)課題
班のグループを作成して,メンバー全員をGitLabグループメンバーとして追加して下さい
班のリポジトリを作る
班長がGitLabに新しい「プロジェクト」(今の段階ではリポジトリと同義に捉えてもらって構いません)を作り,そこにファイルを追加して,他のメンバーはその作業コピーを取り寄せる,という練習をしてみます.
先に流れを説明します.個々の詳細手順はその後で.
- 班長がGitLabで新規プロジェクトを作成(
Web GUI
から).中身が空のリポジトリが出来る. - リポジトリを複製し,手元(ローカル)に作業コピーを作成する.(
git clone
) - 手元にある空の作業コピーにファイルやディレクトリを追加してみる.(
git add
) - 変更をコミットする.(
git commit
) - コミットした変更を,GitLabサーバに送り込む(
git push
).ここで初めて,リポジトリに修正が反映される. - 班長以外の他のメンバーが,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からクリップボードにコピーしておけば入力の手間が省けます.
これで手元に「プロジェクト名」という空のディレクトリができます.このディレクトリが作業コピーです.空ですが,実際には不可視ディレクトリ.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 |
|
こんな感じにコメント入力を促されますので,適切に入力してからエディタを終了して下さい.面倒なら,適当なラインの#
を消せばコメント扱いではなくなりますので,それでも構いません(上の場合なら,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して,班長が行った変更が反映されているか確認しましょう
再びグループ開発の流れ
班員全員がいったん,作業コピーを手元に置けば,グループ開発を進めることができます.以降の作業はおおよそ次のような流れです.
班員Aの作業
- 手元の作業コピー内で普通に開発を進める.ファイルやディレクトリの追加は
git add
コマンドで. - ある程度進んで切りのいいところまで来たら,コミットする(
git commit -a
) - commitをGitLabサーバに送り込む(
git push
)
班員B,班員Cの作業
- 手元で開発を進めながらも,時折,適当なタイミングで他のメンバーがpushした変更を取り込む(
git pull
) - 自身の変更も,適度なところでコミット(
git commit -a
)してサーバに送る(git push
)
コミット時の注意点
git commit
は,実はaddコマンドで指定されたファイルしか,変更済とみなしてくれません.要するに,既に存在しているファイルをただ変更しただけでは,commitはそれには気づきません.そこで,大抵の場合は-a
オプションを追加する必要があります(「git 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 reset
やgit stash
など- 特定のファイルを特定のバージョンに戻したりもできます(
git checkout
) - コミットすべき重要なファイルと,そうでもないファイルを分けて扱うことができるようになります
- ブランチ(branch)とタグ(tag)
git branch
など- タグは「ある時点での作業コピーのスナップショット」,ブランチは「本流(trunkという)とは異なる別の開発版」のイメージ
- push前のまずいcommitを消す
git rebase
(ほか執筆中)