概要
Gitの状態管理の考え方と、よく使う基本コマンドを整理する。
Gitでは、ワーキングツリー、インデックス、ローカルリポジトリ、リモートリポジトリのどこに変更があるかを理解することが重要になる。コマンドを丸暗記するより、変更がどこからどこへ移動するかを追うと操作ミスを減らせる。
この記事で扱うこと
- ワーキングツリー、インデックス、ローカルリポジトリ、リモートリポジトリの違い。
- status、add、commit、diffの基本的な流れ。
- resetで何が戻るかの考え方。
- pushとpullでリモートと同期する流れ。
- checkoutでブランチや特定コミットへ移動する操作。
作業前に確認すること
| 項目 | 確認内容 |
|---|---|
| 作業場所 | Git管理下のディレクトリでコマンドを実行する。 |
| 状態確認 | 変更前後でgit statusを確認する習慣を付ける。 |
| ステージング | commit対象に含める変更だけをgit addする。 |
| 履歴操作 | resetは影響範囲を理解してから使う。 |
| リモート操作 | push/pull前に作業ブランチを確認する。 |
作業時の注意点
| 作業時の注意点 | 整理するポイント |
|---|---|
| addとcommit | addはコミット候補へ載せる操作、commitは履歴として保存する操作。 |
| diffの対象 | ワーキングツリー、インデックス、HEADのどこと比較するかで結果が変わる。 |
| reset --hard | 作業中の変更も消えるため、慎重に使う。 |
| pushとpull | pushは送る、pullは取り込む操作として方向を意識する。 |
項目説明
状態管理の概念
-
ワーキングツリー(working tree)
現在チェックアウトしているローカルディレクトリを指す。
実際に修正、追加、削除を行う作業場所のこと。 -
インデックス / ステージ(index / staging area)
commit前にワーキングツリー(working tree)の変更を一時的に保存する場所。
変更がindexとして表示される。
commit準備ができた変更をステージ(staging area)に移動してcommit対象を管理する。 -
ローカルリポジトリ(local repository)
ローカルマシン上にある個別リポジトリ。
commitされたすべての履歴やバージョンが保存される場所。
branch単位のpushによってcommitをリモートリポジトリ(remote repository)に反映する。 -
リモートリポジトリ(remote repository)
ネットワーク上にある共有リポジトリ。
通常は、GitHubやGitLabなどのホスティングサービス上に存在する。
[git status] : ステータス確認
-
確認用に
touchでファイルを新規作成$ touch example-src.txt -
git statusでステータス確認
Untracked filesに表示されるファイル達は、Git管理下にないファイルが表示される。
上記で新規作成したexample-src.txtがバージョン管理下にないためgit addを促す警告が表示されている。
$ git status On branch master No commits yet Untracked files: (use "git add ..." to include in what will be committed) example-src.txt nothing added to commit but untracked files present (use "git add" to track) -
git statusのその他使用例$ git status [FILE] # ファイルパス指定 $ git status [DIR] # ディレクトリ指定
[git add] : インデックスへ反映
-
前項の警告に従い
git addを実行
git addにより、変更がワーキングツリーからインデックスへ反映される。
$ git add example-src.txt -
ステータス確認
$ git status On branch master No commits yet Changes to be committed: (use "git rm --cached ..." to unstage) new file: example-src.txt -
git addのその他使用例$ git add [FILE] # ファイルを指定して追加する $ git add [FILE1] [FILE2] [FILE3] # 複数ファイルを指定して追加する $ git add [DIR] # ディレクトリを指定して追加する $ git add [DIR1] [DIR2] [DIR3] # 複数ディレクトリを指定して追加する $ git add . # カレントディレクトリ以下の変更を追加する $ git add -A # Git管理下の変更をすべて追加する(--all と同じ) $ git add --all # Git管理下の変更をすべて追加する(-A と同じ) $ git add -u # 追跡済みファイルの変更と削除を追加する(--update と同じ) $ git add --update # 追跡済みファイルの変更と削除を追加する(-u と同じ) $ git add -f [FILE] # .gitignore対象のファイルを強制的に追加する(--force と同じ) $ git add --force [FILE] # .gitignore対象のファイルを強制的に追加する(-f と同じ) $ git add -p # 差分を対話形式で確認しながら追加する(--patch と同じ) $ git add --patch # 差分を対話形式で確認しながら追加する(-p と同じ) $ git add -n # 実際には追加せず、追加対象を確認する(--dry-run と同じ) $ git add --dry-run # 実際には追加せず、追加対象を確認する(-n と同じ)
[git commit] : ローカルリポジトリへ反映
-
上記の変更をメッセージ付きでコミット
git commitにより、変更がインデックスからローカルリポジトリへ反映される。
$ git commit -m 'Add example-src.txt' [master (root-commit) 304a1cd] Add example-src.txt Committer: root Your name and email address were configured automatically based on your username and hostname. Please check that they are accurate. You can suppress this message by setting them explicitly. Run the following command and follow the instructions in your editor to edit your configuration file: git config --global --edit After doing this, you may fix the identity used for this commit with: git commit --amend --reset-author 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 example-src.txt -
git commitのその他使用例$ git commit -m "コミットメッセージ" # コミットメッセージを指定 $ git commit --amend # 直前のコミットを上書き $ git commit [FILE] # ファイルパス指定
[git diff] : 差分確認
-
コミット後の編集
ファイルを編集後、再度ステータス確認を行うと下記の通り、コミット後に編集があったことを示すmodified: example-src.txtが表示されるようになる。$ echo "test input" > example-src.txt $ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: example-src.txt no changes added to commit (use "git add" and/or "git commit -a") -
git diffで差分確認
差分結果としてtest inputが追記されていることが分かる。$ git diff diff --git a/example-src.txt b/example-src.txt index e69de29..c2cbb36 100644 --- a/example-src.txt +++ b/example-src.txt @@ -0,0 +1 @@ +test input -
git diffのその他使用例$ git diff HEAD # 最新コミットとの差分確認 $ git diff --cached # HEADとインデックスの差分確認 $ git diff --name-only # 差分が発生しているファイル名の一覧を表示する $ git diff HEAD^ HEAD # 直前のコミット内容を確認 $ git show HEAD # HEADのコミット内容を確認
[git reset] : コミットの取り消し
-
最新コミット(HEAD)だけを取り消し、ワーキングツリーはそのまま
git reset --soft HEAD~1 -
最新コミット(HEAD)だけを取り消し、変更をステージから外す
git reset --mixed HEAD~1 -
最新のコミット(HEAD)だけを取り消し、HEADの位置、インデックス / ステージ、ワーキングツリーも全て取り消す
git reset --hard HEAD~1
[git push] : リモートリポジトリへ反映
-
新規ブランチをリモートリポジトリに反映し、追跡を設定
ローカルのfeature/new-featureをリモートリポジトリのoriginに作成し、-u(--set-upstream)オプションの指定によって、ローカルリポジトリとリモートリポジトリが紐付けられるため、次回以降はgit pushのみでpush可能となる。
git push -u origin feature/new-feature -
特定のリモートブランチを指定してリモートリポジトリへ反映
ローカルのdevelopブランチをリモートリポジトリのoriginに反映する。git push origin develop -
リモートリポジトリから特定のブランチを削除
不要になったリモートブランチをoriginから削除する。git push origin --delete branch_name
[git pull] : リモートリポジトリの変更を取込む
- リモートリポジトリの変更をローカルリポジトリに取り込む(リモートとブランチを明示的に指定)
git pullは、git fetchとgit mergeの操作をまとめて行っている。
git pull origin main
[git checkout] : チェックアウト
-
ブランチの切り替え
developブランチに切り替える。git checkout develop -
新規ブランチ作成と切り替え
新規ブランチを作成し、同時にそのブランチに切り替える。git checkout -b feature/develop-1 -
特定のコミットをチェックアウト
コミットハッシュを指定し、ワーキングツリーを特定のコミットに変更する。
git checkout a1b2c3d
実務とのつながり
- 状態管理
レビュー前に変更範囲を確認する基本になる。 - 差分確認
意図しない変更をコミットに混ぜないために重要になる。 - ブランチ操作
複数の修正を並行して進めるときの土台になる。
まとめ
- Gitの基本は、変更がワーキングツリー、インデックス、リポジトリのどこにあるかを理解すること。
- status、diffで確認し、add、commitで履歴に残す流れを押さえる。
- resetやpush/pullは影響範囲が大きいため、操作前にブランチと状態を確認する。