Git/GitHubとは（勉強メモ）

### Git(共同開発) 

#####1. リポジトリ
バージョン管理の保存先。バージョン情報の履歴が保存される。
・ ローカルリポジトリ：作業環境上（自分のPCなど）で作られるリポジトリ。
・ リモートリポジトリ：ネットワーク先に作られるリポジトリ。
　　リポジトリの共有やバックアップを目的とする。（GitHubなど）

#####2. コミット
・ コミット：Gitでの１つ１つのバージョンのこと
　　コミットを作成することをコミットすると言う 

#####3. コミットで重要な情報
・ リビジョン番号(1e010f45...の様な値)
　　コミットを一意に指定できるIDの様な役割。コミット時に決定され、コミットを
　　やり直した場合は全く別のリビジョン番号になる。コミットのハッシュ値とも呼ばれる。 
・ コミットした人(誰が) 
・ コミットした日時(いつ) 
・ コミットした時のファイル内容の差分(どのファイルのどの箇所) 
・ コミットメッセージ(どんなメッセージを残して) 
　　コミットするときに必須のメッセージで、どういった内容の変更をコミットするのか、簡単なメッセージを書いておく。
・ 親コミット(１つ前のコミット)のリビジョン番号
　リポジトリ内では１つ１つのコミットが親コミットのリビジョン番号を持っているので、
『コミットの親コミットを巡り、その親コミットを巡り、さらにその親…』
という形で、連なるような変更履歴の管理を実現できている。

#####4. ワークツリーとインデックス 
　ワークツリー：Gitでバージョン管理されているフォルダ  

　4-1.ステージする：ワークツリーから次のコミットに含めたいファイルの変更箇所を選択すること 

　4-2.インデックス：ステージされた変更箇所が反映される場所 
　　　ローカルリポジトリへコミットする一歩手前で、コミットする変更箇所を選ぶ段階 

　4-3.最後にコミットを行ない、バージョンが1つ進む 
　　　コミットされる変更箇所は、インデックスにステージされた変更箇所のみ 

ワークツリーからインデックスへステージされていない変更箇所はコミットに含まれない。含めたい場合、ワークツリーの変更箇所をインデックスへステージする。

#####5.インデックスの役割 
　ファイルの変更をコミットするまでに、一度インデックスという中間地点を挟む必要がある。 
　コミットを行う前に、ワークツリーの変更箇所の中から関連性のある変更のまとまりを選択する重要な役割がある。
※関連性のあるまとまりとしてコミットを行うべき
　コミットは複数になるが、1つのコミットには関連性のある変更内容しか含まれないため、扱いやすいコミットになる。
【無関係な複数の変更を同時に行い、一気にコミットして1つのバージョンとすると、とても扱いずらいコミットになる】  

#####6.ブランチ(branch)：直訳「枝」。Gitでは「変更履歴を枝分かれさせる機能」。
　　複数人で開発する際に効果的。 

#####7.デフォルトのブランチ名(本流) 
　　ローカル(Git)リポジトリのデフォルトブランチ名は```master``` 
　　リモート(gitHubリポジトリのデフォルトブランチ名は```main``` 

#####【Gitまとめ】 
コミットは1つのバージョン。ファイルを変更するとワークツリーに反映される。 
変更箇所は『ワークツリー→インデックス→ローカルリポジトリ』と移動する。
『ワークツリー→インデックス』の移動：ステージする。
『インデックス→ローカルリポジトリ』の移動：コミットする。



#### 実際にGitを使う準備
#####・隠しファイル・フォルダを表示（最初に.がつく) 

#####・Gitの設定 
HOMEディレクトリ直下の(.gitconfig)という設定ファイルが、Gitの共通設定ファイル 
設定にはGitコマンドを使う 
名前とメールアドレスを設定 
```git config --global user.name "名前"``` 
```git config --global user.email "メールアドレス"``` 
```less ~/.gitconfig```設定の確認  


####バージョン管理の一連の流れ 
#####1.リポジトリの作成（初期化） 
```git init``` 
『.git/』ファイルが作成される。この隠しフォルダがリポジトリの実体で、バージョン管理を行っている。
※リポジトリが壊れるのでぜったに触らない！ 
・現在のワークツリーとインデックスの状況を確認```git status```  

#####2.ファイルの追加・変更 

#####3.ファイルの変更箇所のステージ 
ワークツリーから変更箇所をステージしてインデックスに移動させるには(git add)コマンドを使用してファイルを選択する。 
```git add index.html``` （例としてindex.html)を選択。全ての場合は、```git add .```

#####4.コミット 
バージョンを作る為に```git commit -m "oo"```コマンドを使用 
-m "oo"はメッセージをつけてコミットするためのオプション 
例として「first commit」というメッセージでコミット 
```git commit -m "first commit"```  

#####5.履歴確認```git log``` 
4つの情報が表示される 
・コミットのリビジョン番号：commitbb1cc... 
・コミットした人：Author: XXX ... 
・コミット日時：Date: Fri Sep 14 ... 
・コミットメッセージ：first commit 

#####【コマンドまとめ】
git init：現在のフォルダ内にリポジトリを作成、ワークツリーとインデックスを用意する
git add ファイル名：新規追加や変更されたファイルを選択し、ステージさせる 
git commit -m "oo"：ステージされた変更をコミットする 
git status：ワークツリーとインデックスの状況をファイル単位で確認する 
git diff：ワークツリーとインデックスを比較し、その差分を表示する 
git log：過去のコミット履歴を確認する
git diff：ワークツリーとインデックスの差分 
git diff --cached：インデックスとローカルリポジトリの基準コミットとの差分 

###●GitHubへリポジトリを反映するための一連の流れ  
#####1.GitHubにリモートリポジトリを作成  
GitHubへアクセスしログイン  
+ボタンから(new repository)をクリック  
(Repository name)にfirst-gitと入力、(Create repository)  

#####2.ローカルリポジトリにリモートリポジトリを登録  
ローカルリポジトリにoriginという名前でリモートリポジトリを登録  
```git remote add origin https://github.com/nomo1225/first-git.git```を実行  
リモートリポジトリの登録状況の確認```git remote -v```  

#####3.ローカルリポジトリのブランチ名を変更  
ローカルリポジトリとリモートリポジトリのデフォルトブランチ名が異なる為、master(ﾛｰｶﾙ)からmain(ﾘﾓｰﾄ)に変更  
```git branch -M main```  
👉ターミナルの(master)が(main)に変わる  

#####4.登録したリモートリポジトリへプッシュする  
ローカルでのコミットを反映させる  
```git push origin main``` 

#####5.GitHubのリモートリポジトリにプッシュされたか確認(ブラウザで) 
``https://github.com/nomo1225/first-git``  

#####【GitHub　コマンドまとめ】
git remote add origin リモートポジトリURL：ローカルリポジトリにリモートリポジトリを登録 
git remote -v：ローカルリポジトリに登録されたリモートリポジトリの一覧を表示 
git branch -M main：ローカルリポジトリのブランチ名をmainに変更 
git push origin main：登録したリモートリポジトリへプッシュする 
originとは：自分のローカルリポジトリと同じリモートリポジトリを、originという名前にするのが習慣となっている。

#####●Gitで管理しないファイルを指定  
Gitのデフォルトは全てのファイルを管理下に入れようとするが、管理したくないファイルもある 
*公開するとセキュリティ問題となるファイル(パスワードファイルなど) 
*二次的に生成されるファイル（ビルドファイル、キャッシュファイルなど） 
*外部ライブラリで管理不要なもの 

【.gitinore】というファイルにファイル名などを指定する
.gitと同じ階層に、.gitignoreファイルを新規作成  
一行ごとに管理対象外とするファイルやフォルダを書いていく  

・gitignoreの記法 

```
# シャープ記号のあとはコメントになる

# 指定フォルダ以下はすべて無視する（フォルダの最後は / ）
sample_folder/

# *を使うと色々なファイル名にマッチする。下記は.txtが拡張子のファイルはすべて無視
*.txt
```