Gitは、プロジェクトのバージョン管理システムです。Git上での管理は、突き詰めるとgit add
で行うステージングとgit commit
で行うコミットの繰り返しによって進んでいきます。
今回は、この基本的な機能について、より詳しく掘り下げていきます。ここでは、解説がわかりやすいよう日本語ファイルとしていますので、そのままコードを実行しても同じ挙動にはなりません(日本語がエンコードされます)。
目次
基本操作、addしてcommit
Gitにバージョンを残すためには、追加・変更したファイルをステージングさせる必要があります。まずは、ファイルを追加・変更した際には、git status
で変更状況について確認しましょう。
# ファイルを追加した場合
% git status
Untracked files:
(use "git add ..." to include in what will be committed)
追加したファイル.txt
# ファイルを変更した場合
% git status
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: 変更したファイル.txt
ファイルを追加した場合は、Untracked files(追跡がまだされていないファイル)として表示されます。
ファイル変更の場合は、Changes not staged for commit(ステージングされていない変更)として表示されていて、ファイル名の前にmodified: (変更した)と表示されます。
それではこのファイルをステージングgit add
します。
git add
の基本
git add
の後にスペース+ファイル名を入力することでファイルをステージングすることができます。
# 追加の場合も変更の場合も同じ
% git add 追加したファイル.txt
% git add 変更したファイル.txt
ファイルを追加した場合でも変更した場合でも、git add
の後にファイル名を追加するだけで可能です。ステージングが完了した場合はエラーや完了もメッセージは表示されないので、git status
をもう一度叩いて確認しましょう。
# ファイルを追加した場合
% git status
Changes to be committed:
(use "git restore --staged ..." to unstage)
new file: 追加したファイル.txt
# ファイルを変更した場合
% git status
Changes to be committed:
(use "git restore --staged ..." to unstage)
変更したファイル.txt
Chages to be committed(コミット予定の変更)としてステージングしたファイルが表示されます。
git commit
の基本
ステージングしたファイルをコミットすることでバージョンの履歴に残ります。
% git commit
このコマンドで、viエディタが表示されるので、コミットメッセージを入力します。コミットメッセージなしでコミットすることはできません。
viエディタは、a
キーを入力すると入力モードになり、esc
キーを入力して入力モードから外すことができます。下記のような文字列が表示されますが、#
から始まる文はコメント部分なので無視して問題ありません(ステージング状態のファイルやブランチを確認するための文字列です)。入力モードに変更し、1行目にコミットメッセージを入力してください。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
# modified: test1.text
# new file: text2
#
~
入力が完了したら、esc
キーを押した後、:wq
と入力してEnter
を押すことでコミットが完了します。:wq
はviエディタを保存するための入力です。viエディタの仕様については、この記事では省略します。
もし、git commit
を入力した後に、コミットをしたくなくなった場合は、何も入力せずに:wq
と入力してエディタを終了することでエラーでコミットされなくなります。
ステージングとコミットのショートハンド
コミットの流れは、1行に書いて簡略化することができます。
ステージングする時、複数ファイルや追加・変更した全てのファイルである場合、下記の方法でステージング可能です。
% git add 変更したファイル1.txt 変更したファイル2.txt
# または
% git add .
git add .
の場合は変更したすべてのファイルをステージングしてくれますが、コミットしたくないファイルが存在する場合は注意しましょう。
コミットのコミットメッセージは、-m
のオプションをつけることでエディタを開くことなく作成することができます。
% git commit -m "これはコミットメッセージです。"
この方法では、クォーテーションで括られている状態でEnter
を押すと確認などなしでコミットされてしまうので注意しましょう。
また、行いたいコミットが、ファイルの変更のみ(追加したファイルはコミットしない)の場合は、ステージングもオプションつけることで省略することができます。
# git add . と git commit -m "メッセージ"と等価
% git commit -am "これはコミットメッセージです。"
ファイル追加のステージングには対応していないので、追加したファイルもステージングしたい場合は、git add .
と入力しましょう。
ステージング状態を元に戻す
間違えてステージングしたファイルは、git restore
に--staged
か-S
のオプションをつけることで元に戻すことができます。
# 特定のファイルを戻す
% git restore --staged 取り消すファイル.txt
# 上と同じ挙動
% git restore -S 取り消すファイル.txt
# 複数ファイルを取り消す
% git restore -S 取り消すファイル1.txt 取り消すファイル2.txt
# すべてのファイルをステージングから外す
% git restore -S .
コミットする前の状態に戻す
間違えたファイルをコミットしてしまった場合などの理由で、直前のコミットを取り消すことも可能です。
直前のコミットをステージング状態には、git reset --soft log
を使うことで戻すことができます。
# 直前のコミットをステージングに戻す
% git reset --soft HEAD^
ステージングから戻すなり変更をするためには、上記の通りgit restore
を叩いてください。
--soft
はステージングに戻すためのオプション、HEAD^
は直前のコミットを意味します。
既に追跡済のファイルを除外する
.gitignore
ファイルを作成することで、特定のファイルをgit add
の追跡から除外することができます。
ですが、既にコミットされたファイルは.gitignore
にファイル名を追記しても追跡から除外することはできません。パターン別で、そんな時の追跡を除外する例を紹介します。
下記の内容は、特にリモートリポジトリを利用した開発プロジェクトで有効です。ローカルリポジトリとリモートリポジトリについての記事も併せてご覧ください。
リモートから削除して、ローカルには残すパターン
コミット済みのファイルを.gitignore
に書いた挙動と同じように戻す方法です。
まずは、.gitignore
に追跡除外ファイルを追記します。
追跡除外ファイル.txt
次に、コミットの(キャッシュ)からファイルを除外します。git rm
を使います。
% git rm --cached 追跡除外ファイル.txt
変更をコミットします。
% git commit -m "追跡除外ファイル.txtを追跡除外しました。"
リモートに変更を反映させずに、ローカルの追跡だけ除外するパターン
また、プロジェクトに後から参画した場合、設定ファイルなど一時的に(かつ頻繁に)自分だけファイルを変更するファイルは追跡を除外したいことがあります。
git update-index
を使うことで、ファイルを追跡除外することができます。
追跡除外する場合
git update-index --assume-unchanged 追跡済ファイル.txt
また、このままだとリモートリポジトリで変更があった際にエラーが発生します、該当ファイルでエラーが発生した場合は、追跡除外を解除します。
git update-index --no-assume-unchanged 追跡済ファイル.txt
git update-index
を使った時の挙動は下記のようになります。
% git status
On branch master
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: 追跡済ファイル.txt
no changes added to commit (use "git add" and/or "git commit -a")
% git update-index --assume-unchanged 追跡済ファイル.txt
% git status
On branch master
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean