Gitコマンド 最速 実践練習フロー【2018.11】

# 背景

- 分かりづらく長くなりがちなGitの解説が多かったので、最小限の言葉で  
とにかく直ぐにGitを実践し体得できるように作成
- 最速で、Gitのコア/要点/イメージが直ぐに掴めるようなコマンドで構成
- 分かりやすく噛み砕いた用語で記載
- ネット上のGit解説は誤った情報もあり、正確な内容をよく知るため かなり精査


# 環境

*Remort Repository* :　Github 
*MyPC OS* :　mac os High Sierra 
*git version* :　2.17.1　( Apple Git-112, gitインストール済み )

# 重要用語 

 1. Working ( ワーキング, Working Area, ワーキングエリア, 通常作業フォルダ )
 → Staging に登録( add )されるファイルフォルダ

 2. Staging ( ステージング, Staging Area, ステージングエリア, Index Area, インデックスエリア, Index, インデックス )
 → Local Repository に登録( commit )されるファイルフォルダ

 3. Local Repository ( ローカルリポジトリ, Commit Area, コミットエリア )
 →  Remort Repository に登録( push )されるファイルフォルダ

 4. Remort Repository ( リモートリポジトリ )
 →  GitHub, GitLab などのクラウド上に保管/共有されるファイルフォルダ 

 5. Commit ( コミット )
 →  Repositoryに保存されるセーブポイント。ゲームと同じイメージで 戻りたい時に戻れるデータ。

 6. Branch ( ブランチ )
 →  バージョン / パターン

 7. HEAD ( ヘッド )
 →  現在作業中のブランチ


# その他ポイント

- 特に大事なコマンドは **<font color="Tomato">赤字</font>**

- 事前にGitの理解を深めたい場合は下記 閲覧推奨 
[Git/GitHubレベル別オススメ学習サイトまとめ完全保存版【2019.06】@thinkalot / Qiita](https://qiita.com/thinkalot/items/b3c2e9060f46f5d4ea46) 

- ユーザーネームと、Emailアドレスの初回登録は、任意前提です。ただし途中登録を求めれる場合がありますが、それについては練習１-19に追記しました。


# 練習 1 - 初回 

<!-- ↓ ここをクリックで開閉
<details> -->
<summary>Gitインストール 〜 GitHub 〜 Remote Repository への Commit まで、確認しながら丁寧に。</summary><div>


## 1. Gitインストール

- Windowsの方 : [【初心者向け】Gitのインストール方法をわかり易く解説（画面付き）](https://eng-entrance.com/git-install)
- Macの方 : [【Gitの使い方】GitをMacにインストールする方法！ | オリジナルゲーム.com](https://original-game.com/how-to-use-git2/) 

`$ git --version` でバージョンが表示されたらOK。<br>-v や ver だけでは表示されない。
<img width="812" alt="Screen Shot 2019-10-27 at 9.07.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122142/6a120c9b-fefb-b55e-1900-cc2061f2daa7.png">


## 2. GitHub にて Remote Repository 作成 

[GitHubアカウント作成とリポジトリの作成手順 @kooohei - Qiita](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)
上記 記事を参考に 

- Github ( https://github.com/ ) ログイン 
- Github リポジトリ作成


## 3. ローカル環境 ( My PC )  

###1　ターミナル起動
<img width="200" alt="Screen Shot 2018-11-11 at 18.16.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/122142/a5f2edea-6587-bc9d-1df9-ae6f64160576.png">


###2　pwd　 
[ 現在いるフォルダ階層位置 確認 ( user はユーザーネームフォルダ ) ]

``` 
$ pwd
/Users/user
```

###3　ls　
[ フォルダ内ファイル確認 ]

```
$ ls
Applications		Downloads		Movies			cache.ga
Creative Cloud Files	Google Drive		Music			evalonly.txt
Desktop			Library			Pictures
Documents		Local Sites		Public
```

###4　mkdir　
[ 新規フォルダ作成 ( フォルダ名/作成場所 共に適当でOK ) ] 

```
$ mkdir gittest01
```

###5　ls　
[ フォルダ内再確認 ( gittest01フォルダ作成を確認 ) ]

```
$ ls
Applications		Downloads		Movies			cache.ga
Creative Cloud Files	Google Drive		Music			evalonly.txt
Desktop			Library			Pictures		gittest01
Documents		Local Sites		Public
```

###6　cd　
[ 作成フォルダへ移動 ]

```
$ cd gittest01/
```

###7　<font color="Tomato">git init</font>　
[ <font color="Tomato">Git Local Repository 作成 実行</font> ]

```
$ git init
Initialized empty Git repository in /Users/user/gittest01/.git/
```

###8　ls -a　
[ フォルダ内ファイル確認 ( .git 隠しフォルダが作成されたことを確認 ) ]

```
$ ls -a 
.	..	.git
```

###9　ls .git/ -a　
[ .gitフォルダ内ファイル確認 ( 7種類のファイル/フォルダが自動生成されたことを確認。この時点 index ファイルは未だ無い ) ]

```
$ ls .git/ -a
ls: -a: No such file or directory
.git/:
HEAD		description		objects
config		hooks		info		refs
```

###10　練習用に適当なテキストファイルを作成保存 / ls で確認

```
$ touch gittest01_text.txt 

$ ls
gittest01_text.txt
```

###11　<font color="Tomato">git add --dry-run .</font>　
[ Working ファイル確認 ( これから Staging に登録されるファイル ) ]

```
$ git add --dry-run . 
add 'gittest01_text.txt'
```

###12　<font color="Tomato">git ls-files</font>　
[ Staging ファイル確認 ( 勿論まだ何も登録されていない状態 ) ]

```
$ git ls-files
 
```

###13　git status　
[ Working と Staging ファイルの Commit 状態確認 ( Working に gittest01_text.txtファイルが Untracked ) ]

```Markdown
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	gittest01_text.txt

nothing added to commit but untracked files present (use "git add" to track)
```


###14　<font color="Tomato">git add .</font>　
[ <font color="Tomato">Working ファイル全てを Staging へ ファイル登録( add ) 実行</font> ]

```
$ git add .
```

###15　<font color="Tomato">git ls-files</font>　
[ Staging ファイル確認 ( gittest01_text.txt が登録された ) ]

```
$ git ls-files
gittest01_text.txt 
```

###16　ls .git/ -a　
[ .gitフォルダ内確認 ( Staging 用の index ファイルが自動生成されたことを確認 ) ]

```
$ ls .git/ -a
ls: -a: No such file or directory
.git/:
HEAD		description		index	objects
config		hooks		info		refs
```

###17　git status　
[ Working と Staging ファイルの Commit 状態確認 ( Staging に登録され、Local Repository に Commit できる状態 ) ]

```Markdown
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

	new file:   gittest01_text.txt
```

###18　<font color="Tomato">git diff --staged</font>　
[ <font color="Tomato">Staging と Local Repository の差分 確認</font> ( Staging にファイルが登録され、今度は Local Repository との差分がある状態 ) ]

```diff
$ git diff --staged
diff --git a/gittest01_text.txt b/gittest01_text.txt
new file mode 100644
index 0000000..27706f8
--- /dev/null
+++ b/gittest01_text.txt
@@ -0,0 +1 @@
+
``` 

###19　<font color="Tomato">git commit -m "初めてのコミット"</font>　
[ <font color="Tomato">コメントを付けて Staging のファイルを Local Repository へ ファイル登録( commit ) 実行</font> ]

```diff 
$ git commit -m "初めてのコミット"
[master (root-commit) 0938823] 初めてのコミット
 Committer: User <User@user-no-MacBook-Pro.local>
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, 1 insertion(+)
 create mode 100644 gittest01_text.txt
```

#### 下記 メッセージが表示され、メルアドとユーザーネーム登録を求められたら登録実行

<font color="Tomato">Please tell me who you are.</font>

```
$ git commit -m "初めてのコミット"

*** 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.

fatal: unable to auto-detect email address (got 'user@usernombp.(none)')
```

#####19-1.　git config --global user.email メールアドレス

#####19-2.　git config --global user.name

#####19-3.　git config --global --list

```
$ git config --global --list
fatal: unable to read config file '/Users/user/.gitconfig': No such file or directory

$ git config --global --add user.email *****+user@users.noreply.github.com

$ git config --global user.name "user"

$ git config --global --list
user.email=*****+user@users.noreply.github.com
user.name=user

$ vim ~/.gitconfig
[user]
        email = *****+user@users.noreply.github.com
        name = user
```


###20　git status 　
[ Working と Staging ファイルの Commit 状態確認 ( Local Repository が最新であるため、何も問題が無い状態 ) ]

```
$ git status
On branch master
nothing to commit, working tree clean
```

###21　<font color="Tomato">git diff --staged</font> 　
[ <font color="Tomato">Staging と Local Repository の差分確認 （ 差分が無くなった ）</font> ]

```
$ git diff --staged

```

###22　<font color="Tomato">git show</font> 　
[ <font color="Tomato">最新 Commit 内容表示</font> ]

```diff
$ git show
commit 0938823094d05ddb762b39d8dae1563d8a2c2376 (HEAD -> master)
Author: user <user@user-no-MacBook-Pro.local>
Date:   Mon Nov 12 00:33:38 2018 +0800

    初めてのコミット

diff --git a/gittest01_text.txt b/gittest01_text.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/gittest01_text.txt
@@ -0,0 +1 @@
+
```

###23　git log -1 　
[ Commit 履歴 最新1個表示 ]

```diff
$ git log -1
commit 0938823094d05ddb762b39d8dae1563d8a2c2376 (HEAD -> master)
Author: user <user@user-no-MacBook-Pro.local>
Date:   Mon Nov 12 00:33:38 2018 +0800

    初めてのコミット
```

###24　git branch 　
[ Local Branch 確認 ( master Branch が生成された ) ]

```
$ git branch
* master
```

###25　git reflog 　
[ Branch切り替え確認 ( HEAD が master Branch となった ) ]

```
$ git reflog
0938823 (HEAD -> master) HEAD@{0}: commit (initial): 初めてのコミット
```

###26　git remote 　
[ Remote Repository 登録確認 (未登録状態) ]

```
$ git remote 

```

###27　<font color="Tomato">git remote add origin https://github.com/user/gittest01.git</font> 　
[ <font color="Tomato">Remote Repository 登録</font> ]

```
$ git remote add origin https://github.com/user/gittest01.git

```

###28　<font color="Tomato">git remote</font> 
[ Remote Repository Name 確認 ]

```
$ git remote 
origin
```

###29　<font color="Tomato">git branch</font>
[ branch Name 確認  ]

```
$ git branch
* master
```

###32　<font color="Tomato">git push origin master</font>　
[ <font color="Tomato">Remote Repository に Local Repository を反映</font> ]

```diff
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 256 bytes | 256.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'master' on GitHub by visiting:
remote:      https://github.com/user/gittest01/pull/new/master
remote: 
To https://github.com/user/gittest01.git
 * [new branch]      master -> master
```

## 4. Github 確認 

GitHub上でファイルの登録確認



練習１ - 初回　:　Fin

</div></details> 



# 練習 2:　スピードアップ

<!-- ↓ ここをクリックで開閉
<details> -->
<summary>新規ファイル作成 〜 Remote Repository への Commit まで。コマンドを絞り、初回の倍以上のスピードで。</summary><div>

###1　練習用に適当なテキストファイルを作成保存 / ls で確認

```
$ touch gittest02_text.txt 

$ ls
gittest01_text.txt	gittest02_text.txt
```

###2　<font color="Tomato">git add --dry-run .</font>　
[ Working ファイル確認 ( これから Staging に登録されるファイル ) ]

```
$ git add --dry-run . 
add 'gittest02_text.txt'
```

###3　<font color="Tomato">git ls-files</font>　
[ Staging ファイル確認 ( まだ gittest01_text.txt のみ ) ]

```
$ git ls-files
gittest01_text.txt
```

###4　git status　
[ Working と Staging ファイルの Commit 状態確認 ( Working に gittest02_text.txtファイルが Untracked ) ]

```Markdown
$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	gittest02_text.txt

nothing added to commit but untracked files present (use "git add" to track)
```


###5　<font color="Tomato">git add .</font>　
[ <font color="Tomato">Working ファイル全てを Staging へ ファイル登録( add ) 実行</font> ]

```
$ git add .
```

###6　<font color="Tomato">git ls-files</font>　
[ Staging ファイル確認 ( gittest02_text.txt が登録された ) ]

```
$ git ls-files
gittest01_text.txt
gittest02_text.txt
```

###7　git status　
[ Working と Staging ファイルの Commit 状態確認 ( Staging に登録され、Local Repository に Commit できる状態 ) ]

```Markdown
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   gittest02_text.txt
```

###8　<font color="Tomato">git diff --staged</font>　
[ <font color="Tomato">Staging と Local Repository の差分 確認</font> ( Staging にファイルが登録され、今度は Local Repository との差分がある状態 ) ]

```diff
$ git diff --staged
diff --git a/gittest02_text.txt b/gittest02_text.txt
new file mode 100644
index 0000000..e69de29
``` 

###9　<font color="Tomato">git commit -m "gittest02_text.txtをコミット"</font>　
[ コメントを付けて Staging のファイルを Local Repository へ ファイル登録( commit ) 実行 ]

```diff 
$ git commit -m "gittest02_text.txtをコミット"
[master c180d67] gittest02_text.txtをコミット
 Committer: user <user@user-no-MacBook-Pro.local>
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 gittest02_text.txt
```

###10　git status 　
[ Working と Staging ファイルの Commit 状態確認 ( Local Repository が最新であるため、何も問題が無い状態 ) ]

```
$ git status
On branch master
nothing to commit, working tree clean
```

###11　<font color="Tomato">git diff --staged</font> 　
[ <font color="Tomato">Staging と Local Repository の差分確認 （ 差分が無くなった ）</font> ]

```
$ git diff --staged

```

###12　<font color="Tomato">git show</font> 　
[ <font color="Tomato">最新 Commit 内容表示</font> ]

```diff
$ git show
commit c180d675574d694f985d81d9fb8462c5215127df (HEAD -> master)
Author: user <user@user-no-MacBook-Pro.local>
Date:   Tue Nov 13 22:48:31 2018 +0800

    gittest02_text.txtをコミット

diff --git a/gittest02_text.txt b/gittest02_text.txt
new file mode 100644
index 0000000..e69de29
```

###13　git reflog 　
[ Branch切り替え確認 ]

```markdown
$ git reflog
c180d67 (HEAD -> master) HEAD@{0}: commit: gittest02_text.txtをコミット
0938823 (origin/master) HEAD@{1}: commit (initial): 初めてのコミット
```

###14　git ls-remote

```
$ git ls-remote
From https://github.com/user/gittest01.git
0938823094d05ddb762b39d8dae1563d8a2c2376	HEAD
0938823094d05ddb762b39d8dae1563d8a2c2376	refs/heads/master
```

###15　<font color="Tomato">git push origin master</font>　
[ <font color="Tomato">Remote Repository に Local Repository を反映</font> ]

```diff
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 320 bytes | 320.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/user/gittest01.git
   0938823..c180d67  master -> master
```

###16　GitHub にて登録を確認



練習 2: 2回目以降 ：　Fin

</div></details>

<br><br>


# 練習 3 :　プッシュ済みファイル再編集/再プッシュ

<!-- ↓ ここをクリックで開閉
<details> -->
<summary></summary><div>

###1　git status

```
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a")
```

###2　git add --dry-run .

```
$ git add --dry-run .
add 'index.html'
```

###3　git ls-files

```
$ git ls-files
.DS_Store
img/.DS_Store
img/Top.png
img/about bg.png
img/mypic.png
img/sunset_sky.jpg
img/work 1 bg.png
img/work 1 mockup.png
img/work 2 bg.png
img/work 2 mockup.png
"img/work 3 bg yuen \347\265\220\347\270\201.png"
img/work 3 mockup.png
index.html
js/0077-jquery.scrollify.js
js/0077-menu_js.js
js/own.js
movie/.DS_Store
movie/bg_movie.mp4
style.css
```

###4　git add .　/　git status

```
$ git add .

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   index.html
```

###5　git diff --staged

```diff 
$ git diff --staged
diff --git a/index.html b/index.html
index fcea6a3..8a1a0f7 100644
--- a/index.html
+++ b/index.html
@@ -5,7 +5,7 @@
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   
-  <title>0077 - Portfolio v2</title>
+  <title>User Portfolio</title>
   
   <link rel="stylesheet" href="style.css">
   <link href="https://fonts.googleapis.com/css?family=Herr+Von+Muellerhoff|Pinyon+Script" rel="stylesheet">
```

###6　git commit "changed title"　/　git diff --staged

```diff 
$ git commit -m "changed title"
[master 7ce68c6] changed title
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git diff --staged
```

###7　git log --stat

```diff 
$ git log --stat
commit 7ce68c63eb053db5d810a1dd7201d39afa2d698f (HEAD -> master)
Author: User <*****+user@users.noreply.github.com>
Date:   Sat Nov 24 12:15:22 2018 +0800

    changed title

 index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 9751b6b3c684db39254fce57f62688c7a23f03a6 (origin/master)
Author: user <*****+user@users.noreply.github.com>
Date:   Sat Nov 24 11:13:39 2018 +0800

    portfolio_template_v1

 .DS_Store                                         | Bin 0 -> 6148 bytes
 img/.DS_Store                                     | Bin 0 -> 6148 bytes
 img/Top.png                                       | Bin 0 -> 604954 bytes
 img/about bg.png                                  | Bin 0 -> 380345 bytes
 img/mypic.png                                     | Bin 0 -> 336886 bytes
 img/sunset_sky.jpg                                | Bin 0 -> 149108 bytes
 img/work 1 bg.png                                 | Bin 0 -> 229532 bytes
 img/work 1 mockup.png                             | Bin 0 -> 102057 bytes
 img/work 2 bg.png                                 | Bin 0 -> 514334 bytes
 img/work 2 mockup.png                             | Bin 0 -> 211844 bytes
 "img/work 3 bg yuen \347\265\220\347\270\201.png" | Bin 0 -> 317451 bytes
 img/work 3 mockup.png                             | Bin 0 -> 154553 bytes
 index.html                                        | 161 +++++++++
 js/0077-jquery.scrollify.js                       | 847 ++++++++++++++++++++++++++++++++++++++++++++++++
 js/0077-menu_js.js                                |  51 +++
 js/own.js                                         |  66 ++++
 movie/.DS_Store                                   | Bin 0 -> 6148 bytes
 movie/bg_movie.mp4                                | Bin 0 -> 2029016 bytes
 style.css                                         | 187 +++++++++++
 19 files changed, 1312 insertions(+)
```

###8　git push origin master

```digdag 
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 335 bytes | 335.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/user/portfolio.git
   9751b6b..7ce68c6  master -> master 
```

</div></details>

<br><br>



# 練習 4 :　add と commit を一気に実行 

<!-- ↓ ここをクリックで開閉
<details> -->
<summary></summary><div>

###1　ファイル編集　/　git status

```
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   index.html

no changes added to commit (use "git add" and/or "git commit -a") 
```

###2　<font color="Tomato">git commit -a -m "changed title at 2nd"</font>

```
$ git commit -a -m "changed title at 2nd"
[master 6069f92] changed title at 2nd
 1 file changed, 1 insertion(+), 1 deletion(-) 
```

###3　git status　/　git diff --staged　/　git show

```diff
$ git status
On branch master
nothing to commit, working tree clean 

$ git diff --staged


$ git show
commit 6069f92c33947e60361b03a208e2e3e779d72cb2 (HEAD -> master)
Author: User <*****+user@users.noreply.github.com>
Date:   Sat Nov 24 12:32:57 2018 +0800

    changed title at 2nd

diff --git a/index.html b/index.html
index 8a1a0f7..aae45f0 100644
--- a/index.html
+++ b/index.html
@@ -5,7 +5,7 @@
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <meta http-equiv="X-UA-Compatible" content="ie=edge">
   
-  <title>User Portfolio</title>
+  <title>Portfolio / User </title>
   
   <link rel="stylesheet" href="style.css">
   <link href="https://fonts.googleapis.com/css?family=Herr+Von+Muellerhoff|Pinyon+Script" rel="stylesheet"> 
```

###4　git push origin master 

```
$ git push origin master
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 349 bytes | 349.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
To https://github.com/user/portfolio_template_v1.git
   7ce68c6..6069f92  master -> master
```

</div></details>

<br><br>