Git とは — 変更を記録し、元に戻せる仕組み

この記事は、プログラミングやバイブコーディングをする上で最低限身につけたほうがよい IT の実践的な知識を 1 から身につける「IT 基礎知識講座の一部」です。
上書き保存では前の状態が残りません。コミットで記録を残し、リポジトリに積み上がった記録から前の時点を取り出すまでの流れを、図解で確かめます。

この記事は、Git を扱います。

Git はファイルの変更を記録して前の状態に戻せる仕組みで、その記録をサーバーに置くと、別の人とも同じ状態にそろえられます。

3 か所に並ぶのは同じ記録で、サーバーを間に置いてそろえます。

Git は何をする仕組みか — 記録を残し、リモートで共有する

ファイルの変更を時点ごとに記録し、過去の状態を取り出せるようにする仕組みがバージョン管理(version control)です。

記録を保存する場所がリポジトリ(repository)、それをサーバー側に置いたものがリモートリポジトリ(remote repository)、1 回分の記録がコミット(commit)です。

リモートリポジトリを置くサービスの代表例が GitHub と GitLab で、GitHub は Git そのものではなく、リモートリポジトリを置く場所です。

自分のパソコンと GitHub のサーバー
自分のパソコン
my-app フォルダ
作業中のファイル
  • app.js と style.css
  • 上書き保存で中身が置き換わる
リポジトリ
  • コミットが古い順に並ぶ
  • git commit で 1 つ増える
GitHub のサーバー
my-app のリモートリポジトリ
  • git push で送ったコミットが並ぶ
  • https://github.com/example/my-app.git がその場所
  • 別のパソコンからも読み書きできる
左が自分のパソコン、右が GitHub のサーバー。my-app フォルダの中のリポジトリと、サーバーのリモートリポジトリは別の場所にあり、どちらもコミットを持つ。

自分のパソコンの記録をサーバーに送るのがプッシュ(push)、サーバーの記録を取り込むのがプル(pull)です。

サーバーを間に置くので、同僚がいつ取り込んでも同じ中身になります。

手順書に出てくる Git の文言は、3 つに分かれます。

手順に出てくる文言と、Git の操作の対応
===「コミットしておきましょう」「GitHub に上げてください」「最新を取り込んでください」コミットプッシュプルapp.js の変更が記録に残る記録がサーバーに送られるサーバーの記録を取り込む自分のパソコンの中だけ自分 → GitHubGitHub → 自分
各行が 1 つの操作。左から右へ、手順の文言・操作の名前・そのとき起きること・どこまで届くか、の順に並びます。いちばん上だけ自分のパソコンの中で完結します。

左の列は自分のパソコンの中だけ、中央と右は GitHub とやり取りします。

上書き保存では前の状態が残らない — バージョン管理が記録するもの

上書き保存は、app.js の中身を今の中身で置き換える操作です。

置き換えたあとに前の中身は残らないので、保存を繰り返しても前の状態には戻せません。

直す前にしたこと前の中身がある場所動かなくなった後
上書き保存だけどこにも残らない戻せない
エディタを開いたまま取り消しの履歴(閉じると消える)開いている間の編集は戻せる
git commit を打ってあるリポジトリの記録いつでも戻せる

コミットしてあるときだけ、前の中身がリポジトリに残ります。

分かれ目は、直す前に git commit を 1 回打ってあるかどうかだけです。

この 1 回で、戻れる時点ができます。

記録を残すのはコミットだけ

上書き保存は今の中身で古い中身を消す操作で、消えた中身はパソコンのどこにも残りません。

コミットは中身を消さずにその時点の app.js を記録として 1 つ足すので、動かなくなったときに戻れるのは、コミットしてある時点だけです。

コミットは、記録する変更を選んでから残す 2 段階

コミットは、先に選び、そのあとで記録する 2 段階に分かれています。

選んで登録する段階がステージング(staging。コミットに含める変更を選んで登録する段階)で、この 2 段階のせいで my-app フォルダの中には置き場所が 3 つできます。

my-app フォルダの中で、変更が通る 3 つの置き場所
my-app(作っている予約アプリのフォルダ)
作業中のファイル
  • app.js — 今エディタで開いている中身
  • style.css — 画面の見た目を書いたファイル
  • 上書き保存すると、ここの中身が置き換わる
Git が作る専用のフォルダ
ステージング
  • git add で選んだ変更が入る
  • git commit を打つと空に戻る
リポジトリ
  • コミットが古い順に並ぶ
  • git commit で 1 つ増える
外側が my-app フォルダ。上が今エディタで開いているファイル、下が Git が作る専用のフォルダで、その中にステージングとリポジトリが入っている。

変更は上から下へ、git add と git commit の 2 回で移ります。

選ばなかった index.html の変更は消えず、次の回に選び直せます。

確かめてから記録する手順は、この 3 行で出てきます。

# 直したファイルを確かめる
git status

# 記録する変更を選んで登録する
git add app.js

# 選んだ変更に、短いメッセージを付けて記録する
git commit -m "ログイン画面を追加"

git status を打つと直したファイルの名前が並び、git log で記録の一覧が出ます。

git add を打たないまま git commit を打つと、選ばれた変更が 1 つも無いので、記録は作られません。

記録する前に、記録するものを選ぶ

コミットは、選ぶ・残すの 2 段階です。

git add でこの回の記録に入れる変更を選び、git commit で選んだ分だけを 1 つの記録にするので、選ぶほうを打ち忘れると記録は 1 つも増えません。

リポジトリはフォルダの中にあり、コミットが古い順に並ぶ

リポジトリが入っている専用のフォルダは、そのフォルダで記録を始める git init を打った時点で作られます。

コミットするたびに、その中の記録が 1 つずつ増えます。

リポジトリの中に並ぶコミット
リポジトリ(Git が作る専用のフォルダの中)
最初のコミット
  • 画面を作った時点の app.js
  • 日時と「画面を作成」というメッセージ
2 つ目のコミット
  • 入力欄を足した時点の app.js と style.css
  • 日時と「入力欄を追加」というメッセージ
最新のコミット
  • いちばん新しく記録した app.js
  • 日時と「ログイン画面を追加」というメッセージ
外側がリポジトリ。中のコミットは古い順に上から並び、新しく記録しても前のコミットは書き換わらない。

戻す操作は、並んでいる記録から 1 つ選び、その中身で作業中の app.js を置き換えることです。

記録したくないファイルは、フォルダの中の .gitignore という設定ファイルに名前を書いておけます。

まだ記録していないファイルはこれで記録されなくなり、一度記録したファイルには効きません。

記録は消えずに、古い順に並ぶ

リポジトリは、my-app フォルダの中にある専用のフォルダの中です。

コミットするたびに記録が 1 つずつ増え、前の記録が書き換わることはないので、戻すというのは並んでいる記録から 1 つ選んで、今のファイルをその中身にすることです。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1上書き保存とコミットの違いとして正しいものはどれですか。

Q2コミットは 2 段階に分かれています。記録として残す前に行う段階はどれですか。

Q3自分のパソコンのリポジトリに残したコミットを、サーバーに置いたリモートリポジトリに送る操作はどれですか。