🔩 ねじき教室 Go と Web の教室

Git 超入門

読了目安 約3分

ISUCON のチーム戦に必要な最小限の Git を、コミット、戻す操作、GitHub との同期に絞って説明します。

この章の目次

ISUCON のチーム戦には、チームメイトの変更を取り込む手段と、壊したときに動いていた状態へ戻す手段が要ります。 どちらも担う道具が Git です。

Git は何を解決するのか

Git は、コードの変更履歴を記録し、複数人で共有するためのバージョン管理システムです。 競プロでは、提出したコードはジャッジ側に残りますが、手元のコードは上書きすれば消えます。 Git を使うと、「動いていた時点」を好きなだけ記録しておき、いつでもそこへ戻せます。

覚える概念は三つです。

  • リポジトリ:Git が履歴を管理する単位です。プロジェクトのディレクトリ一つがリポジトリ一つに対応します。
  • コミット:ある時点のファイル一式を記録したセーブポイントです。ゲームのセーブと同じで、作った分だけ戻り先が増えます。
  • ブランチ:履歴を枝分かれさせる仕組みです。本格的な開発では中心的な機能ですが、ISUCON では main という一本のブランチだけで回せます。いまは「そういうものがある」とだけ覚えれば十分です。

記録するまでの一連の流れ

コードを直してからコミットを作るまでは、次の 4 つのコマンドで進みます。

シェル
git init          # このディレクトリをリポジトリにする(最初に一度だけ)
git status        # いま何が変更されているかを一覧する
git add main.go   # 変更をコミットに含めるものとして選ぶ
git commit -m "投稿一覧の N+1 を解消"   # 選んだ変更でコミットを作る

git add は、どの変更を一つのコミットにまとめるかを選ぶ段です。 全部まとめてよければ git add . と書けます。

確認には次の 2 つを使います。

シェル
git log --oneline   # コミットの一覧を新しい順に見る
git diff            # まだコミットしていない変更の中身を見る

git log の行頭に付く英数字の ID(コミット ID)は、「戻す」操作で使います。

壊したときの戻し方

戻すコマンドは、もうコミットしたかどうかで二つを使い分けます。

コミットする前なら git restore を使います。

シェル
git restore main.go   # main.go への変更を捨てて、最後のコミットの状態に戻す

コミットしていない変更は消えるので、git diff で捨ててよい変更かを見てから実行します。

コミットした後なら git revert を使います。

シェル
git revert <コミットID>   # そのコミットの変更を打ち消す新しいコミットを作る

git revert は履歴を消さず、「打ち消した」記録を新しいコミットとして積むので、GitHub でチームと共有している履歴にも安全に使えます。

履歴そのものを書き換えて戻すコマンド(git reset など)もありますが、共有中の履歴に使うと事故のもとです。

GitHub でチームと共有する

GitHub は、Git のリポジトリをインターネット上で預かる Web サービスです。 チームの一人が GitHub 上にリポジトリを作り、全員がそこを共有の置き場として使います。

やり取りは次の 3 つのコマンドで行います。

シェル
git clone <リポジトリの URL>   # GitHub 上のリポジトリを手元に複製する(最初に一度だけ)
git pull                       # チームメイトのコミットを手元に取り込む
git push                       # 自分のコミットを GitHub に送る

チームでの共有は、「作業前に git pull、コミットしたら git push」の往復だけで回ります。

同じ箇所を二人が同時に直すと、取り込みの際にコンフリクトが起きます。どちらの変更を採るか Git が決められない状態で、「誰がどのファイルを触るか」の分担が簡単な予防策です。

この先を学ぶには

ブランチを使った開発やここで挙げなかったコマンドは、必要になったときに Git 公式ドキュメント を引いてください。