GitHubの使い方
はじめに_
Linux/Unix環境でのGit入門をひととおり実行したという前提になっています。
GitHub_
GitHubは、最近、チーム開発の主流となっているWebサービスである。GitHubは、Gitリポジトリのフロントエンドだけでなく、バグトラッキングシステム(プロジェクト管理システム)の機能も兼ね備えている。近年、ソーシャルコーディングと呼ばれる開発プロセスを実現するための中心的サービスとなっている。
後藤研究室ではGitHubクローンのGitLabを用いて、開発しているソフトウェアのソースコードなどを管理している。
ここでは、GitHubの使い方を中心に練習するが、GitHubクローンであるGitLabもほぼ同じ使い方をできる。
GitHubのアカウント作成(GitHubのアカウントを持っていない人のみ)_
電子メールによる確認があるため、任意のメールアドレスでアカウントを作成すること。登録メールアドレスはアカウント作成後に変更ができる。特にこだわりがなければ大学発行メールアドレス(@ms.saitama-u.ac.jp)でアカウント作成を行うとよいと思う。
アカウントの作成はGoogleで「ツール」の期間指定で1年以内を選択し、キーワード「GitHub アカウント作成」で検索して探すといろいろ見つかる。たとえば以下のページが見つかる。
OpenSSHで作成した公開鍵の登録_
GitHub/GitLabでは、GitHub/GitLab上に作成したリモートリポジトリへpush/pullを行う際にsshを用いて接続する。クライアントコンピュータのOS(Gitの作業ツリーを作成するコンピュータのOS)ごとに公開鍵と秘密鍵のペアを作成し、公開鍵をこのため、GitHub/GitLab上に登録しなければならない。
以下に、GitHubにおいて公開鍵を登録する手順を説明する。
まず、GitHubにログインする。そして、ウィンドウ右上の(下図で赤い円で囲ってある)アイコンをクリックし「Settings」を選択する。

続いて、左側のリストから「SSH and GPG keys」を選択する。

「New SSH key」をクリックする。

以下のウィンドウでまでたどり着いたならば、クライアントコンピュータ(今、自分が使っているコンピュータ)のOS上で公開鍵と秘密鍵のペアを作成する。

公開鍵と秘密鍵ペアの作成_
まず、ssh-keygenコマンドが存在するかを確認する。ssh-keygenコマンドが存在するパスが返ってきたら、ssh-keygenコマンドを利用できる。そうでなければ、まずOpenSSHをインストールすること。
% which ssh-keygen /usr/bin/ssh-keygen
GitHub用に新たに鍵ペアを作成する。お使いのLinux/Unixマシンのユーザ名を確認する。ターミナル上で以下のコマンドを実行する。以下の例ではユーザ名がgotohとわかる。
% whoami gotoh
自分のホームディレクトリの絶対パスをpwdコマンドで確認する。 {{ % pwd /home/gotoh }}}
以下で使用するssh-keygenというコマンドは ~/.ssh というディレクトリの下に公開鍵と秘密鍵を生成する。このときデフォルトのファイル名は公開鍵が id_rsa.pub、 秘密鍵がid_rsaとなる。
今回GitHubに登録する鍵の名前は「/ホームディレクトリの絶対パス/.ssh/id_rsa.github」とする。パスフレーズ(passphrase)は鍵の利用時につかうパスワードである。パスフレーズは他のWebサービスで使っていない任意の文字列を入力する方がよい。以下のコマンドをターミナル上で実行し、公開鍵と秘密鍵を生成する。
% cd % ssh-keygen -t rsa -C "GitHubに登録したメールアドレス" Generating public/private rsa key pair. Enter file in which to save the key (/export/home/teachers/gotoh/.ssh/id_rsa): /export/home/teachers/gotoh/.ssh/id_rsa.github Enter passphrase (empty for no passphrase): (パスフレーズを入力する。なお、入力しても何も表示されない。) Enter same passphrase again: (もう一度、パスフレーズを入力する) Your identification has been saved in /export/home/teachers/gotoh/.ssh/id_rsa.github. Your public key has been saved in /export/home/teachers/gotoh/.ssh/id_rsa.github.pub. The key fingerprint is: 9c:e6:56:10:70:a0:2a:8d:d3:4c:da:e4:e8:e2:34:3e gotoh@aise.ics.saitama-u.ac.jp
鍵ペアが存在するかを確認する。id_rsa.github(秘密鍵)とid_rsa.github.pub(公開鍵)があればOK。
% ls -l .ssh
GitHub用の鍵を~/.ssh/configで登録しておく。configが無い場合は以下のように作成する。この設定は、GitHubとやりとりする際に先ほど使った公開鍵・秘密鍵ペアをいつも使うようにするため。
% cd ~/.ssh % touch config % chmod 600 config
以下をエディタなどでconfigに追加する。
Host github.com HostName github.com IdentityFile ~/.ssh/id_rsa.github User git
公開鍵の登録_
~/.ssh/id_rsa.github.pubが公開鍵であるため、これをGitHubに登録する。

GitHubの上記のウィンドウの「Title」にどこのコンピュータ上の公開鍵なのかがわかる識別名を入力する。たとえば、ノートパソコン上のWindows Subsystem for LinuxにインストールしたUbuntuに公開鍵がある場合は「UbuntuOnWSLInLaptoopPC」などと入力する。「Key」の部分には~/.ssh/id_rsa.github.pubの中身をコピー&ペーストして貼り付ける。~/.ssh/id_rsa.github.pubの中身はエディタで開いても良いし、catコマンドなどで標準出力に出しても良い。私のファイルの例だと以下のようになる。
% cat ~/.ssh/id_rsa.github.pub ssh-rsa AAAAB3Nza~中略~PrfYh gotoh@aise.ics.saitama-u.ac.jp
入力したら「Add SSH key」をクリックする。
以下のように登録されていたら成功。

リモートリポジトリの作成→clone→push_
GitHubでリモートリポジトリを作成してみる。右上の「+」アイコンをクリックし、リポジトリの作成を選ぶ(以下の画像のとおり)。

GitHubで作成できるリポジトリはpublicリポジトリとprivateリポジトリの2種類がある。前者は世界中の誰でもアクセスでき、後者は指定したユーザのみアクセスできる。GitHubでは無料プランの場合、privateリポジトリは1つしか作成することができない。
今回はpublicリポジトリを作成する。リポジトリ名を「pracrepo」とし、「Create Repository」をクリックする。

すると、以下のようにリポジトリを作成した後のコマンド例が表示される画面になる。一番上のテキストボックスに表示されているURLがGitHubに作成したリモートリポジトリへのアクセスURLとなっている。

リモートリポジトリをクライアントマシン上にコピーする。「git clone」コマンドの後ろのURLは各自のリモートリポジトリのURLをコピーすること。また、github.comのサーバとの接続を継続するか尋ねられるので「yes」を入力すること。求められているパスフレーズ(passphrase)は、公開鍵・秘密鍵ペアを作成したときのものである。
以下に私のリポジトリでの実行例を提示する。
% cd ~/GitSandbox % git clone git@github.com:yuichigoto/pracrepo.git Cloning into 'pracrepo'... The authenticity of host 'github.com (52.192.72.89)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,52.192.72.89' (RSA) to the list of known hosts. Enter passphrase for key '/home/gotoh/.ssh/id_rsa.github': remote: Enumerating objects: 12, done. remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 12 Receiving objects: 100% (12/12), done. Resolving deltas: 100% (1/1), done. % ls % cd pracrepo
リモートリポジトリの設定を確認してみる。以下の例は私のリポジトリでの実行例。
% git remote -v origin git@github.com:yuichigoto/pracrepo.git (fetch) origin git@github.com:yuichigoto/pracrepo.git (push)
README.mdファイルを作成し、追加する。
% touch README.md % git add README.md % git commit -m "First commit."
README.mdファイルの中身を以下のようにする。
## Project Name This is a test repository.
コミットし、GitHubに反映させる。
% git commit -a -m "Second commit." % git push Enter passphrase for key '/home/gotoh/.ssh/id_rsa.github': Counting objects: 6, done. Delta compression using up to 80 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (6/6), 485 bytes | 0 bytes/s, done. Total 6 (delta 0), reused 0 (delta 0) To github.com:yuichigoto/pracrepo.git * [new branch] master -> master
GitHubのリポジトリのトップページにアクセスしてみる。以下の画面のようにREADME.mdの中身が表示される。

GitHubではGitHub風マークダウンで記述されたREADME.mdをリポジトリのトップページに表示してくれる。
Issueとコミット時のコメントの連携(チケット駆動開発)_
複数人で開発するときにも、一人で開発するときにも良くあるのが、「今、なぜソースコードの編集しているんだっけ?」という事態である。常に何を目的として、何の作業をしているのかを明確にするため、GitHub/GitLabのIssueという機能を利用して、開発するのが良い。
GitHubのリモートリポジトリのトップページへ移動し、「Issues」というタブをクリックする。すると以下の画面が開く。開いたら「New Issue」をクリックする。

以下のようにIssueを入力する。右の「Label」でIssueの種類を、「Milestone」で終了期限を、「Assignes」で誰に割り振るのかを明示できる。「Submit new issue」でIssueを保存する。

保存されたIssueは以下のようになる。Issueには番号が自動で割り振られ、コメントなどを追記することができる。

先にソースコードの変更目的およびゴールを明確化に文章化する(これをチケットと呼ぶ)。その後、ソースコードをチケットを達成するために変更する。このような開発の方法をチケット駆動開発と呼ぶ。チケット駆動開発はチームでソフトウェアを開発するときの基本となっている。
GitHub/GitLabではIssueという機能でチケット駆動開発を行えるようにサポートしている。そこで、ソースコードの変更は基本的にIssueを達成するために行う。Issueと現在の作業を対応づけるために、ブランチ名とコミットの際のログへの記載を利用する。
Issue#1をみたすためのトピックブランチを作成する。
% cd ~/GitSandbox/pracrepo % git branch % git pull (作業ツリーで作業をする前にはリモートリポジトリからpullしておいた方が無難) % git branch i_001 % git branch i_001 * master % git checkout i_001
このようなトピックブランチを作っておくと、何のために作業しているのかがわかりやすい。エディタなどでREADME.mdを以下のように編集する。
## GitHub練習プロジェクト - 箇条書き1 - 箇条書き2 - 箇条書き3 - 箇条書き4 ### H3相当の見出し Issueと連携させるためには#1と書きます。 たとえば、このリポジトリのIssue1は #1 です。 ### ユーザ名のリンク アットマークをつけてGitHubのユーザ名を記載するとリンクを張ることができます。 @yuichigoto
変更を反映させる。
% git commit -a
コメントを以下のようにする。
ref #1 Now editting it.
masterブランチにマージしてプッシュする。
% git checkout master % git merge i_001 % git push
すると、Issueと今回のコミットが自動的にリンクする。

さらに README.md を充実させる。
% git checkout i_001
ちょっと追加
## GitHub練習プロジェクト - 箇条書き1 - 箇条書き2 - 箇条書き3 - 箇条書き4 ### H3相当の見出し Issueと連携させるためには#1と書きます。 たとえば、このリポジトリのIssue1は #1 です。 ### ユーザ名のリンク アットマークをつけてGitHubのユーザ名を記載するとリンクを張ることができます。 @yuichigoto ### 追加 何か書く。
以下のコメント付きでコミットする。
% git commit -a -m "fixed #1 Finished editting."
リモートリポジトリにプッシュする。
% git checkout master % git merge i_001 % git push
Issue#1が終了しているのを確認する。

これは、tiimgreen/github-cheat-sheet(日本語訳):コミットからissueを閉じるによると「あるコミットでissueを解決した場合、コミットメッセージでfix/fixes/fixedやclose/closes/closed、resolve/resolves/resolvedに続けてissue番号を指定すると、そのコミットがmasterブランチにpushされると同時に指定issueが閉じられる」という機能。
以上のようにブランチ名とコミットログを用いてIssueとソースコードの変更を関連づけすることができる。
不要なトピックブランチは削除する。
% git branch -d i_001 % git branch
ここまでの作業が終わると以下のようなReadmeになる。
他のGitHub/GitLabリポジトリのfork_
GitHub上のpublicリポジトリをforkしてみる。GitHub yuichigoto:checklistsにアクセスし、右上の「Fork」ボタンをクリックする。

そうすると、checklists が自分のリモートリポジトリとしてコピーされる。このリポジトリ内の内容をいくら変更しても、元のリポジトリには影響を与えない(元のリポジトリに反映してもらう場合はPull Requestを送ることになる)。
GitHubのパブリックリポジトリ(GitHub上でアクセスできるリポジトリ)は、このようにして、誰でも自由にforkすることができる。このため、他人に見せたくないソースコード(たとえば、研究室配属された後に研究室で開発しているソフトウェアのソースコードや他人/自分の卒業論文など)はGitHubのパブリックリポジトリとして公開してはいけない。
おわりに_
GitHub/GitLabには、チーム開発のあり方をかえたPull Requestという機能があるが、私もあまり使っていないので興味ある方は調べてみてほしい。