gitコマンドまとめ（自分用）

# はじめに

# git version

| コマンド | 説明 |
| --- | --- |
| `git version`  | Gitのバージョンを出力する |

## git clone

| コマンド | 説明 |
| --- | --- |
| `git clone {リポジトリのURL}` | 対象リポジトリのデフォルトブランチをクローンする |
| `git clone --depth {深さ} {リポジトリのURL}` | 対象リポジトリのデフォルトブランチを指定したコミット数で切り詰めてクローンする |
| `git clone -b {ブランチ名} {リポジトリのURL}` | 対象リポジトリの対象ブランチをクローンする |
| `git clone --recursive {リポジトリのURL}` | サブモジュールを含む対象リポジトリのデフォルトブランチをクローンする |
| `git clone --depth 1 {リポジトリのURL}` | 履歴が多いリポジトリをクローンする時間を短縮できます |

## git remote

| コマンド | 説明 |
| --- | --- |
| `git remote` | リモートリポジトリの一覧を出力する |
| `git remote add {リモートリポジトリ名} {リポジトリのURL}` | 対象リポジトリをローカルのリモートリポジトリに追加する |
| `git remote rename {旧リモートリポジトリ名} {新リモートリポジトリ名}` | ローカルの対象リモートリポジトリをリネームする |
| `git remote remove {リモートリポジトリ名}` | 対象リモートリポジトリをローカルから削除する |

## git branch

| コマンド | 説明 |
| --- | --- |
| `git branch` | ローカルブランチの一覧を出力する（チェックアウト中のブランチに `*` が付く） |
| `git branch -r` | リモートブランチの一覧を出力する |
| `git branch -a` | ローカルブランチとリモートブランチの一覧を出力する |
| `git branch {ブランチ名}` | 対象ブランチを新規作成する（チェックアウトしない） |
| `git branch -d {ブランチ名}` | 対象ブランチを削除する |
| `git branch -f {ブランチ名}` | 対象ブランチを**強制**削除する |
| `git branch -D {ブランチ名}` | 対象ブランチを**強制**削除する |
| `git branch -m {旧ブランチ名} {新ブランチ名}` | 対象ブランチをリネームする |
| `git branch --set-upstream-to=origin/リモートブランチ名 ローカルブランチ名` | ローカルのYYYブランチの追跡するリモートブランチをXXXへ変更 |
| `git branch -VV`|ローカルブランチ名，状態，追跡するリモートブランチ名を表示|



## git checkout

| コマンド | 説明 |
| --- | --- |
| `git checkout {ブランチ名}` | 対象ブランチに切り替える |
| `git checkout -b {ブランチ名}` | 対象ブランチを新規作成し、切り替える |
| `git checkout {ファイルパス}` | ワーキングディレクトリにある対象ファイルの変更を取り消す |
| `git checkout .` | ワーキングディレクトリにある全ファイルの変更を取り消す |

*2.23.0で `git switch` と `git restore` コマンドが追加され、`git checkout` コマンドを使わなくても済むようになりました。*

## git restore

基本的に指定したファイルの変更を取り消し，最後にコミットされた状態へ戻す．

| コマンド | 説明 |
| --- | --- |
| `git restore {ファイルパス}` | ワーキングディレクトリにある対象ファイルの変更を取り消す |
| `git restore .` | ワーキングディレクトリにある全ファイルの変更を取り消す |
| `git restore --source {コミットID} {ファイルパス}` | 対象ファイルの変更を対象コミットに戻す |

単にステージ（`git add`）したワーキングディレクトリの変更を取り下げる場合は，オプションに`--staged`を用いる．
| コマンド | 説明 |
| --- | --- |
| `git restore --staged {ファイルパス}` | 対象ファイルのステージングを取り消す |
| `git restore --staged .` | 全てのステージングを取り下げる |

## git diff

| コマンド             | 説明                                     |
| -------------------- | ---------------------------------------- |
| `git diff`           | ワーキングディレクトリにあるファイルの差分 |
| `git diff --cached`  | インデックスにあるファイルの差分 |
| `git diff -w`        |空白（スペース、タブ、改行など）の変更を無視 |
| `git diff --ignore-blank-lines` | 空行の追加や削除を無視 |
| `git diff --ignore-space-change` | 空白の量の変更を無視。インデントの変更（タブ→スペースの変換など）があっても、差分として表示しない|
| `git diff --ignore-permissions`|ファイルのパーミッション（実行権限など）の変更を無視 |
| `git diff -w --ignore-blank-lines --ignore-space-chang`| 空白，くうぎょを全て無視 |

## git status

| コマンド | 説明 |
| --- | --- |
| `git status` | 変更したファイルの一覧を出力する |
| `git status -s` | `git status` を短い形式で出力する |
| `git status -s -b` | 短い形式でもブランチとトラッキングを出力する |

## git add

| コマンド | 説明 |
| --- | --- |
| `git add {ファイルパス1} {ファイルパス2}...` | 対象ファイルをインデックス（コミット対象）に追加する |
| `git add -A` | 変更した全ファイルをインデックスに追加する |
| `git add -p {ファイルパス}` | 対象ファイルをハンク単位でインデックスに追加する |


## git reset


コミットを取り消す際に用いる．

`git reset (option 1) (option 2)`

- option1：コミット取り消し後の状態の指定（デフォルトでは --mixed）
- option2：戻る先のコミットの指定（デフォルトでは HEAD の1つ前のコミット）

| コマンド | 説明 | 備考 |
| --- | --- | --- |
| `git reset --soft` | 最新のコミットを取り消し、その変更をステージングエリアに残す（git add状態は保持） | `git commit`により最新のコミットを（新たなコミットとして）復元可能 |
| `git reset --mixed`（デフォルト）| 最新のコミットを取り消し、その変更をワーキングディレクトリに残し、ステージングエリアから外す | `git add`からの`git commit`により、最新のコミットを復元可能 |
| `git reset --hard` | 最新のコミットとすべての変更を取り消し、ワーキングディレクトリとステージングエリアを完全にリセットする（変更内容が失われる）| ワーキングディレクトリの変更が取り消されているため`git add`，`git commit`では復元できない |
| `git reset --hard ORIG_HEAD` | 直前の `git reset` 操作を元に戻す（通常、`git reset --hard` の取り消し）|


最新のコミットを取り消すため，共通して***最新のコミット以降の変更を間接的に取り消す***ことに注意．

コミットに作用せずに単にステージングを取り消す（ワーキングディレクトリの変更自体はそのまま）操作を行うには`HEAD`を付け加える（つまり，`git reset --mixed HEAD`）．

| コマンド | 説明 |
| --- | --- |
| `git reset HEAD {ファイルパス}` | ステージングエリアにある対象ファイル（`git add {ファイルパス}` を取り消す |
| `git reset HEAD` | ステージングエリアにある全ファイル（`git add -A`）を取り消す |

<details><summary> `git reset HEAD` と `git restore --staged .`</summary>
どちらも機能面では同じ．ただし，ニュアンスが少し異なる．

- 共通点
    - ステージングエリアにある変更をワーキングディレクトリに戻す
    - コミット履歴には影響を与えない．ステージングされている変更を解除するだけで、ワーキングディレクトリにはその変更が残る
    <br>
    
- 微妙な違い
    
    - git reset HEAD 
        古いGitのバージョンから存在しており，ステージングエリア全体や特定のファイルを扱う場合に使われる．HEADを基準として操作を行うため、直感的には「HEADに対してリセットを行う」という感じ．
    - git restore --staged
        Git 2.23以降で導入された新しいコマンドで，より明示的な操作を可能する．このコマンドは、ワーキングディレクトリとステージングエリアの変更を独立して操作するために設計されている．

</details>



## git commit

| コマンド | 説明 |
| --- | --- |
| `git commit` | 指定したエディタでメッセージを書き、インデックスにある全ファイルをコミットする |
| `git commit -m "{メッセージ}"` | メッセージを付け、インデックスにある全ファイルをコミットする |
| `git commit --amend`| ＜要追加＞ |



「指定したエディタ」とは、`.gitconfig` の `editor` で指定しているエディタのことです。

## git revert

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git revert HEAD`                    | 直前のコミットを元に戻すコミットを作成する |
| `git revert {コミットID}`            | 対象コミットを元に戻すコミットを作成する |

## git push

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git push origin {ローカルブランチ名}` | 対象ローカルブランチを origin にプッシュする |
| `git push -d origin {リモートブランチ名}` | 対象リモートブランチを origin から削除する |
| `git push origin {タグ名}`           | 対象タグを origin にプッシュする         |
| `git push -d origin {タグ名}`        | 対象タグを origin から削除する           |
| `git push -f`                        | 強制プッシュする                         |
| `git push --force-with-lease`        | 強制プッシュする（ブランチのアップストリームが変更されている場合などは拒否する） |

## git fetch

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git fetch origin`                   | origin から最新の履歴を取得する         |
| `git fetch --prune origin`           | リモートリポジトリ上に存在しなくなったブランチなどの参照を削除し、origin から最新の履歴を取得する |

## git rebase

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git rebase origin/{ブランチ名}`     | origin にある対象ブランチを、チェックアウト中のブランチへリベースする |
| `git rebase --continue`              | リベースを続ける                         |
| `git rebase --abort`                 | リベースを強制終了する                   |
| `git rebase --quit`                  | リベースを中止する                       |

git rebase自体
例えば，
```powershell
git checkout main && git pull origin main
```
この時，目的のブランチ（rebased-branch）をmainのブランチから生やし直したいとき，
```powershell
git checkout rebased-branch && git rebase main
```

## git merge

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git merge origin/{ブランチ名}`      | origin にある対象ブランチを、チェックアウト中のブランチへマージする |
| `git merge --squash origin/{ブランチ名}` | origin にある対象ブランチのコミットをひとつにまとめ、チェックアウト中のブランチへマージする |
| `git merge --continue`               | マージを続ける                           |
| `git merge --abort`                  | マージを強制終了する                     |
| `git merge --quit`                   | マージを中止する                         |

## git cherry-pick

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git cherry-pick {コミットID}`       | 対象コミットをチェリーピックする         |
| `git cherry-pick {始点の1つ前のコミットID}..{終点のコミットID}` | 始点から終点までのコミットをチェリーピックする |
| `git cherry-pick {始点のコミットID}^..{終点のコミットID}` | 始点から終点までのコミットをチェリーピックする |
| `git cherry-pick --skip`             | 現在のコミットをスキップして、残りのシーケンスを続ける |
| `git cherry-pick --quit`             | 失敗したチェリーピックを取り消す         |

## git stash

| コマンド                             | 説明                                     |
| ------------------------------------ | ---------------------------------------- |
| `git stash list`                     | スタッシュの一覧を出力する               |
| `git stash show`                     | スタッシュの変更を出力する               |
| `git stash save "メッセージ"      `   | メッセージを付け、変更をスタッシュにプッシュする |
| `git stash pop`                      | スタッシュの変更をワーキングディレクトリに戻す（スタッシュから消える） |
| `git stash apply`                    | スタッシュの変更をワーキングディレクトリに戻す（スタッシュから消えない） |
| `git stash drop stash@{n}`                     | n のスタッシュを削除する             |


2020/03/12現在、`git stash save` は非推奨です。代わりに `git stash push` を使いましょう。

スタッシュについては、以下の記事が参考になります。
https://qiita.com/chihiro/items/f373873d5c2dfbd03250

## git log 応用

| コマンド | 説明|
|-|-|
| `git log --oneline --graph --decorate --all`| Git Graph のようなログツリーをターミナル上で出力|
| `git log --graph --name-status --pretty=format:"%C(red)%h %C(green)%an %C(Cyan)%ad %Creset%s %C(yellow)%d%Creset"` | ぼくのかんがえたさいきょうのぎっとろぐ |
## HEAD
### HEAD


### ORIG_HEAD

特定のGit操作（主にgit reset、git merge、git rebaseなど）を行う前のHEADの位置を一時的に保存するポインタ．

- 主な使用法
    `git reset`や`git merge`などを実行する前の状態に戻りたい場合に使う．
    - 例：`git reset` → `git reset --hard ORIG_HEAD`
        - `git reset`を実行すると、その前のHEADの位置がORIG_HEADに保存される．
        - このポインタ（ORIG_HEAD）をもとに、`git reset ORIG_HEAD`で操作を元に戻すことができる．
        - 参考：[ORIG_HEADの使用例](https://backlog.com/ja/git-tutorial/stepup/30/#:~:text=%E3%81%AE%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%AF-,ORIG_HEAD,-%E3%81%A8%E3%81%84%E3%81%86%E5%90%8D%E5%89%8D%E3%81%A7)