GitHubの基本操作

目標

課題1: GitHubアカウントを作成とSSH接続

Step 1: アカウントの作成

まず、GitHubにアカウントを作成する。既にGitHubにアカウントを持っている人はこのステップをスキップしてよい。ユーザ名、メールアドレス、パスワードを入力するが、ユーザー名は今後長く使う可能性があるのでよく考えること。場合によっては本名よりも有名になる可能性もある。メールアドレスは普段使うアドレスを設定しておく。このアドレスは公開されない(公開することもできる)。

https://github.com/にアクセスし、右上から「Sign up」を選ぶ。

以上を入力して「Continue」ボタンを押す。

「Welcome to GitHub」という画面が出てきたら登録完了だ。この画面はまだ使うので、まだブラウザを閉じないこと。

Step 2: SSH公開鍵の作成

SSH公開鍵のペアを作成する。なお、過去に作成したことがある場合はその鍵が使えるので、このステップを飛ばして良い。ターミナルのホームディレクトリにて、以下を実行せよ。

$ ssh-keygen
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/username/.ssh/id_ed25519):  # (1)
Created directory '/home/username/.ssh'.
Enter passphrase (empty for no passphrase): # (2)
Enter same passphrase again:                # (3)

パスフレーズを二度入力した後、

Your identification has been saved in /home/username/.ssh/id_ed25519
Your public key has been saved in /home/username/.ssh/id_ed25519.pub

といったメッセージが表示されたら成功である。id_ed25519が秘密鍵、id_ed25519.pubが公開鍵だ。秘密鍵は誰にも見せてはならない。公開鍵は、文字通り公開するための鍵で、これからGitHubに登録するものだ。

Step 3: SSH公開鍵の登録

GitHubに公開鍵を登録する。先ほどGitHubにログインした状態のブラウザで以下の作業をせよ。

cat .ssh/id_ed25519.pub

すると、ssh-ed25519から始まるテキストが表示されるため、マウスで選択して右クリックから「Copy」、そして、先ほどのGitHubの画面の「Key」のところにペーストし、「New SSH key」ボタンを押す。

This is a list of SSH keys associated with your account. Remove any keys that you do not recognize.というメッセージの下に、先ほどつけたTitleの鍵が表示されていれば登録成功だ。

Step 4: 鍵の登録の確認

正しく鍵が登録されたか見てみよう。ターミナルで、以下を実行せよ。

$ ssh -T git@github.com

もしAre you sure you want to continue connecting (yes/no/[fingerprint])?というメッセージが表示されたらyesと入力する。

Enter passphrase for key '/path/to/.ssh/id_ed25519':と表示されたら、先ほど設定したパスフレーズを入力する。その結果、

Hi GitHubアカウント名! You've successfully authenticated, but GitHub does not provide shell access.

と表示されたら、鍵の登録に成功している。

Step 5: リポジトリの作成とクローン

では実際にGitHubと通信して、データのやり取りをしてみよう。まずはGitHubでリポジトリを作成して、ローカルにクローンする。

次に、ローカルマシンでgithubディレクトリの下に先ほど作ったリポジトリをクローンしよう。以下を実行せよ。

cd
cd github
git clone git@github.com:アカウント名/github-test.git
cd github-test

先ほどURLをコピーしていたので、git cloneまで入力した後で、空白を入力してから右クリックで「Paste」を選べば良い。すると、パスフレーズを要求されるので、先ほど設定した秘密鍵のパスフレーズを入力しよう。正しく公開鍵が登録されていたらクローンできる。

Step 6: ローカルの修正とpush

手元にクローンしたリポジトリを修正し、GitHubに修正をpushしてみよう。

まず、クローンしたリポジトリのREADME.mdを修正しよう。VSCodeの「フォルダを開く」によって、先ほどクローンされたgithub-testディレクトリを開き、README.mdを開こう(Vimを使える人はVimで開いても良い)。

すると、以下のような内容が表示されるはずだ。

# github-test
test repository

これを、以下のように「Hello Github」と一行追加し、保存せよ。

# github-test
test repository

Hello GitHub

この状態で、README.mdの修正をgit addしてgit commitしよう。ターミナルで以下を実行せよ。

git add README.md
git commit -m "updates README.md"

これでローカルの「歴史」は、GitHubが記憶している「歴史」よりも先に進んだ。歴史を見てみよう。

$ git log --oneline
1db6b18 (HEAD -> main) updates README.md
0a103b5 (origin/main, origin/HEAD) Initial commit

コミットハッシュは人によって異なるが、origin/mainよりも、HEAD -> mainが一つ先の歴史を指していることがわかる。この「新しくなった歴史」をGitHubに教えよう。ターミナルで以下を実行せよ。

git push

パスフレーズを聞かれるので入力せよ。これでローカルの修正がリモート(GitHub)に反映された。もう一度ブラウザでGitHubのリポジトリを見てみよう。ブラウザをリロードしてみよ。ローカルの変更が反映され、画面に「Hello GitHub」の画面が表示されたら成功だ。

課題2: ローカルのリポジトリをGitHubに登録

先ほどはGitHub側で新規リポジトリを作り、それをローカルにクローンした。しかし、まずローカルで開発を進め、ある程度形になったらGitHubに登録することの方が多いであろう。そこで、ローカルでリポジトリを作ってからGitHubに登録する作業を体験しよう。

Step 1: ローカルにリポジトリを作る

ターミナルのgithubディレクトリ以下にtest2というディレクトリを作ろう。

cd
cd github
mkdir test2
cd test2

ここでまたREADME.mdファイルを作る。VSCodeで「フォルダーを開く」からgithub/test2ディレクトリを開き、ファイルの追加ボタンを押してREADME.mdを新規作成する。

内容は何でも良いが、例えば以下の内容を入力して保存しよう。

# test2

2nd repository

この状態で、Gitリポジトリとして初期化し、最初のコミットをしよう。ターミナルので以下を実行せよ。

git init
git add README.md
git commit -m "initial commit"

Step 2: GitHubにベアリポジトリを作る

GitHubのホーム画面の左上の「Repositories」の右にある「New」をクリックする。Repository nameはtest2、Descriptionは無くても良いが、とりあえず2nd repositoryとしておこう。また、今回もPrivateリポジトリとする。

空のリポジトリを作りたいので、「Initialize this repository with:」のチェックは全て外した状態で「Create Repository」とすること。

すると、先ほどとは異なり、全くファイルを含まない空のリポジトリが作成される。そこには「次にすべきこと」がいくつか書いてあるが、まずは、「Quick setup — if you’ve done this kind of thing before」のしたにある「HTTPS」「SSH」のボタンのうち、「SSH」を押す。

その後、「既に存在するリポジトリをpushする(…or push an existing repository from the command line)」を実行するため、そこに書かれている以下のコマンドをコピーする。

git remote add origin git@github.com:アカウント名/test2.git
git branch -M main
git push -u origin main

これをターミナルに貼り付けて実行すれば、プッシュできる。「Ctrl+C」ではなく、この状態で、もう一度GitHubの当該リポジトリを見てみよう。ブラウザをリロードせよ。リポジトリにREADME.mdが作成された状態になるはずだ。

課題3: Issue管理

Gitでは、原則としてメインブランチで作業をしない。これから作業をする内容によってブランチを作成し、そのブランチ上で作業し、完成したらメインブランチにマージする、という作業を繰り返すことで開発をすすめる。それぞれの作業に対応するブランチを作業ブランチ(トピックブランチもしくはフィーチャーブランチ)と呼ぶ。

一般に、必要な作業は複数同時に発生する。このとき、どのタスクを実行中で、どのタスクが手つかずか、タスク管理をしたくなる。原則としてタスクと作業ブランチは一対一に対応するのであるから、それらをツールで一度に管理したくなるのは自然であろう。それがGitHubのissueである。

GitHubを使う場合、

という流れで開発をすすめる。issueとは「課題」という意味であり、一般に課題を管理するシステムをIssue Tracking System (ITS)と呼ぶ。一種のTodo リストだと思えば良い。GitHubはITSの機能を持っている。

以下ではブランチとIssueを連携させた開発について体験しよう。

Step 1: Issueの作成

以上の操作の後「Create」ボタンをクリックする。すると、「READMEの修正 #1」というissueが作られたはずだ。ここで「#1」とあるのはissue番号であり、issueを作るたびに連番で付与される。この画面は後で使うので、そのままブラウザを閉じないこと。

Step 2: ブランチの作成

次に、issueに対応するブランチを作成する。ブランチの命名規則には様々な流儀があるが、先ほどつけたラベル(enhancement)、issue番号(1)、そして修正内容を含めるのが一般的だ。ここではディレクトリ型の命名規則を採用しよう。ディレクトリ型の命名規則では「ラベル/issue番号/内容」という名前のブランチを作成する。今回、「enhancement」というラベルをつけたが、これは「新しい機能(feature)を追加する」という意味なので、「feat」とする。あとはissue番号1番、READMEの修正なので、全てまとめてfeat/1/READMEというブランチを作ることにする。

ターミナルで以下を実行せよ。

cd
cd github
cd github-test
git switch -c feat/1/README

Step 3: コミットとマージ

今、カレントブランチがfeat/1/READMEブランチとなったはずだ。このブランチ上で、README.mdに一行追加しよう。

# test
test repository

Hello GitHub
modifies README

修正したら、git addgit commitするが、コミットメッセージをcloses #1とする。また、closes#1の間には空白を入れる。シャープ#を忘れたり、全角にしたり、数字との間に空白を挟んだりしないこと。

git add README.md
git commit -m "closes #1"

修正をmainに取り込もう。

git switch main
git merge feat/1/README

Step 4: 修正のプッシュとissueのクローズ

以上の修正をpushする。pushする前に、先ほどのissueの画面をブラウザで表示しておくこと。ブラウザの画面が見える状態でターミナルからgit pushする。

git push

ブラウザのissueの画面を見てみよう。push後に自動的にissueが閉じられたはずだ。

このように、fixesclosesといった動詞と#1のような形でissue番号が含まれたコミットメッセージを含むコミットがpushされると、GitHubがそれを検出し、自動的に対応するissueを閉じてくれる。

不要になったブランチは消しておこう。

git branch -d feat/1/README

課題4: Projectの利用

issueには「open (未完了)」と「closed (完了)」の二状態しかないが、issueが増えてくると、いまどのissueがどういう状態なのかをより細かく管理したくなる。例えば未完了と完了の間に、「作業中」という状態が欲しくなる。このような状態を管理するのがProjectだ。以下では、もっとも基本的なProjectであるKanbanを使ってみよう。

Step 1: Projectの作成

まずはBoard(Kanban)方式のプロジェクトを作成し、リポジトリに関連付けよう。以下の作業を実施せよ。

  1. GitHubの、自分のアカウントgithub-testリポジトリを表示する
  2. 上のタブから「Project」を選び、現れた「+ New project」ボタンをクリック。
  3. 左のメニューから「Board」を選び、「Project name」を「Kanban」に変更してから「Create」ボタンを押す。

Step 2: Issueの作成とProjectへの関連付け

またgithub-testリポジトリに戻る。左上のアイコンをクリックし、リポジトリからgithub-testを選ぶ。

上のタブから「Issues」をクリックし、「New Issue」ボタンを押し、新たにissueを作る。Titleは「READMEの修正」とする。Issueのコメントには、他のissueを参照したり、チェックボックスを作る機能があるので試してみよう。コメントに以下の内容を記述せよ。

- [ ] 修正1 (#1 に追加)
- [ ] 修正2

ここで「#」と数字の間には空白をいれず、「#1」の後には半角空白を入れるのをわすれないこと。また、- [ ]の間には半角空白を入れる。入力をしたら「Preview」タブを見て、チェックボックスができているか、別のissueにリンクされているか確認すること。

ラベルは先ほどと異なるもので試したいので「documentation」を選ぶ。

このissueをprojectと関連付けよう。右の「Labels」の下にある「Projects」を開き、先ほど作った「Kanban」を選ぼう。

以上の準備が済んだら「Create」ボタンを押し、issueを作る。この画面はまた使うのでブラウザを閉じないこと。

Step 3: ブランチの作成

ターミナルに戻り、ブランチを作成しよう。今回はラベルがdocumentation、issue番号が2番、内容がREADMEの修正なので、doc/2/READMEとしよう。ターミナルのgithub-testリポジトリで以下を実行せよ。

git switch -c doc/2/README

ブランチを作成したら、このissueのステータスを「作業中」にしよう。GitHubのgithub-testリポジトリの「Projects」タブから「Kanban」を選ぶ。

すると、「No Status」のところに「READMEの修正」というカードが出来ているはずなので、マウスで「In progress」にドラッグしよう。また「Issues」タブにもどって先ほどのissueを見てみると、「Projects」の「Kanban」で、状態が「In progress」になっていることがわかる。

状態とブランチの関係はプロジェクトやチームによって異なるが、例えば「ブランチを作ったらIn progressにする」というルールにしておくと、逆に「In progressになっていれば、ブランチがあるはず」とわかって便利だ。

Step 4: 修正とマージ

またREADME.mdを修正しよう。「Hello Kanban」という一行を追加せよ。

# test
test repository

Hello GitHub
modifies README
Hello Kanban

ファイルを保存したら、今度はfixes #2というメッセージでコミットする。

git add README.md
git commit -m "fixes #2"

またmainブランチに戻って、修正を取り込もう。まだpushしないこと。

git switch main
git merge doc/2/README

Step 5: 修正のプッシュとカードの移動

マージが終了したらブラウザで先ほどの「Kanban」の画面を見よう。まだカードは「In progress」にある。

この状態でターミナルからgit pushしよう。

git push

2番のIssueが閉じられると同時に、自動でカードが「In progress」から「Done」に移動したはずだ。

課題5: プルリクエストを作ってみる

GitHubでは、公開されているリポジトリを自分の場所に「コピー」することができる。これをforkと呼ぶ。公開リポジトリは、HTTPSによりクローンはできるが、書き込み権限がなければ修正できない。しかし、forkすれば自分の所持するリポジトリとなるので、好きなように修正できる(ただし、ライセンスには気を付けること)。

Step 1: リポジトリのfork

まず、既存のリポジトリをforkしよう。以下のサイトにアクセスせよ。

このサイトの右上に「Fork」というボタンがあるので、それを押す。すると自分のアカウントのリポジトリとしてコピーされる。

Step 2: リポジトリのクローン

ブラウザのURLがhttps://github.com/自分のアカウント/リポジトリ名になったら、フォークが完了している。ローカルにクローンしよう。「Code」ボタンの「Clone」からリモートリポジトリをコピーできる。プロトコルがHTTPSではなくSSHになっていることを確認すること。

cd
cd github
git clone git@github.com:アカウント名/pullreq_2025.git
cd pullreq_2025

Step 3: ブランチの作成

次に、ブランチを作成するが、ブランチ名を「自分のGitHubアカウント名」のSHA-1ハッシュの上位7桁としよう。例えばアカウント名がwatanabeである時、以下のコマンドを実行せよ。

$ echo watanabe | shasum
89be149ce7de4c9dd73baeab4e4d068e6995470a  -

上記のSHA-1ハッシュは各自異なるため、以下は適宜読み替えること。

表示された上位7桁89be149をブランチ名として、ブランチを作ろう。

git switch -c 89be149

Step 4: ファイルの追加とプッシュ

先ほどのSHA-1ハッシュをファイル名として、ファイルを作ろう。

echo Hello > 89be149952e1380212b0998f07a6afe4e5f00428

できたファイルをgit addgit commitしよう。

git add 89be149952e1380212b0998f07a6afe4e5f00428
git commit -m "adds a file"

最後に修正をプッシュしよう。

git push origin 89be149

git push originの後にブランチ名を入れるのを忘れないこと。

Step 5. プルリクエストの作成

GitHubのフォークしたページを見ると、上部に「Compare & pull requst」というボタンが出来ているので押す。すると「Open a pull request」という画面に遷移するので、タイトルとコメントを入力する。タイトルは「add a file」、コメントはなんでも良いが、例えば「よろしくお願いします。」などとしておく。最後に「Create a pull request」を押せば、fork元にプルリクエストが飛ぶ。講義後、まとめて私がマージするが、その際にメールが飛ぶはずである。