GitとGitHubを最低限使えるようにするためのロードマップ

#はじめに
こちらの記事は、Udemyの講義で使用したコマンドや手順を記録するための備忘録です。
本記事で書かれている内容は、講義の要点をまとめたり、バージョンアップに伴う対応を記録していますが、詳細な手順を知りたい方は、以下の講義を受講してください。(無料です)
<a href="https://www.udemy.com/share/101vBk3@Yapdh5Wj7nWZ06dFMgrr9CXgSxAjak35QlxCr0t-EOJQpmdrqHP2wl1qVtCgWpGFAQ==/" >Git：はじめてのGitとGitHub　</a>


#Gitとは
##Gitとは何？
Gitはバージョン管理システム。
複数人で同じファイルを編集したときに、誤って編集を上書きしたりしてしまうことを防いだり、最新のバージョンがすぐに分かるようにすることができる。


#事前準備
##Gitのインストール（MacOS）
Macには、すでにGitが入っている。インストールされているか確認する。

```terminal
user@mbp ~ % git version
```


##Gitの初期設定
GitHubに登録したユーザー名とメールアドレスを登録していく。

```terminal
user@mbp ~ % git config --global user.name "自分が登録したユーザ名"   
user@mbp ~ % git config --global user.email 自分が登録したメールアドレス
```

ここで登録しているメールアドレス（以下、コミットメールアドレス）は、公開されてしまうので要注意です。
私用で使っているアドレスを設定してしまい、公開されたくないという方は、以下のサイトを参考にメールアドレスを変更（削除）しましょう！

<a href = "https://teratail.com/questions/234994">メールアドレスの削除 </a>
<a href ="https://snowtree-injune.com/2021/08/17/mail-git002/"> メールアドレスを公開・非公開にしよう（noreplyの設定） </a>

#GitとGitHubの基本的なワークフロー
##新規プロジェクトから始める場合
Gitリポジトリを作るところから始める。リポジトリとは、ファイルやディレクトリの状態、変更履歴を記録する場所。
まずは、今回の練習で管理したいテキストファイルをあらかじめ作る。
続いて、ターミナルでcdコマンドを使いながら移動する。
lsコマンドで見ると、GitIntroフォルダの中にGitPracticeファイルが入っていることがわかる。

```terminal
user@mbp ~ % cd ~/Desktop
user@mbp Desktop % cd GitIntro
user@mbp GitIntro % ls
GitPractice
```

ここまでできたら、git initコマンドを使って、「.gitディレクトリ」を作る。
Gitはバージョン管理システムだから、システムの状態を時系列順に保持しておく必要がある。
その保存のための場所が.gitディレクトリである。

```terminal
user@mbp GitIntro % git init
Reinitialized existing Git repository in /Users/user/Desktop/GitIntro/.git/
```
ちゃんと作れたか確かめるため、lsコマンドでフォルダの中身を見る。
隠しフォルダまで見るには、オプション[-a]をつける。

```terminal
user@mbp GitIntro % ls
GitPractice
user@mbp GitIntro % ls -a
.		..		.DS_Store	.git		GitPractice
```

試しにgitディレクトリの中身を見てみよう。

```terminal
user@mbp GitIntro % ls -a .git/
.		HEAD		description	info		refs
..		config		hooks		objects
```


##既存プロジェクトから始める場合
もともとあるプロジェクトをバージョン管理する方法を記載する。
予め作ってあるファイルにcdコマンドで移動し、そこでgit initするだけ。
基本的に上記と同じ。

##基本的なワークフローを理解しよう
基本のワークフローは以下の通り。
①ファイルの変更をステージングエリア（コミットする前の控室）へ追加する
②ローカルリポジトリにコミットする
③リモートリポジトリにプッシュする


対象ファイルのあるフォルダにcdで移動する。
続いてgit addコマンドでステージングエリアに追加し、コミットする。

```terminal
user@mbp GitIntro % git add GitPractice
user@mbp GitIntro % git commit
```

コミットメッセージが書けるこのようなエディタ画面になるので、**半角英数字に切り替えて[i]を押す**。

```terminal
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
#       new file:   GitPractice
#
# Untracked files:
#       .DS_Store
#       sample_git/
#
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                                                                                                    
~                       
```
一番上の行にコメントを書いて[esc]を押し、[:wq]を押してEnterを押すと元の画面に戻る。

ここまでできたらブラウザのGitHubに移動し、新しいリポジトリを作成する。
（リポジトリ名はわかりやすいものにする。）
完了したら、「…or push an existing repository from the command line」に書かれているコードを実行する。

以下のコードでGitにGitHubを登録する。

```terminal
user@mbp GitIntro % git remote add origin https://github.com/codarcodar/intro-git.git
```

続いて、以下のコードを実行する。

```terminal
user@mbp GitIntro % git branch -M main
user@mbp GitIntro % git push -u origin main
```

すると、UsernameとPasswordが聞かれるが、PasswordにはTokenが必要らしい。
以下のサイトの手順で解消したので、参考にしてください。
<a href= "https://qiita.com/shunsa10/items/e43564cf48f84b95455b">GitHubでhttpsのパスワードが聞かれたときの対処法</a>


##変更をコミットする
ファイルを変更したら、以下の２ステップを踏む。

①ステージングエリアに追加する（git add ファイル名）
 →複数のファイルを変更した場合、コミットするファイルを選択するためにあるのが**ステージングエリア**
　　→ステージングエリアにあるファイルすべてをコミットする場合は**git add.**とする。

②リポジトリにメッセージを付けてコミットする(git commit)
　　→コミットとは、変更にメッセージを付けて記録・保存すること。
　　→コミットすることで、変更が時系列でリポジトリ内に記録される。


コミットメッセージは、共同で作業している他のメンバーが「何をどうして変更したか」がわかる内容にする。
１行目：変更内容の要約
２行目：空行
３行目：変更理由・変更の背景

テキストファイル(今回はGitPracticeというファイル)に変更を加えて保存し、ターミナルに移動する。
gitの状態を**git status**で確認すると、以下のように表示される。

```terminal
user@mbp GitIntro % git status
On branch main
Your branch is up to date with 'origin/main'.

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:   GitPractice
no changes added to commit (use "git add" and/or "git commit -a")
```
要約すると、「GitPracticeというファイルの内容が書き換わったので、コミットできるよ！」という意味である。

変更をコミットするために、まずはステージングエリアに追加する。

```terminal
user@mbp GitIntro % git add GitPractice
```
追加したあとに、再度「git status」を実行すると、今度はmodified: "ファイル名" が赤字ではなく緑になっている。
これは、ステージングエリアに追加できていると生じるので、OK。

コミットするときに[-v]をつけると、追加された変更点を見ることができるので、おすすめ。

```terminal
user@mbp GitIntro % git commit -v
```

コミットメッセージを編集する画面で、+になっている部分が今回の変更点。

先程と同じ手順でコミットを完了させる。
ちなみに、ターミナルで以下のコマンドを実行すると、今までのコミット履歴が見れる。
上の方が最新で下に行くほど古い履歴になっている。

```terminal
user@mbp GitIntro % git log
commit 1a0a8b9c872c6123cce03293c4b682b502f0da5d (HEAD -> main)
Author: codarcodar <rina.s2.tm.0115@gmail.com>
Date:   Sat Dec 18 16:41:16 2021 +0900

    変更点を追加した
    
    講座の練習のため

commit 836e1d0f560c437641c7b75427c5326c18cb7dd0 (origin/main)
Author: codarcodar <rina.s2.tm.0115@gmail.com>
Date:   Sat Dec 18 15:40:38 2021 +0900

    initial commit
```

##ファイルの削除をコミット
ファイルを削除するときは、rmコマンドを使う。
今回は、second.txtというファイルを削除する。

```terminal
user@mbp GitIntro % rm second.txt
```

削除したファイルをステージングエリアに追加するときはrmを使う。

```terminal
user@mbp GitIntro % git rm second.txt
```

コミットメッセージを書く編集画面になるので、同様にメッセージを書く。


##現在の状況を確認する
コミットしてからの状況を確認する。

```terminal
user@mbp GitIntro % git status
On branch main
Your branch is up to date with 'origin/main'.

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:   GitPractice
no changes added to commit (use "git add" and/or "git commit -a")
```

git statusは頻繁に使うので、マスターしたい。


##変更履歴を確認する
コミットされたログは**git log**で確認できる。
jで下に移動、ｋで上に移動。qで閉じる。

よく使うオプションは以下の通り。
1. git log --oneline
　　→一行で表示する。一瞬で何が変更されたかわかる。

2. git log -p ファイル名 
　　→ファイルの差分を表示する。

3. git log -n 数字
　　→最初の「数字」分のコミットを確認できる。


##ファイルの変更差分を確認する
**git diff**で、ファイルの変更差分を表示する。
diffはdifferenceの略。
ローカル（実際のファイル）とステージングエリアにあるファイルの状態の差分を表示するため、
git addする前後の差分を表示してくれる。

##GitHubにプッシュする
**git remote add**でローカルリポジトリをリモートリポジトリに登録する。
「originとは？」と気になるが、これは「今後はoringinという名前でGitHubリポジトリにアクセスできるよ」ということ。

```terminal
user@mbp ~ % git remote add origin リポジトリのURL
```

「リポジトリのURL」とは、GitHubのメニュータブから「YourProfile」＞タブのRepositories＞「対象のリポジトリをクリック」で画面遷移したときのURLをコピーして貼り付ける。

やってみたら、以下のエラーが出た

```
fatal: not a git repository (or any of the parent directories): .git
```

.gitディレクトリは前の手順で作ってるはずなのに、.gitディレクトリが存在しないと言われている。
これは、**git initコマンド**で初期化することで解消される。

<a href="https://www.thirtyfive.info/entry/2018/07/16/git_remote_add%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%3Afatal%3A_Not_a_git_repository_%28or_any_of_the_parent_directories%29%3A__git" >参考リンクはこちら </a>




ローカルリポジトリの内容をリモートリポジトリへ送信するのは、**git pushコマンド**を使う。
**git push origin master**で、originリポジトリにmasterブランチを送信するという意味。
masterはデフォルトのブランチ名。

#Ruby on Railsチュートリアル的補足
本記事を記載後、RubyOnRailsチュートリアルでGitHubに公開するときに別途設定した項目があるので、記載する。

##編集エディタの設定
クラウドIDE（AWS　Cloud9など）でデフォルトのエディタを設定するときのコマンド

```terminal:Cloud9上で設定する
cloud9User:~/environment/hello_app (master) $ sudo ln -sf `which nano` /usr/bin
```


##エイリアス設定
これは必須ではありませんが、checkoutコマンドを短く入力できるので、設定しておくと便利です。
エイリアスとは別名という意味で、省略形を登録することで作業効率をアップできる。

```terminal:git coをcheckoutのエイリアスに設定する
cloud9User:~/environment/hello_app (master) $ git config --global alias.co checkout
```

##Gitでパスワードを一定時間保持する設定
pushコマンドやpullコマンドを入力するたびにパスワードを入力しなくてよいようにする設定。

```terminal
cloud9User:~/environment/hello_app (master) $ git config --global credential.helper "cache --timeout=86400"
```
上記の設定をすると、Gitはパスワードを86,400秒（つまり1日）の間保持してくれます。
セキュリティ意識の高い方は、デフォルトの900秒（つまり15分）のようにもっと短い時間にしてもよいでしょう。