全体的なアーキテクチャを理解しよう。
まずローカルPCとクラウドに分類される。ローカルPCのドキュメントをクラウドに配置する(push)、あるいはクラウドから取ってくる(pull)。
ローカルPC内では、データがワークツリー、ステージ、リポジトリのいずれか、あるいはすべてに保管される。
ワークツリーで編集した内容をgit addでステージに配置する。さらにgit commitでステージからリポジトリに配置する。
ひとまずcommitしてみる
ステージにtest.txtを入れる。
git add test.txt
git add .
とすることで、フォルダ(ワークツリー)にあるすべてのファイルをaddすることもできる。
ステージに入れたので、さらにcommitしてリポジトリに移したい。だが、次のようにエラーとなる。
> git commit -m "1st commit"
Author identity unknown
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
Eメールとユーザー名を事前に登録しておかなければならない。
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
再度Commitすると今度はうまくいった。
> git commit -m "1st commit"
[master (root-commit) 54ed5fb] 1st commit
1 file changed, 1 insertion(+)
create mode 100644 test.txt
branchを作成してみる
ここでbranchを確認してみる。masterブランチのみ存在するのが確認できる。
初Commit前に、git branchコマンドでbranchを確認しても何も表示されないことに注意。Commitして初めてbranchが確認できるようになる。
> git branch
* master
試しにdevブランチを作成してみる。アスタリスクが現在のブランチを指している。devブランチを作成しただけでは、devブランチに移らないので注意。
> git branch dev
> git branch
dev
* master
branchをスイッチするには、git checkout
コマンドを使う。devブランチに移っていることがわかる。
> git checkout dev
Switched to branch 'dev'
> git branch
* dev
master
statusを確認してみる
現在、test.txtにはnumber1
という文字列が入っている。
> cat .\test.txt
number1
test.txtにはnumber2
という文字列を追加する。
> cat .\test.txt
number1
number2
git statusコマンドにより、リポジトリとステージ間で差異があるファイルをリストアップできる。modified: test.txt
と表示されているが、これは「ファイルが変更されているけれど、まだステージに追加されていませんよ」という意味。
> 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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
次に、db.txt
をaddしてみる。
> git add db.txt
再度、git statusコマンドを実行すると、new file: db.txt
というのが追加で表示されていることがわかる。これは「新しくファイルがステージに追加されたけど、まだコミットされてませんよ」という意味。
> git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: db.txt
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: test.txt
これでコミットしてstatusを確認すると、test.txt
はステージに追加してなかったので、modified: test.txt
という表示が消えてない。
> git commit -m "New file: db.text"
[master 1428b7d] New file: db.text
1 file changed, 1 insertion(+)
create mode 100644 db.txt
> 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: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
git addでtest.txt
をステージに追加してからコミットすると、nothing to commit, working tree clean
となり、すべてコミットされていることが確認できる。
> git add test.txt
> git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
> git commit -m "Add line in test.txt"
[master 338041d] Add line in test.txt
1 file changed, 2 insertions(+), 1 deletion(-)
> git status
On branch master
nothing to commit, working tree clean
diffを確認してみる
git diffではステージとワークツリー間の差分を確認する。一方、git diff --stagedではステージとリポジトリ間の差分を確認する。
今test2.txt
というファイルがあり、中身には「1」が入っている。ワークツリーとステージ間、ステージとリポジトリ間で差分がない状態になっている。
> cat test2.txt
1 > git diff
> git diff --staged
>
test2.txt
に「2」を追加し、差分を確認する。git diff によりワークツリーとステージ間には差分があり、一方git diff --stagedによりステージとリポジトリ間で差分がない、ということがわかる。
> vim test2.txt
> cat test2.txt
1
2
> git diff
diff --git a/test2.txt b/test2.txt
index d474e1b..c47213d 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1,2 +1,3 @@
1
+2
> git diff --staged
>
git addでtest2.txt をステージに追加する。すると、ワークツリーとステージ間では差分がなくなり、ステージとリポジトリ間で差分がある状態になる。git diffとgit diff --stagedにより、それが確認できる。
> git add test2.txt
> git diff
> git diff --staged
diff --git a/test2.txt b/test2.txt
index d474e1b..c47213d 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1,2 +1,3 @@
1
+2
resoreしてみる
git restore --stagedではリポジトリを元にステージを復元する。git restoreではステージを元にワークツリーを復元する。
実際にやってみる。
まず、ワークツリーとステージとリポジトリ間で差分がない状態になっている。
> cat test2.txt
1
> git diff
> git diff --staged
>
test2.txt に「2」を追加する。ワークツリーとステージ間で差分が発生する。
> vim test2.txt
> cat test2.txt
1
2
> git diff
diff --git a/test2.txt b/test2.txt
index d474e1b..c47213d 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1,2 +1,3 @@
1
+2
> git diff --staged
>
git restoreにより、ステージを元にワークツリーを復元する。中身が「1」に戻っている。
> git restore test2.txt
> cat test2.txt
1
再度test2.txt に「2」を追加し、さらにステージに追加する。ステージとリポジトリ間で差分が発生する。
> vim test2.txt
> cat test2.txt
1
2
> git add test2.txt
> git diff
> git diff --staged
diff --git a/test2.txt b/test2.txt
index d474e1b..c47213d 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1,2 +1,3 @@
1
+2
git restore --stagedにより、リポジトリを元にステージを復元したため、ステージとリポジトリ間で差分が解消する。リポジトリを元にステージが復元されたことにより、ワークツリーとステージ間で差分が発生している。
> git restore --staged test2.txt
> git diff --staged
> git diff
diff --git a/test2.txt b/test2.txt
index d474e1b..c47213d 100644
--- a/test2.txt
+++ b/test2.txt
@@ -1,2 +1,3 @@
1
+2