トラブルケース別Gitコマンド

# Gitコマンドのケース別の解決方法をまとめる
自分用に業務効率のため備忘録的にまとめます。
影響が大きいコマンドも多数含まれているので実施の際は自己責任 or 周囲のアドバイスを仰いでください。
今後も定期的に追加していきます。

※障害時やプロダクションの利用時には個人判断せずリーダーの指示やアドバイスを仰いでください。

## 1. 直前の作業を元に戻す
### コミット
```
#直前のコミットまで元に戻す
git reset --soft HEAD^

#コミットIDを指定して元に戻す
git reset --soft [コミットID]
```
### ステージング（インデックス）
```
#直前のコミットまで戻す
git reset HEAD^
git reset --mixed HEAD^

#直前のコミットまで指定したファイルのみを戻す
git restore --staged [ファイル名]
git reset　HEAD [ファイル名]
git reset [ファイル名]

#コミットIDを指定して戻す
git reset --mixed [コミットID]
```
### ワーキングツリー（作業ディレクトリ）
```
# ローカルのmasterを、リモート追跡のmasterに強制的に合わせる
git reset --hard origin/master

# 直前のコミットまで戻す
git reset --hard HEAD^  

# 直前のコミットまで指定したファイルのみを戻す
git restore  [ファイル名] 
git restore --worktree [ファイル名]
git checkout HEAD [ファイル名]
git checkout [ファイル名]

# コミットIDを指定して戻す
git reset --hard [コミットID]

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

git resetコマンドの場合、--mixed、--hard、--softのオプションを使用すると
引数には[コミットID]しか指定できません。

## 2. 余計なファイルをコミットしてignoreしたい
```
# Gitの管理対象から削除する
git rm --cached [ファイル名]
echo '[ファイル名]'　>> .gitignore

# ファイルを履歴からも消す
git filter-branch -f --index-filter 'git rm --cached -rf --ignore-unmatch [ファイル名]' HEAD
```

## 3. 直前のコミットをなかったことにしたい
```
git revert [コミットID]
```
## 4. 別のブランチにコミットした
```
git branch [別ブランチ名]
git reset --hard HEAD^
git switch [別ブランチ]
```
## 5. コミットを間違って消した

```
git reflog
git reset --hard [コミットID] #git resetする前のHEADを指定
```

## 6. コミットを間違って消した

```
git reflog
git branch [ブランチ名] [コミットID] 
```

## 7. コミットメッセージを間違えた

```
git commit --amend
```
Github等のリモートリポジトリに取り込まれていないことが前提。

## 8. マージしたけどコンフリクトが起きて元に戻したい

```
git reset --hard ORIG_HEAD
```
直前にマージした内容を元に戻してマージをなかったことにできる。

## 9. 違うユーザー名でコミットしたので修正したい

```
# 以下でユーザー名を変更する
.gitconfig
.git/config

# HEADのユーザー名/メールアドレスを変えたいとき
git commit --amend -m"コミットメッセージ" --author = "user.name <user.email>"
```
自宅・会社等で別ユーザーで作業している際によく起きる。

## 10. ブランチ名を間違えた

```
git branch -m [ブランチ名]
```

## 11. 急な緊急対応で一時的に作業を差し込む

```
#パターン1　：その時点で作業が完了していればコミットする
#git commit -m"メッセージ"

#パターン2　：コミットできなければ一時避難させる
git stash

#ブランチを切り替えて作業、完了後に元に戻す
git stash pop
```

## 12. 誤ったコミットをリモートにプッシュした時

```
#誤ったブランチを削除 ex. 自分がプッシュしたfeatureブランチ等
git push origin :[ブランチ名]

#自分のローカルのコミットを元に戻す
git reset --hard [コミットID]

#改めて再度プッシュする
git push origin [ブランチ名]
```

## 13. リリースしてバグがあったのですぐ切り戻しを行う

```
#コミットログを確認してマージコミットを見つける
git log

#マージコミットを指定して打ち消しコミットを作る
git revert -m 1 [マージコミットID]
```
この-mは--mainlineの略でparent-numberを指定。
このparent-numberには基本的に1か2を指定。git showをした時にブランチに名前に数字が付与されている。
大体マスターブランチが１。

## 14. 13の続き。切り戻したあとに再度マージする
```
#13の打ち消しコミットを打ち消す
git revert [打ち消しコミットID]

#再度マージする
git merge
```

リ　バーとは一度コミットした内容の逆コミットを作成するため、コミットした履歴は残存する。そのため、そのままマージしようとしても『マージ済み』という形になる。

ただし、本ケースは同じbranchを用いて再度マージすることを想定。別branchの場合は、そのままマージ可能。

## 15. 【要確認】実施する前に注意が必要なコマンド
『プッシュ済み』commitへの以下のコマンド実行は非常に危険を伴うので注意が必要！！
-f など強制コマンドは絶対にNG。

```
#マージコミット削除等
git reset --hard

#コミット履歴を綺麗にしようとしてマージ済みコミット履歴等を削除
git rebase -i

#マージコミットを消去
git revert [マージコミットID]

#プッシュ済みコミットを修正　※注
git commit --amend
```
注:git commit --amend で変更したコミットはハッシュ値が変更されるので、リモートにあるコミットとローカルとの整合性が取れなくなってしまう。

##参考リンク

https://www.youtube.com/watch?v=hUYUld6aEmc&list=PLs3eD4QT7ow6S2HfiINsWeTyeiIPg5AuH&index=6

https://www.r-staffing.co.jp/engineer/entry/20191129_1

https://qiita.com/ritukiii/items/74ee3274c3f218511a0c

https://qiita.com/muran001/items/dea2bbbaea1260098051?utm_content=buffer13e76&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer