Gitコマンドチートシート

## gitの初期化

```bash
git init
```

## 状態・検索

```bash
#addしたファイルや修正したけどaddしてないファイルの状況など分かる
git status

#過去のコミットした状況が分かる
git log

git show

#直前のコミットとの差分（オプションなしdiff）
git diff

#2点間の差分が分かる
git diff [コミットID]..[コミットID]

#ブランチ同士の差分を見る
git diff [ブランチ名]..[ブランチ名]

#pullする前に、リモート追跡ブランチとの差分を確認する
#(たとえば今あなたがmasterブランチにチェックアウトしていて、リモートリポジトリのmasterと比較したい場合)
#1．まずリモートリポジトリから更新内容を取得してきて
git fetch origin
#2.ローカルリポジトリのmasterブランチの最新コミット（HEAD）と、リモート追跡ブランチ（origin/main）を比較する
git diff HEAD..origin/main

#push する前に、リモート追跡ブランチとの差分を確認する
#(ローカルで進めたコミットをpushする前に、リモートリポジトリの状態と比較したいとき)
git diff origin/master..HEAD

#保存したリスト（スタッシュリスト）を見る
git stash save

#特定の文字列を含む箇所を検索したい（大文字、小文字を区別する）
git grep "検索したい文字列"
#行番号も表示する設定
git config --gloal grep.lineNumber true

#コミットやブランチを指定して検索したい
git grep "検索したい文字列" [コミットID,ブランチ]

#特定ワードを含むファイル名のみ表示したい
git grep -l “検索したい文字列”

#いつ誰のコミットでその行が変更されたのかを調べられます。
git blame [ファイル名]

#タグを一覧表示
git tag

#スタッシュを表示
git stash list
```

## コミットなどの編集の反映

```bash
#ステージングする（ワイルドカード指定もできる）
git add ファイル名
#変更ファイルすべてをステージングする
git add .

#ステージングを下げる
git restore --staged ファイル名
#ステージングを下げる　ファイルの変更まではもとに戻らない
git reset

#変更内容を確認する
git diff --cached

#コミット
git commit
#コメント付き（エディターが立ち上がらない）
git commit -m "ここにコメントを書き込む"
#変更の詳細を見れる
git commit -v

#コミットの内容を見る コミットIDははじめ4ケタだけでもいい
git show コミットID
#直近
git show

#別のブランチでやってる特定のコミットだけをコピーしてきて、コミットする
git cherry-pick [コミットID]
#複数は
git cherry-pick [コミットIDその１]..[コミットIDその２]
#取り込みたいけどコミットはしたくないとき(作業ディレクトリだけに反映する)
git cherry-pick -n [コミットID]

#作業中のファイルを一時保存
git stash save

#保存したリスト（スタッシュリスト）を見る
git stash list

#スタッシュを復活させる
git stash apply stash@{n}

#スタッシュを削除する
git stash drop stash@{n}

#スタッシュの復活＆削除
git stash pop stash@{n}

#タグをつける
git tag [タグ名]

#注釈付きタグをつける（aはアノテート）
git tag -a [タグ名] -m "注釈"

#タグをリモートリポジトリに共有する
git push origin [タグ名]

#複数のタグを全部プッシュする
git push origin --tags

#タグを一覧表示
git tag

#ローカルリポジトリのタグの削除
git tag -d [タグ名]

#リモートリポジトリのタグの削除
git push origin --delete [タグ名]
```

## 元に戻す

```bash
#ワークディレクトリ上の変更を元に戻す
git checkout "ファイル名"
#ワークディレクトリ上の変更を元に戻す
git restore --worktree [ファイル名]
#ワークディレクトリ上の変更を元に戻す
git reset --hard HEAD

#特定のファイルを、特定のコミット時点に戻す
git restore --source [コミットID] [ファイル名]
#特定のファイルを、特定のコミット時点に戻す
git checkout [コミットID] [ファイル名]

#直前のコミットをやり直す(※push後には使ってはいけない)
git commit --amend

#リバート（指定したコミットと逆の内容をコミットする）（※push後にも使える）
git revert [打ち消したいコミットID]
#HEADの位置のみ
git reset --soft HEAD^
#8個前のコミットまで戻す
git reset --soft HEAD~8
#指定したコミットIDまで戻す
git reset --soft caddd1c
#HEADとステージも戻す（addしたファイルを、addする前に戻す）
git reset --mixed [ファイル名]
#HEADとステージも戻す（addしたファイルを、addする前に戻す）
git restore --staged [ファイル名]
#HEADとステージと作業ディレクトリも戻す
git reset --hard

#リフログ（HEADの移動履歴を表示）
git reflog
#戻りたい地点の数字を指定してリセットする
git reset --hard HEAD@{n}

#スタッシュを復活させる
git stash apply stash@{n}

#スタッシュを削除する
git stash drop stash@{n}

#スタッシュの復活＆削除
git stash pop stash@{n}
```

## ブランチ

```bash
#ブランチの確認
git branch
#すべてのブランチを表示
git branch -a

#ブランチ生成
git branch 新規ブランチ名

#リモートブランチを元にローカルブランチを作成する
git branch [新規ローカルブランチ名] origin/[コピーしたいリモートブランチ名]

#ブランチ変更
git checkout ブランチ名
#ブランチ変更
git switch ブランチ名

#ブランチの生成＆変更
git checkout -b 新規ブランチ名
git switch -c 新規ブランチ名

#ブランチ削除（小文字の場合はマージしていない変更があれば削除されない）
git branch -D[d] engawa

#前のブランチに戻る
git checkout -

#ブランチ名を変更する
git branch -m 変更後ブランチ名

#リモートブランチをローカルワークスペースに落とす
git checkout -t ブランチパス

#すでに消されたブランチをローカルでも消す
git fetch --prune
#すでに消されたブランチをローカルでも消す
git remote prune [リポジトリ名]
```

## リモートとのやりとり

```bash
#プッシュする
git push [リモート] [ローカルブランチ名]

#リモートリポジトリを表示
git remote

#登録（追加）されているリモートリポジトリのURLを表示
git remote -v

#リモートからローカルブランチにコピーする
git fetch

#リモートからワークツリーにマージする
git pull リモート名　ブランチ名

#リモートリポジトリ名を変更
git remote rename [旧リモート名] [新リモート名]

#リモートリポジトリを削除
git remote rm [リモートリポジトリの呼び名]

#リモートリポジトリを追加する
git remote add [リモートリポジトリの呼び名] [リモートリポジトリのURL]

```

## マージ・リベース

```bash
#マージ
git merge [ブランチ名]

#マージを中断する（コンフリクトが複雑なときとか）
git merge --abort

#リベース（親コミットを変更する。別のブランチの子コミットをポインタする）
git rebase [ブランチ名]
```

## コンフリクト

```bash
<<<<<<< HEAD
<h1>hello git1</h1>
=======
<h1>hello git2</h1>
>>>>>>> feature
```

コンフリクトが発生した場合は正しいコードを残していらないものは削除して保存する

## Gitの設定

```bash
# 設定ファイル閲覧
cat ~/.gitconfig
# 設定の閲覧(オプションでスコープを選択)
git config --list --global

#グローバル情報の設定（--local --systemもある）
git config --global user.name "名前"
git config --global user.email 自分のメアド

# ローカル情報の削除
git config --local --unset user.name

# 直前にコミットされた変更を修正し、作成者をリセットするために使用されます
git commit --amend --reset-author

#エイリアス
#git statusをgit stで使用可能にする
git config --global alias.st status

#grepで行番号も表示する
git config --gloal grep.lineNumber true

```

## クローン

```bash
git clone [SSHのURL]

#initブランチから始める
git clone --branch init [SSHのURL]
```

### SSHの公開鍵

```bash
# SSH鍵を作る
ssh-keygen -t rsa -b 4096 -C "コメント"
# -t rsa：鍵の種類（デフォルトでrsaだが確実性のため記載する）
# -b:バイト。鍵の長さ。長いほど強固になる。
# -C:コメント

# SSH鍵がつくられたディレクトリに移動
cd ~/.ssh

#SSH公開鍵を見る
cat id_rsa.pub
#コピーする
cat id_rsa.pub | pbcopy

#生成された鍵をGitHubにペーストして追加する
#done
```

### SSHでクローンする

SSHが標準的な方法

※HTTPS,GitHub CLIはGitHub独自の知識が必要

1.  SSH鍵を作成する
    1. コマンドラインからRSAで鍵を生成と取得
        1. `ssh-keygen -t rsa -b 4096 -C “ここにコメント”`
            1. 鍵の保存先を聞かれる。デフォルトでOK。
            2. パスフレーズを設定する
            3. `cd ~/ .ssh`　鍵のある場所に移動する
            4. `cat id_rsa.pub | pbcopy`   クリップボードにコピーする
2. GitHubに戻り、KeyのテキストエリアにペーストしSSH鍵を登録する
    1. [https://github.com/settings/ssh/new](https://github.com/settings/ssh/new)
3. リモートリポジトリのURLを取得する
    1. GitHubの該当のリポジトリを開き、Code→SSHタブのURLをコピーする
4. Gitクローンする
    1. `git clone [SSHのURL]`
    2. SSHのパスフレーズを入力して完了！

- 鍵のありか
    
    ホームディレクトリ直下（~/.ssh）にある
    
    id_rsa.pub：公開鍵。公開しても大丈夫な鍵。
    
    id_rsa：複製厳禁なシークレットな鍵。
    

---

# 知識

## GitHub

Web上でリモートリポジトリを管理できるサイト

## ブランチ

コミットIDへの参照（ポインタ）

### HEAD

現在作業中のブランチへの参照（ポインタ）

## マージ

### Fast forward merge

古いブランチを新しいブランチに追いつかせる

### Auto Merge

分岐したブランチをまとめる

マージコミットという新しいコミットが生成される

## ステージ

コミットする変更を準備する

ワークツリーの変更で一部のコミットしたいものだけを切り出す

---

# コンソール

## よく見るメッセージ

```bash
Your branch is ahead of 'origin/main' by 1 commit.
```

訳：あなたのブランチは1コミット分、'origin/main'より進んでいます。

リモートブランチにないコミットが 1 つあることを意味しています。これは、ローカルリポジトリに変更を加えてもまだサーバーに反映されていないことを意味します。リモートブランチの変更を取得するためには、まずその変更をプルする必要があります。

---

# 運用上の注意

- 極力、異なるブランチで同じファイルを編集しない
    - コンフリクト防止
- pullやmergeする前に変更中の状態をなくしておく（commitやstashをしておく）
- pullするときは、pullするブランチに移動してからpullする
- detached HEAD にならないようにする
    - その状態で他のブランチにチェックアウトすると、コミットが消滅する
    - 過去のコミットIDを直接指定してチェックアウトするとなってしまう

---

# 参考URL

- [みんなのGit講座 - ソフトウェア開発現場で必須となる実践的なGitのスキルとお作法を現役のシニアエンジニアから学ぼう](https://www.udemy.com/course/git-zero-to-hero/)

- [Git： もう怖くないGit！チーム開発で必要なGitを完全マスター](https://www.udemy.com/course/unscared_git/)

- [マンガ・Git カテゴリーの記事一覧 - itstaffing エンジニアスタイル](https://www.r-staffing.co.jp/engineer/archive/category/%E3%83%9E%E3%83%B3%E3%82%AC%E3%83%BBGit)