Gitの三つの場所
編集中のファイル、次に記録する変更、記録済みの履歴を区別します。
このレッスンのメニュー
設定ファイルを編集して上書きすると、別にコピーを残していない限り、編集前の内容を確認できません。 複数のファイルを変更した場合は、どの変更が同じ目的だったのかもファイルだけでは分かりません。
Gitは、選んだ変更をひとまとまりにして記録し、あとから内容と理由を確認できるようにします。
変更をひとまとまりで記録する
Gitは、ファイルの変更履歴を管理するソフトウェアです。 一回分の記録をコミット(commit)と呼びます。 コミットには、その時点のファイル、直前のコミットとのつながり、作成者、説明文が入ります。
Gitが履歴を保存する場所をリポジトリ(repository)と呼びます。 このページでは、手元のPCにある一つのリポジトリを操作します。
記録する変更を選ぶ
一つのファイルで誤字を直し、別のファイルでは新しい機能を作りかけているとします。 誤字の修正だけを先にコミットするには、記録へ入れる変更を選ぶ場所が必要です。
Gitでは、編集中、次に記録する内容、記録済みの履歴を分けて扱います。
| Gitでの名前 | 意味 | 確認するコマンド |
|---|---|---|
| 作業ツリー(working tree) | いま編集しているファイル | git diff |
| ステージング領域(staging area) | 次のコミットへ入れる変更 | git diff --staged |
| リポジトリ(repository) | 保存済みのコミット | git log |
git addは、その時点のファイル内容をステージング領域へ記録します。
そのあと同じファイルをもう一度編集すると、「次に記録する変更」と「まだ選んでいない変更」が同時に存在します。
git statusやgit commitを入力すると、シェルはgitというプログラムを起動します。
statusやcommitは、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 へ追加しても、履歴からは消えません。
漏えいしたトークンは履歴編集より先に失効し、新しく発行します。
このレッスンは完了
このページで扱った流れを確認したら、次の内容へ進みます。