🍑あわもり教室🫧 クラウドの「手前」を、ちゃんとやる。 はじめる
SET 0430分

Gitの三つの場所

編集中のファイル、次に記録する変更、記録済みの履歴を区別します。

このレッスンのメニュー

設定ファイルを編集して上書きすると、別にコピーを残していない限り、編集前の内容を確認できません。 複数のファイルを変更した場合は、どの変更が同じ目的だったのかもファイルだけでは分かりません。

Gitは、選んだ変更をひとまとまりにして記録し、あとから内容と理由を確認できるようにします。

変更をひとまとまりで記録する

Gitは、ファイルの変更履歴を管理するソフトウェアです。 一回分の記録をコミット(commit)と呼びます。 コミットには、その時点のファイル、直前のコミットとのつながり、作成者、説明文が入ります。

Gitが履歴を保存する場所をリポジトリ(repository)と呼びます。 このページでは、手元のPCにある一つのリポジトリを操作します。

記録する変更を選ぶ

一つのファイルで誤字を直し、別のファイルでは新しい機能を作りかけているとします。 誤字の修正だけを先にコミットするには、記録へ入れる変更を選ぶ場所が必要です。

Gitでは、編集中、次に記録する内容、記録済みの履歴を分けて扱います。

Gitでの名前意味確認するコマンド
作業ツリー(working tree)いま編集しているファイルgit diff
ステージング領域(staging area)次のコミットへ入れる変更git diff --staged
リポジトリ(repository)保存済みのコミットgit log

git addは、その時点のファイル内容をステージング領域へ記録します。 そのあと同じファイルをもう一度編集すると、「次に記録する変更」と「まだ選んでいない変更」が同時に存在します。

working treeからgit addでstaging areaへ、git commitでrepositoryへ内容が移る流れ
各コマンドがどの二地点の差分を扱うかを分けて覚えます。

git statusgit commitを入力すると、シェルはgitというプログラムを起動します。 statuscommitは、Gitへ頼む処理を指定する引数です。 Gitは、現在のディレクトリにある作業中のファイルとリポジトリを読み書きします。

git status
git diff
git add README.md
git diff --staged
git commit -m "Explain how to run the server"

一つのコミットに一つの目的を入れる

「いろいろ修正」より「nginxの待ち受けポートを8080へ変更」の方が、後から意図を判断できます。 一つの目的に必要な差分をまとめ、機械生成物や秘密情報を混ぜません。

二種類の差分を作る

空の練習ディレクトリで試します。

mkdir /tmp/awamori-git
cd /tmp/awamori-git
git init
printf 'first\n' > notes.txt
git add notes.txt
printf 'second\n' >> notes.txt
git status
git diff
git diff --staged

二つの diff に何が表示されるか説明してください。

git diffは作業ツリーとステージング領域を比べ、git diff --stagedはステージング領域と最後のコミットを比べます。

秘密情報をコミットしない

.gitignore は未追跡ファイルを無視する設定です。 すでにコミットした秘密情報を .gitignore へ追加しても、履歴からは消えません。 漏えいしたトークンは履歴編集より先に失効し、新しく発行します。

このレッスンは完了

このページで扱った流れを確認したら、次の内容へ進みます。