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 公式ドキュメント を引いてください。