- Git の初期設定
- ターミナルでよく使用するコマンド
- Git の仕組み
- Git の使い方
- GitHub の使い方
Git の初期設定
ユーザー情報の登録
ユーザー名
git config --global user.name "githubに登録したユーザー名"
メールアドレス
git config --global user.email githubに登録したメールアドレス
Git で使用するエディタ
git config --global core.editor "code --wait"
code は Visual Studio Code を意味する。それ以外のエディタについてはこちらを参照。
設定の確認
これらの設定が終わったら、正しく設定できているか確認する。次のコマンドを入力して、設定した内容が表示されることを確認する。
git config user.name
git config user.email
git config core.editor
また、次のコマンドにより設定の一覧を表示させることができる。
git config --list
また、ここで設定した内容は、HOMEディレクトリ配下の .gitconfig ファイルに保存される。そのため、ファイルの内容を表示させる cat コマンドを使用して、その内容を表示させることができる。
cat ~/.gitconfig
ターミナルでよく使用するコマンド
Git をコマンドライン端末(ターミナル)で操作する場合は、コマンドライン端末でよく使用される次のコマンドを覚えておくとよい。
- cd
ディレクトリ(フォルダ)の移動。 - ls
ディレクトリの内容を表示する。-a オプションをつけて「ls -a」とすると、隠しファイルも含めた全てを表示する。 - mkdir
ディレクトリを作成。 - rm
ファイルを削除。 - cp
ファイルをコピー。 - mv
ファイルの移動、ファイル名の変更。 - cat
ファイルの内容を表示。
Git の仕組み
Git 内部でどのようにデータを保持しているのか
Git では「コミット」と呼ばれる操作により、新しいバージョンでファイル(群)を保存するが、そのとき差分(ファイルの変更部分)を記録するのではなくて、スナップショット(ファイル全体)を記録している。ただし、変更されていないファイルについては直前のバージョンのデータを保持する。
コミットにより新しいバージョンでファイル(群)のスナップショットを記録するときには、必ずその直前のコミットがどれであるかも記録されるため、過去のコミットを辿ることができ、つまり以前の状態を復元することができるようになっている。
ローカル環境における Git の操作の流れ
ローカル環境(つまり自分の手元のPC)でファイルの変更を行なった場合、Git を用いてローカルリポジトリと呼ばれるローカル環境内でのスナップショットの保管場所にデータを記録する。この一連の作業の詳細は次のようになっている。
- ワークツリーと呼ばれる Git の管理下にあるディレクトリ内でファイルを変更する。(ワークツリーはファイルを変更する作業場を意味する。)
- ワークツリーで変更したファイルのうち、ローカルリポジトリにスナップショットを記録したいものだけをステージに追加する。(git add コマンド)
- ステージに追加したファイルのスナップショットをローカルリポジトリに記録する。これをコミットと呼ぶ。(git commit コマンド)
このように、ローカル環境では、
- ワークツリー
- ステージ
- ローカルリポジトリ
という3つの Git が管理するエリアを用いて一連の作業を実行する。
Git の使い方
Git を用いてプロジェクトの管理を始める方法
Git はプロジェクトのバージョンを管理するためのものだが、実際にプロジェクトの管理を始める場合の状況は、次の2通りに大別されるだろう。
- 自分で作成したプロジェクトを Git で管理する。
- GitHub などに既に存在するプロジェクトを自分のPCに取り込み、Git で管理する。
それぞれの場合における Git での管理の始め方について説明する。
自分で作成したプロジェクトの Git による管理を始める
Git を使用して自分で作成したプロジェクトの管理を始めるための最初の作業は、ローカルリポジトリを作成することだ。ローカルリポジトリの作成手順は以下のようになっている。
- ターミナル(コマンドライン端末)を開く。
- プロジェクトのディレクトリに移動する。(あるいは作成してから移動する)
- git init コマンドを実行する。
要するに、プロジェクトのディレクトリに移動して、
$ git init
と入力してエンターキーを押せばよい。init は initialize(初期化)の略を表す。このコマンドを実行することにより、プロジェクトディレクトリに .git という名前のディレクトリが作成される。これがローカルリポジトリとよばれるものだ。
#現在のディレクトリにプロジェクトディレクトリ(sample-project)を作成
$ mkdir sample-project
#作成したプロジェクトディレクトリに移動
$ cd sample-project
#ディレクトリの中身を表示(何もない)
$ ls -a
./ ../
#ローカルリポジトリを作成
$ git init
Initialized empty Git repository in C:/sample-project/.git/
#ディレクトリの中身を表示(ローカルリポジトリ .git が作成されている)
$ ls -a
./ ../ .git/
これでプロジェクトを Git で管理するための準備が終了した。
GitHub などに既に存在するプロジェクトの管理を始める
次に、GitHub などに既に存在するプロジェクトを自分の PC に取り込み、Git で管理する場合について説明する。この場合の手順は以下のようになっている。
- GitHub などに存在するプロジェクトの Git リポジトリの URL を取得する。
- ターミナルで git clone コマンドを実行し、プロジェクトのリポジトリのコピーをローカル(自分のPC)に作成する。
GitHub などに存在するプロジェクトの Git リポジトリはリモートリポジトリと呼ばれる。git clone コマンドを実行するとローカル(自分のPC)にも同名のプロジェクトディレクトリが作成され、その中に次の2つのものがコピーされる。
- プロジェクトのファイルがローカルのワークツリーにコピーされる。
- リポジトリ( .git ディレクトリ)がローカルにコピーされる。
これにより、先述した git init コマンドを実行しなくてもプロジェクトディレクトリにリポジトリ(.git ディレクトリ)が作成されるので、Git による管理を始めることができる。
変更をステージに追加する(git add)
git で管理したいファイルやディレクトリを新規に作成した、あるいはファイルの内容を変更した、とうような場合には、その時点でのファイル・ディレクトリの状態を1つのプロジェクトのバージョンとして、ローカルリポジトリに記録することができる。
そのためにはまず、その記録が必要なファイル・ディレクトリをステージに追加する必要がある。それを実行するためには git add コマンドを使用する。
ファイルをステージに追加したい場合
$ git add ファイル名
ディレクトリをステージに追加する場合
$ git add ディレクトリ名
ワークツリーで変更があったもの全てをステージに追加する場合
$ git add .
このステージというものがあるおかげで、複数の変更したファイルの中から記録したいファイルだけを取り出すということが可能になる。そしてそれがステージという概念の存在理由そのものになっている。
#sample.html を作成
$ echo '<h1>Git サンプル</h1>' > sample.html
#プロジェクトディレクトリの中身を表示
$ ls -a
./ ../ .git/ sample.html
#ステージに追加する
$ git add .
ステージに上げた変更をリポジトリに記録(git commit)
git add コマンドでステージに乗せた変更ファイル・ディレクトリをローカルリポジトリに記録することをコミットと呼ぶが、これを実行するためのコマンドが git commit コマンドだ。
オプションを指定しない場合
特にオプション(-m や -v など)を指定しないで git commit コマンドを実行すると、エディタが自動で立ち上がり、その変更の意味を記録すること(コミットメッセージ)を求められる。コミットメッセージを書き込み、保存してエディタを閉じると、コマンドの実行が終了し、コミットが完了する。
$ git commit
オプション -m を指定した場合
エディタを立ち上げることなく、1行のコミットメッセージを付与してコミットを実行したい場合には、オプション -m を指定する。
$ git commit -m "コミットメッセージ"
オプション -v を指定した場合
オプション -v を指定した場合も、自動でエディタが立ち上がり、コミットメッセージの書き込みを求められるのはオプション無しの場合と同じだが、-v を指定した場合はエディタ上でファイルの変更内容を確認することができる。
オプション無しの場合は、変更したファイルの名前のみがエディタで確認できるが、-v オプションを指定した場合は、変更した内容も確認することができる。
$ git commit -v
コミットメッセージの正式な書き方は
- 1行目:変更内容を要約した短い文章
- 2行目:空行
- 3行目:変更した理由などの詳細な説明
となっている。(参考ページ)
現在の変更状況を確認する(git status)
変更されたファイルを確認するには git status コマンドを使用する。実際に sample.html を変更したときに git status コマンドがどのような出力をするのかを確認してみよう。
まず、何も変更していない状態で git status コマンドを実行してみる。
$ git status
On branch master
nothing to commit, working tree clean
「コミットするものは何もない」と教えてくれている。それでは、sample.html を次のように変更してみる。
sample.html
<h1>Git サンプル</h1>
<p>git status</p>
2行目を追加した。この状態で git status コマンドを実行する。
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: sample.html
ステージに乗せていない変更があること、そして sample.html が変更されていることを教えてくれている。それでは git add コマンドでこの変更したファイルをステージに乗せよう。
$ git add sample.html
再度 git status コマンドで状態を確認してみる。
$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: sample.html
今度はコミットするべき変更があること、そして sample.html が変更されていることを教えてくれている。それでは git commit コマンドでこのステージに乗せた変更をコミットして、リポジトリに記録しよう。
$ git commit -m "<p>git status</p> を追記"
[master eb372d7] <p>git status</p> を追記
1 file changed, 1 insertion(+)
git status で現在の状態を確認してみる。
$ git status
On branch master
nothing to commit, working tree clean
再び「コミットするものは何もない」という状態になったことを教えてくれている。
以上のことをまとめると、git status コマンドは次の2つの変更があるかどうかを教えてくれるコマンドだ。
- 現在のワークツリーのファイルの内容が前回ステージに乗せた時のファイルの内容から変更されているかどうか。
- 現在のステージに乗っているファイルの内容が前回のコミット時のファイルの内容から変更されているかどうか。
変更の差分を確認する(git diff)
変更の差分を表示させるためには git diff コマンドを使用する。
ワークツリーとステージの差分
$ git diff
ステージと前回のコミットの差分
$ git diff --staged
特定のファイルの差分
$ git diff ファイル名
実際にファイルを変更して、git diff コマンドの動作を確認してみよう。
まず、何も変更していない状態で git diff コマンドを実行してみる。
$ git diff
何も表示されない。それでは、sample.html を次のように変更してみる。
sample.html
<h1>Git サンプル</h1>
<p>git status</p>
<p>git diff</p>
2行目を追加した。この状態で git diff コマンドを実行する。
$ git diff
diff --git a/sample.html b/sample.html
index fad4e5b..a941694 100644
--- a/sample.html
+++ b/sample.html
@@ -1,2 +1,3 @@
<h1>Git サンプル</h1>
-<p>git status</p>
\ No newline at end of file
+<p>git status</p>
+<p>git diff</p>
変更の差分が表示されている。2行目の <p>git status</p> については改行が追加されたため、差分として表示されている。
それでは git add コマンドでこの変更したファイルをステージに乗せよう。
$ git add sample.html
この状態で git diff コマンドを実行する。
$ git diff
何も表示されない。これは git diff コマンドが、ワークツリーとステージの差分を表示するコマンドであるためだ。ステージと前回のコミットの差分を表示させるためには –staged オプションを指定する必要がある。
$ git diff --staged
diff --git a/sample.html b/sample.html
index fad4e5b..a941694 100644
--- a/sample.html
+++ b/sample.html
@@ -1,2 +1,3 @@
<h1>Git サンプル</h1>
-<p>git status</p>
\ No newline at end of file
+<p>git status</p>
+<p>git diff</p>
変更の差分が表示された。それでは git commit コマンドでこのステージに乗せた変更をコミットして、リポジトリに記録しよう。
$ git commit -m "<p>git diff</p> を追記"
[master 50b4c4d] <p>git diff</p> を追記
1 file changed, 2 insertions(+), 1 deletion(-)
この状態で git diff コマンドを –staged オプションを付けて実行してみる。
$ git diff --staged
何も表示されなくなった。
コミット履歴を表示する(git log)
過去のコミット履歴を表示させるためには git log コマンドを使用する。(参考ページ)
何もオプションを指定しない場合
$ git log
一行で表示させる
$ git log --oneline
変更差分も表示させる
$ git log -p
直近の3件のコミットを表示させる
$ git log -3
ファイルやディレクトリを削除する(git rm)
git の管理対象のファイルやディレクトリを削除するには git rm コマンドを使用する。rm は remove の略。
git rm コマンドを使用して削除を行うと、リポジトリ、ワークツリーから対象ファイル・ディレクトリが削除される。ワークツリーからは削除したくないときは、–cached を付ける。
ファイルを削除する
$ git rm ファイル名
ディレクトリを削除する
$ git rm -r ディレクトリ名
リポジトリからは削除し、ワークツリーには残したい
$ git rm --cached ファイル名
例えば、パスワードのファイルを誤ってリポジトリに記録してしまった場合、git rm –cached でリポジトリから削除し、.gitignore ファイルに記載する。
ファイルを移動する、ファイル名を変更する(git mv)
git を使ってファイルを移動(ファイル名を変更)するには、git mv コマンドを使用する。
このコマンドを実行すると、ファイルが移動され(ファイル名が変更され)、その変更がステージに反映される。
$ git mv 旧ファイル 新ファイル
このコマンドは以下の一連のコマンドと同じになる。
$ mv 旧ファイル 新ファイル
$ git rm 旧ファイル
$ git add 新ファイル
他のブランチで作業するため、現在の作業を退避する
作業を一時的に避難する(git stash)
別のブランチで作業しなくてはいけなくなった、でも現在の作業は途中であり、commit したくない。
そのような時は、git stash コマンドを使用して、現在の作業を一時的に避難することができる。stash は隠し場所という意味。
$ git stash
# あるいは save を付けても同じ(save は省略できるため)
$ git stash save
git stash を実行することで、ワークツリーとステージの変更を(退避したため)無かったことにすることができる。
また、作業を退避するときにコメントを付与したい場合には次のようにする。
$ git stash save "コメント"
避難した作業を確認する(git stash list)
git stash コマンドで避難した作業をリストで表示させるためには git stash list コマンドを使用する。
$ git stash list
避難した作業を復元する(git stash apply)
git stash コマンドで避難させた作業を復元するためには git stash apply コマンドを使用する。
最新の作業を復元する(ステージの状況は復元されない)
$ git stash apply
最新の作業を復元する(ステージの状況も復元する)
$ git stash apply --index
特定の作業を復元する
$ git stash apply スタッシュ名
# 例えば次のようにスタッシュ名を指定する。
$ git stash apply stash@{0}
避難した作業を削除する(git stash drop)
git stash コマンドで避難した作業を削除するには git stash drop コマンドを使用する。
最新の作業を削除する
$ git stash droop
特定の作業を削除する
$ git stash drop スタッシュ名
# 例えば次のようにスタッシュ名を指定する。
$ git stash drop stash@{0}
全ての作業を削除する
$ git stash clear
コマンドにエイリアス(別名)を付ける
コマンドにエイリアス(別名)を与えることで、コマンドの入力を短縮し、コマンド入力を楽にすることができる。
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.co checkout
このように設定することで、git status と入力していたものを git st で済ますことができるようになる。
Git でバージョン管理しないファイル・ディレクトリを指定する(.gitignore)
Git で管理したくないファイルというものも存在する。大きく分けると次の2種類がある。
- パスワードなどの機密情報が記録されたファイル
- チーム開発では必要無いファイル。例えば、
- OS が自動で生成するファイル
- キャッシュファイル
実際に Git で管理したくないファイルを Git の管理から外すには、.gitignore ファイルを作成し、これに Git の管理から外すファイル・ディレクトリを指定すれば良い。
.gitignore
# コメント行は # で始める。
# カレントディレクトリ(この .gitignore があるディレクトリ)の index.html を除外する。
index.html
# プロジェクトのルートディレクトリの index.html を除外する。
/index.html
# カレントディレクトリの mydir ディレクトリ以下を除外する。(ディレクトリは最後にスラッシュ / を付ける)
mydir/
# ワイルドカードを使用することもできる。
/*/*.css
GitHub の使い方
リモートリポジトリ(GitHub)を新規追加する
origin というショートカット名で、URL で指定したリモートリポジトリを登録するには次のようなコマンドを実行する。
$ git remote add origin https://github.com/ユーザ名/リモートリポジトリ名
つまり「origin」という名前で、指定した URL のリモートリポジトリを扱うように登録している。
リモートリポジトリ(GitHub)へ送信する
ローカルリポジトリの内容をリモートリポジトリに送信するには push コマンドを使用する。
$ git push <リモートリポジトリ名> <ブランチ名>
$ git push origin master
また、-u を付けて push すると次回以降は origin に master ブランチを push する際に、origin master の指定が不要になる。
$ git push -u origin master
ファイル内容をコピーする(Rawボタン)
各ファイルを開いたページにある「Raw」ボタンをクリックすると、コードをプレーンテキストとして表示することができる。これをコピーして、エディタに貼り付ければよい。
ファイルの各行を誰が記述したのかを知る(Blameボタン)
各ファイルを開いたページにある「Blame」ボタンをクリックすると、コードの各行を誰がいつどのコミットで変更したのかを確認することができる。
ファイルのコミットの履歴を確認する(Historyボタン)
各ファイルを開いたページにある「History」ボタンをクリックすると、そのファイルのコミットの履歴を確認することができる。