Gitの導入およびGitを使う上で知っておきたいこと

# Gitのインストール
https://git-scm.com/

# 鍵の作成

```bash
# 名前をデフォルトのままにする場合
ssh-keygen -t rsa -b 4096

# 名前を変える場合
# ホームディレクトリ（cdを打った時の箇所）で実行する
mkdir .ssh/
cd .ssh
ssh-keygen -t rsa -b 4096 -f 鍵の名前
touch ~/.ssh/config
```

# 鍵情報の設定

鍵の名前を変たり、複数秘密鍵を所持していたりする場合に必要です。
.ssh/configに記述します。
この設定を行っている場合は、gitのclone操作が下記に変わるので、注意必要しましょう。

```bash
git clone git@github.com:ucan-lab/docker-laravel.git ではなく、
git clone 識別のための任意の名前:ucan-lab/docker-laravel.git
```

```bash
# configのサンプル
# githubの場合の例
Host github # 識別のための任意の名前
 HostName github.com # ipアドレスまたはホスト名
 User git # ユーザー名
 IdentityFile ~/.ssh/鍵の名前 # 秘密鍵のパス
 Port 22 # ポート番号。デフォルトは22
```

# ユーザーの変更

```bash
git config user.email メールアドレス

git config user.name ユーザー名
```

# ログを見やすくする

.gitconfigに下記を追加。該当ファイルがなければ合わせて作成も行う

```bash
[alias]
  lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
  lga = log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
```


# git-secretsのインストール
- PowerShellを管理ユーザーで起動する
Windowsキーを押し検索枠に「powershell」と入力した後、「管理者として実行する」を選択する。

- git-secretsの導入

```bash
# 該当のファイルをクローンしてくる
git clone https://github.com/awslabs/git-secrets.git
cd git-secrets

# パワーシェルではスクリプトファイルを初期設定では実行することはできないので設定を変更する
# 現在の設定確認
# Restricted → 制限されている状態
# RemoteSigned → ローカルにおいてのみ制限を解除されている状態
PowerShell Get-ExecutionPolicy

# 一時的に制限を解除する
PowerShell Set-ExecutionPolicy RemoteSigned

# スクリプトの読み込み（Done. と表示されていれば完了）
./install.ps1

# 設定をもとに戻す
PowerShell Set-ExecutionPolicy Restricted

# もとに戻っていることの確認
PowerShell Get-ExecutionPolicy
```

- 使用したいリポジトリ（publicリポジトリ）で下記を実行する

```bash
# この機能を使いたいgitの設定ファイル（.git）がある場所で下記のコマンドを実行する
# 該当リポジトリをgit-secretsに対応させる
git secrets --install

# AWS向けの検査設定を導入する
git secrets --register-aws
```

# gitコマンド

```bash
# クローン
git clone {リポジトリのURL}

# 不要なブランチを削除
git branch | grep feature | xargs git branch -d

# リポジトリを新規作成する
git init

# リモートリポジトリの内容を取得し、現在のブランチに取り込む（fetchとmergeを同時に行う）
git pull

# ブランチを作成しチェックアウトする
git checkout -b {ブランチ名}
git switch -c {ブランチ名}

# ワークツリーにある全ファイルの変更を取り消す
git restore .

# ワークツリーにある特定ファイルの変更を取り消す
git restore {ファイルパス}

# 変更したファイルの一覧を表示する
git status

# 変更したファイルの一部をコミット対象とする
git add {ファイルパス1} {ファイルパス2}...

# 変更したファイルすべてをコミット対象とする
git add -A

# コミット対象としたファイルをもとに戻す
git reset HEAD

# コミットする
git commit -m "{メッセージ}"

# 対象ローカルブランチをプッシュする
git push origin {ローカルブランチ名}

# 対象のファイルを削除する
git rm {ファイルパス}

# 特定のリポジトリの特定ブランチのみをclone
git clone -b {ブランチ名} --single-branch {リポジトリのURL}
```

# サブモジュールとは
サブモジュールとは、「特定のリポジトリ」の「特定のコミット」をリポジトリ内の特定のディレクトリに紐付ける仕組みです。
指定のリポジトリの更新があったとしてもサブモジュールの更新を行わない限りは、サブモジュールに最新が適用されることはありません。
サブモジュールの運用としては、サブモジュール側のプロジェクトのメジャーアップデートが行われたタイミングなど、更新を頻繁に行う必要がない程度に管理すると良いでしょう。
逆に常に最新を取り込み続けたいなど、同期が短周期で行うような場合には不向きです。

https://qiita.com/go_astrayer/items/8667140aef8875742a36


# サブツリーとは

サブモジュールと同様に、親リポジトリの中に別のリポジトリを取り込むための仕組みです。
サブモジュールとの違いは、サブモジュールが1つのコミットのハッシュ値単位での取り込みしかできないのに対し、サブツリーは別リポジトリの履歴も含めてすべて取り込むことができます。
別リポジトリの内容を親リポジトリのブランチの1つとして取り込むようなイメージです。

# Git LFS

gitが苦手とするバイナリファイルのバージョン管理を行うための仕組みです。
音声ファイル、動画ファイルなどのMB規模のファイルをバージョン管理する際に有効な仕組みです。
逆にkbなどの画像ファイルには不向きとなります。

https://qiita.com/tachi1427/items/55d4d48529cff5a2202c

# Git GUIツール

https://www.sourcetreeapp.com/

https://git-fork.com/

https://www.gitkraken.com/

# Gitの用語
https://zukulog098r.com/git/

https://twitter.com/nanapi/status/474815516532822016?s=20

# 参考ページ

https://cheshire-wara.com/powershell/ps-cmdlets/sequrity/get-executionpolicy/

https://qiita.com/nyokinyoki1848/items/2d2ff297532022108e59

https://blog.toshimaru.net/git-log-graph/

https://qiita.com/yokra9/items/bdd0882268b308cf22ca