Gitを始めよう!

Git初心のための記事。
## 仕組み
Gitはスナップショットで記録する。→　変更がされなかったファイルはそのまま次のバージョンでも使う。
スナップショットで記録すると、複数人で開発するときにスピードが上がる。


コミットする際に直前のコミットも覚えているため。
バージョンを記録しておくと、以前のバージョンに戻すことができる。

（コミットには**直前**のコミット、作成者、日付、コミットメッセージが記録される）

ローカル：MyPC
リモートリポジトリ：GitLab

- ローカルは3つ分けられる
リポジトリ：スナップショットを記録（`git commit`）
ステージ：変更が完了したものだけを記録、変更途中のファイルは置かない（`git add`）
ワークツリー：VSコード




## Gitの始め方
- 自分で新規プロジェクトを作成の場合を以下を行う
`git init` でローカルリポジトリが作成される（.gitディレクトリ）
.gitディレクトリは隠しフォルダなので`ls -a` で確認できる。

<details><summary> .git フォルダの中を確認してみよう</summary>

HEAD：
branches：
config：設定ファイル
description：
hooks：
info：
obgects：リポジトリ本体（ツリーファイル、コミットファイル）

</details>

- 他の人がプロジェクトを作成した場合は以下を行う
`git clone <リポジトリ>`でクーロンを作成する。
ローカルにリモートリポジトリファイルと.gitディレクトリがコピーされる。


1\. リモートリポジトリを新規登録。
`git remote add origin <url>`

<details><summary>originの説明</summary>

originというショートカットでurlのリモートリポジトリを登録する。
登録することで、今後originという名前でGitLabリポジトリにアップしたりゲットできる
登録しないと・・
毎回、リポジトリurlを記載しないといけなくなる。
</details>

2\. リモートリポジトリに送信
`git push <リモート名><ブランチ名>`

Githubの場合の確認事項↓
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

## コマンド集
`git remote add origin <url>`：リモートリポジトリを新規登録。
<details><summary>originの説明</summary>

originというショートカットでurlのリモートリポジトリを登録する。
登録することで、今後originという名前でGitLabリポジトリにアップしたりゲットできる
登録しないと・・
毎回、リポジトリurlを記載しないといけなくなる。
</details>

`git add`：VSコードで作業してステージに追加　

`git commit`：ステージにあるものをリポジトリに追加 
オブション -m ：メッセージを書く。
オブション -v ：変更内容をエディタを確認できるyo

コミットメッセージの書き方!
1行目：タイプ□変更内容の要約
2行目：空白
(3行目：変更した理由)

タイプの選び方↓
https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#commit-message-format

`git push <リモート名><ブランチ名>`：リモートリポジトリに送信
Githubの場合の確認事項↓
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token


`git status`：ワークツリーとステージの間で変更されたファイル。ステージとリポジトリで変更されたファイルを確認

`git diff` ：ワークツリーとステージの変更差分を確認
`git diff<ファイル名>`：特定ファイルの変更差分を確認
`git diff --staged` ：ステージとリポジトリの変更差分を確認（differenceの略）

`git log`：コミット履歴を表示、コミット１とコミット２の変更履歴を表示

`git rm <ファイル>`：ファイルの削除
`git rm <ディレクトリ>`：ディレクトリの削除
git rm --cached <ファイル名>：ローカルリポジトリからのみ削除したい

`git reset`：
`git remote -v`：設定しているリモートリポジトリの情報を表示
~~`git remote show <リモート名>`：`git remote`よりも詳しい情報表示~~
`git remote add <リモート名><リモートURL>`：リモートリポジトリを新規作成。<リモート名>という名前でリモートリポジトリにアップしたり、取得したりできる。2つリモートリポジトリを登録することで個人用と会社用で分けることができる。
`git fetch <リモート名>`：リモートリポジトリからローカルリポジトリにブランチとして取得する。基本的にはfetchを使おう! （リモートリポジトリの内容を取得）

`git merge <リモート名>`：ローカルリポジトリからワークツリーに取り込む。
`git merge <ブランチ名>`：
`git merge <リモート名/ブランチ名>`：

`git checkout <ブランチ名>`：ブランチ切り替え
`git -a`：すべてのブランチを表示
`git pull <リモート名><ブランチ名>`：fetchとmerge
~~`fetch`と`pull`使い分け：基本的にはfetchを使おう!~~
~~`git remote rename<旧リモート名><新リモート名>`：リモート名の変更。~~
~~`git remote rm<リモート名>`：リモートの削除~~

`git branch <ブランチ名>`：ブランチを作成（切り替えはしない）
`git branch`：ブランチ一覧表示
`git branch -a`：リモートブランチ含め表示

`git checkout <既存ブランチ>`：既存ブランチに切り替える
`git checkout -b <新ブランチ>`：ブランチ作成＋切り替え

`git merge <ブランチ名>`：
`git merge <リモート名/ブランチ名>`：

`git branch -m <ブランチ名>`：作業しているブランチの名前を変更
`git branch -d <ブランチ名>`：削除する
`git branch -D <ブランチ名>`：強制削除する

`git rebase <ブランチ名>`：ブランチの基点となるコミットを別のコミットに移動、親子コミットを変える

`git stash`：ワークツリーとステージの変更点をstashという場所に避難させて、別のブランチに移動する（stashは隠すという意味）
`git stash list`：避難した作業の一覧を表示する
`git stash apply `：最新の作業を復元する
`git stash apply --index`：ステージの状況も復元する
`git stash drop `：最新の作業を削除する
`git stash drop <スタッシュ名>`：特定の作業を削除
`git stash clear`：全作業を削除

`git diff `：ワークツリーとステージの変更差分を確認
`git diff<ファイル名>`：特定ファイルの変更差分を確認
`git diff --staged` ：ステージとリポジトリの変更差分を確認（differenceの略）


`git rm --cached <ファイル名>`：ローカルリポジトリからのみ削除したい

`git reset `：

## 用語集

`ブランチ`：コミットしたら、ブランチが指し示すコミットファイルが変わる。コミットIDを記録したポインタ
`HEAD`：現在作業中のブランチのポインタ
`マージ`：他の人の変更内容を取り込む作業

`コンフリクト`：同じファイルの同じ行に対して異なる編集をしたときに起こること
`プルリクエスト`：
`リモートブランチ`：リモートのブランチの状態へのポインタのこと。<リモート>/<ブランチ>で参照（git fetch）
`Gitflow`：
`リベース`：ベースとなるコミットを新しくしている
`スタッシュ`：作業が途中でコミットしたくないけど、別のブランチで作業しないといけない時に一時避難する。
## Gitflow


https://www.sourcetreeapp.com/


##作成中


remote add することでoriginという名前でgitコマンドの中でoriginとして使えるようになる。
git branch -M main masterからmainに変更
git push -origin main mainをorign(登録url)にpush 
-u：指定したリモートリポジトリのブランチを上流ブランチとして設定するオプション
上流ブランチとして設定することでgit pushするときにリモートレジトリ名とブランチ名を省略できる。
＝git pushだけでプッシュできる

空のリモートリポジトリを作る。
手元で構築したリポジトリをpush

Fork
メインから派生する機能
フォークする理由：
メインのメンテが止まった
開発方針の相違により分家する
cloneとの違い：
フォーク先のページにフォーク元が表示される。
フォーク元からフォーク先のリポジトリに飛べる

pull request：
変更を取り込んでもらうためのリクエスト（pullは変更を取り込む作業）



GitActions：
PushなどのタイミングでGithub側で任意のコマンドを実行できる
ビルドして成果物をサイトに公開するまでを自動化
継続的インテグレーション（CI）：自動的にテスト
継続的デリバリー（CD）：成果物を自動的に本番環境にUP



ブランチモデル：
1Git-flow
GitHub flow








ブランチを切り、いくつかコミットしプルリクエスト
文ランチのプルリクエスト上でコードにコメントしコミットをいくつか追加し、マージする

ホストにあるディレクトリやファイルを
コンテナの中で参照する