Gitでやりたいこと、ここで見つかる

## 概要
**「この記事を見ればGitで困ったことが（だいたい）全て解決する！」**っていう記事です。

逆引き辞典みたいな感じで使っていただけたらと思います。

##ローカルのソースファイルをGitHubにプッシュするまでの流れを知りたい（超基本）
Gitを使う上でこの一連の流れは絶対に抑えておきたいやつ

```git
//Gitでの管理を始める（=ローカルリポジトリ作成）
$ git init

//ローカルリポジトリの設定を行う（GitHubを登録）
$ git config user.name GitHubのユーザーネーム
$ git config user.email GitHubのメールアドレス

//変更分をステージングにあげる
$ git add .
//ローカルリポジトリにあげる
$ git commit -m "コミットメッセージ"

//ローカルリポジトリにmainブランチを新規作成
git branch -M main

//リモートリポジトリ（GitHub）を登録
$ git remote add origin リモートリポジトリのURL

//リモートリポジトリにプッシュする
$ git push origin main
```

`git branch -M main`は`git branch -m main`でもOK。

[【Git】新人エンジニア、git pushまでの道](https://qiita.com/yukibe/items/9ef9d54f2e7d53cfb51c)

## Gitでの管理をやめたい

- デイレクトりごと管理をやめる

```
$ rm -rf .git/
```

※これだけGitコマンドではないですが参考までに。

- ファイル単位で管理をやめる

```git
$ git rm ファイル名
```

[git 管理をやめる](https://qiita.com/b4b4r07/items/cac4abd9ae66537e2833)

## ローカルリポジトリの設定内容（ユーザー名、メールアドレス）を変更したい
- 全てのローカルリポジトリに設定を反映する

```git
$ git config --global user.name ユーザー名
$ git config --global user.email メールアドレス
```

`--global`をつけるのがポイント

- 個別のローカルリポジトリに設定を反映する

```git
$ git config user.name ユーザー名
$ git config user.email メールアドレス
```

[gitconfig の基本を理解する](https://qiita.com/shionit/items/fb4a1a30538f8d335b35)

## ローカルリポジトリの設定内容を確認したい

```git
$ git config --list
```

[gitconfig の基本を理解する](https://qiita.com/shionit/items/fb4a1a30538f8d335b35)

## コミット履歴を確認したい

```git
$ git log
```

- コミット履歴を1コミット1行で見たい

```git
$ git log --oneline
```

コミットid（乱数）、コミットの種類、コミットメッセージが1行で表示される。

[git logを使ってコミット履歴を閲覧する方法【初心者向け】](https://techacademy.jp/magazine/10200)
[git log全部入り](https://qiita.com/imudak/items/4a8549b46fe2e509a08c)

## コミット履歴だけでなくHEADやブランチの動きなど細かいところまで確認したい

```git
$ git reflog
```

これは***"Gitでやっちまった時"***に使いますねw
（僕は何度かお世話になりました）

[Git Advent Calendar 201229日目いざという時のためのgit reflog](https://qiita.com/yaotti/items/e37c707938847aee671b)

## ローカルリポジトリのステータスを確認（変更ファイル、追加ファイルがあるかとか）

```git
$ git status
```

[git status -s でちょっと幸せになれる](https://qiita.com/tommy_aka_jps/items/af536a7c20747f99aa42)

## リモートリポジトリの状態をローカルリポジトリに反映したい（最新の状態にしたい）

```git
$ git pull origin リモートのブランチ名
```

`$ git pull origin main`は以下の2つのコマンドの合体↓

```git
$ git fetch origin main
$ git merge origin main
```

まあ、`git pull`を使うケースの方が圧倒的に多いかと。

[サル先生のGit入門](https://backlog.com/ja/git-tutorial/stepup/14/)
[git fetchの理解からgit mergeとpullの役割](https://qiita.com/osamu1203/items/cb94ef9da02e1ec3e921)

## 間違えて実行したpullを取り消したい（merge失敗（コンフリクト）時）

```git
$ git merge --abort
```

実務でdevelopブランチ（開発用）にmainブランチをpullしてしまって焦ったけどこれで解決した...

## 新しくブランチを作成したい

```git
$ git branch ブランチ名
```

## 既存のブランチの名前を変えたい

```git
$ git branch -m 変えたいブランチ名 変更後のブランチ名
```

## ローカルに存在するブランチを一覧で見たい

```git
$ git branch
```

## ローカルブランチを削除したい

```git
$ git branch -D ブランチ名
```
ブランチ名は`$ git branch`で見れる。

[Gitでローカルブランチを削除する](https://qiita.com/hogeta_/items/33d2334c9b1919bd5120)

## 自分が作業しているブランチを移動したい

```git
$ git checkout 移動先のブランチ名

or

$ git switch 移動先のブランチ名
```

## ブランチを新しく作る＆そのブランチに移動したい

```git
$ git checkout -b ブランチ名

or

$ git switch -c ブランチ名
```

このコマンドでは現在いるブランチの内容を元に新しいブランチが作られますので、ご注意ください。

[【Git】あなたが知らない新コマンドswitch/restoreの世界にご招待](https://qiita.com/rebi/items/5a23f8cf904271bb5452)

## ワーキングツリーの修正を取り消したい

```git
$ git checkout .

or

$ git restore .
```

[【Git】あなたが知らない新コマンドswitch/restoreの世界にご招待](https://qiita.com/rebi/items/5a23f8cf904271bb5452)

## リモートリポジトリ（GitHub）のソースをローカルに複製したい

```git
$ git clone リモートリポジトリのURL
```

## ローカルで変更したファイルがあるけどブランチを変えたい（変更分を退避させたい）

- 基本の使い方

```git
$ git stash
```
- メッセージをつけてgit stashする

```git
$ git stash push -m "任意のメッセージ"
```
`git stash save`は非推奨になっているので`git stash push -m`を使用しましょう。

[色々な git stash](https://qiita.com/akasakas/items/768c0b563b96f8a9be9d)

## git stashしたファイルの履歴を確認したい

```git
$ git stash list
```

## 新規追加したファイルもgit stashしたい

```git
$ git stash -u
```

##git stashしたファイルを元に戻したい

```git
$ git stash apply
```
上記のようにオプションなしだと直前の`git stash`が元に戻ります。

[色々な git stash](https://qiita.com/akasakas/items/768c0b563b96f8a9be9d)

## コミット履歴を綺麗にしたい

```git
$ git rebase ブランチ名
```

[git rebaseを初めて使った際のまとめ](https://qiita.com/310ma3/items/e0ec74b47c6c219f2a8b)

## 複数のコミットをまとめたい

```git
$ git rebase -i
```

注意点ですが、まとめる（直前のコミットに統合）ことができるのは**push済み**のコミットです。

[rebase -i でコミットをまとめる](https://qiita.com/takke/items/3400b55becfd72769214)

## 直前のコミットを取り消したい

- コミット履歴は残してコミットの内容だけ取り消したい

```git
$ git revert
```

- コミット自体を取り消してワークツリーの変更も取り消したい

```git
$ git reset --hard HEAD^
```

- コミットだけ取り消したい

```git
$ git reset --soft HEAD^
```

[[Git]コミットの取り消し、打ち消し、上書き](https://qiita.com/shuntaro_tamura/items/06281261d893acf049ed)

## 直前より前のコミットを取り消したい

- n個前のコミットを取り消してワークツリーの変更も取り消したい

```git
$ git reset --hard HEAD~{n}
```

- n個前のコミットだけ取り消したい

```git
$ git reset --soft HEAD~{n}
```

## ファイルの差分を確認したい

```git
$ git diff
```
[忘れやすい人のための git diff チートシート](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)

## 直前のコミット（push済み）のコミットメッセージを修正して再度プッシュしたい

```git
$ git commit --amend -m "新しいコミットメッセージ"
$ git push -f origin 先ほどpushしたリモートブランチ
```

`git commit --amend -m "新しいコミットメッセージ"`を実行した後にコミットメッセージが本当に変わっているか`git log`で確認した方が良いです。

## 他のブランチでした特定のコミットを現在のブランチに取り込みたい

```git
$ git cherry-pick コミットID
```

## 直前のコミットメッセージを変更したい

```git
$ git commit --amend -m "新しいコミットメッセージ"
```

一応`git log`なり`git log --oneline`なりでコミットメッセージが変更されているかは要確認。