実務で使うgitの使い方をChatGPTに教えてもらった。

## 実務で使うgitの使い方をChatGPTに教えてもらうでござるの巻
いつも定型分で覚えがちな内容をChatGPTさんに教えてもらいました。
ついでに実務での使い方もメモ

使用者のレベル感です。
 - gitlab使ってる
 - CLI操作ゴリゴリは初めて
 - 長い間開発環境はSVNとVS code環境オンリー（CLIとgitは使って半年程度）
 - 実務環境はソフトのインストール制限あり
 - 開発過程はgitlabで管理して本番ソフトはSVNで管理という環境

GUIに慣れてるので基本GUIが使いやすいけど、CLIも覚えないとというかんじで
使っています。

### 1. `git init`
リポジトリを初期化するコマンドです。

- **オプション**:
  - `--bare`：ベアリポジトリを作成します。通常のリポジトリでは作業ディレクトリがあり、ベアリポジトリでは作業ディレクトリがありません。共有のリポジトリに適しています。

あんまりつかいません。

### 2. `git clone`
リモートリポジトリから新しいリポジトリを作成するコマンドです。

- **オプション**:
  - `-b <branch>`：特定のブランチをチェックアウトしてクローンします。
  - `--depth <depth>`：指定した深さでの浅いクローンを作成します。履歴の一部だけを取得します。
  - `--single-branch`：現在のブランチのみをクローンします。通常は全てのブランチを取得します。

これもあんまり使いません。
実務ではgitlab使ってるのとgitlab上でブランチ切ってるからでしょうか・・・？

### 3. `git add`
ファイルをステージングエリアに追加するコマンドです。

- **オプション**:
  - `-A`：すべての変更をステージングエリアに追加します。
  - `.`：現在のディレクトリ以下のすべての変更をステージングエリアに追加します。
  - `-p`：変更を部分的にステージングします。対話的に操作します。

これは毎日使います。以下の順番
git status　⇒　変更一覧
git add　⇒　変更をひたすらスペース区切りでコピペ
注意点としては、ある程度の深さをステージングしてないとフォルダのまま
リストにでてきて、それをコミットして余計なゴミまでコミットとかです。

### 4. `git commit`
ステージングエリアの変更をリポジトリにコミットするコマンドです。

- **オプション**:
  - `-m "<message>"`：コミットメッセージを指定します。
  - `--amend`：直前のコミットを修正します。新たにコミットメッセージや内容を追加できます。
  - `-a`：ステージングエリアに追加されていない変更も自動的にコミットします。

これはgit commit で別画面に行ってそこからコミットメッセージ作る⇒git pushが多いですね。
SVNは画面切り替わらないので -m をいつもつけてます。

### 5. `git status`
リポジトリの現在の状態を表示するコマンドです。

- **オプション**:
  - `-s`または`--short`：簡潔な形式で表示します。
  - `-b`：現在のブランチ情報を表示します。

git statusもそのまま使ってます。

### 6. `git diff`
変更内容を表示するコマンドです。

- **オプション**:
  - `--cached`：ステージングエリアの変更内容を表示します。
  - `HEAD`：最後のコミットとの違いを表示します。

git diffとかgit archiveが最初の躓きかなと思います。
個人的にはリポジトリグラフでコミットハッシュとってコミットハッシュでdiff取るか
git diff > patch.patch とかの使い方が多いです。
あとはマージリクエスト時に余計なものが入らないようにdiffしながらチェンジログをキレイにしていくとか

### 7. `git log`
コミット履歴を表示するコマンドです。

- **オプション**:
  - `--oneline`：各コミットを一行で表示します。
  - `--graph`：コミット履歴をグラフィカルに表示します。
  - `--pretty=format:"%h - %an, %ar : %s"`：カスタムフォーマットで履歴を表示します。

git logはgitlabの機能などを使いたい所存
踏み台からSSHでターミナルで開発環境入って～とかだとこのあたりをマスターしないといけないのでそのうち使いこなせないとなとは思っている。

### 8. `git branch`
ブランチを管理するコマンドです。

- **オプション**:
  - `-a`：すべてのブランチ（ローカルとリモート）を表示します。
  - `-d <branch>`：指定したブランチを削除します。
  - `-m <old-branch> <new-branch>`：ブランチ名を変更します。

git branchだけで使うことが多いです。
git fetch --prune　して　git branch -a とかも多い。
消去とかブランチ名変更はgitlabでやっているので使えるようになったほうがいいんでしょうね

### 9. `git merge`
別のブランチの変更を現在のブランチに統合するコマンドです。

- **オプション**:
  - `--no-ff`：マージコミットを必ず作成します。ファストフォワードマージを防ぎます。
  - `--squash`：複数のコミットを1つにまとめてマージします。

git mergeを使うタイミングはほとんどありません。
プルリクエストの前にローカルでお試しでチェンジログキレイにしてみたり、
別のdevelopから内容を引っ張ってくるときにpullできないからマージするとか？
git mergeしたあとは必ずコンフリクト解消分のpushが必要か確認するとかかな

### 10. `git pull`
リモートリポジトリから変更を取得して、現在のブランチにマージするコマンドです。

- **オプション**:
  - `--rebase`：マージの代わりにリベースを行います。

git pullだけで使うことが多いけど、複数人でコミットしていくブランチのときは
--rebase使うようにクセをつけるといいかなと思いました。
もしくは、pushもpullもできなくなったら--rebase使えばOKと覚えておくだけでもいいのかも
--rebaseすると自分のコミット内容がステージングエリアに用意されていても
（コミットのグラフが完全に違うようになっていても）
下から順番にコミットを足して、最後に自分のコミットが一番最新に来るように変更してくれる。

### 11. `git push`
ローカルリポジトリの変更をリモートリポジトリにアップロードするコマンドです。

- **オプション**:
  - `--force`：リモートの履歴を強制的に上書きします（注意が必要です）。
  - `--set-upstream`：ローカルブランチとリモートブランチの追跡関係を設定します。

git push はコミットログを消す方法が～ってのはありますが、
初心者多いとコミットログ消すとコミットグラフから切り離されてしまうことが多々あるので
ある程度の粒度があったら汚いチェンジログを消すためのコミットは許容する方針です。
コミットメッセージには注意ですが（改行を消去とか余計なスペース消去とかなのですぐわかる）

### 12. `git stash`
作業中の変更を一時的に保存し、作業ディレクトリをクリーンにするコマンドです。

- **オプション**:
  - `save "<message>"`：変更を保存する際にメッセージを付けます。
  - `pop`：スタッシュから変更を復元し、スタッシュリストから削除します。
  - `apply`：スタッシュから変更を復元しますが、スタッシュリストからは削除しません。

git statsh はあんまり使ってないかな。
stashするときとdiffでパッチ作るときがありますが個人的にはパッチで残しておくほうが好きです。

ChatGPTさんはcheckoutとかarchiveとかお忘れでないでしょうか・・・？
ということで次回はよく使うコピペを説明してもらいましょう