GitHubハンズオン 第4回 ～いろいろ取り消し編～

# GitHubハンズオン 第4回 ～いろいろ取り消し編～

本記事は、GitHubハンズオンの第4回の資料です！
過去の記事を読んでいることを前提としていますので、ご注意ください。


##### GitHubハンズオンシリーズ

- [GitHubハンズオン 第1回 〜個人開発編〜](https://qiita.com/segur/items/601277fbbe8cfa08678b)
- [GitHubハンズオン 第2回 〜共同開発編〜](https://qiita.com/segur/items/a3f7b9063829850391c5)
- [GitHubハンズオン 第3回 ～ブランチ運用法編～](https://qiita.com/segur/items/1dd578003da46bddc117)
- GitHubハンズオン 第4回 ～いろいろ取り消し編～ ← 本記事
- [GitHubハンズオン 第5回 ～無視リスト編～](https://qiita.com/segur/items/2de61acfa73ce1eceac9)
- [GitHubハンズオン 第6回 ～巨大ファイル編～](https://qiita.com/segur/items/347345a489a963641306)


# いろいろ取り消したい

操作を間違えることってよくあります！

- ファイルを間違って編集しちゃった！
- コミットメッセージでタイプミスしてしまった！
- 間違えてコミットしてしまったー

間違えた作業を「元に戻したい」ことってよくありますよね？
今回はそういう **取り消し** 作業に焦点を当てた回です！


# リポジトリの準備

[第1回ハンズオン](https://qiita.com/segur/items/601277fbbe8cfa08678b#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%90%8D%E3%82%92%E8%A8%98%E5%85%A5%E3%81%99%E3%82%8B) で作成した **GitPractice** リポジトリを今回も使います！

もし、リポジトリを削除してしまった方は、再作成をお願いします！

Forkを開き、フェッチ＆チェックアウトして、mainブランチを最新にしてください。


# チェックアウト


## ダブルクリックでチェックアウト

[第2回ハンズオン](https://qiita.com/segur/items/a3f7b9063829850391c5#%E4%BB%96%E3%81%AE%E3%83%A1%E3%83%B3%E3%83%90%E3%83%BC%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%A2%E3%82%A6%E3%83%88%E3%81%99%E3%82%8B) では、右クリックでチェックアウトする方法を紹介しましたが、ダブルクリックの方が早いので、紹介します！

mainをダブルクリックすると、mainがチェックアウトできます！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/0c7a8e86-5e22-97f7-a7b0-a384be901282.png)


ブランチ名をダブルクリックすると、そのブランチをチェックアウトできます。

時短テクニックです！


## Checkout Branch: Don’t change

作業ディレクトリを開き、新しいファイルを追加してください。コミットはしないようにお願いします。

`Local Changes` に `(1)` がついていればOKです。


![image5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/d0d60be4-fa9f-e279-072a-2a9a65e92d81.png)


この状態で、別のブランチをチェックアウトしようとしてください。

すると、以下のようなダイアログが表示されます。


![image18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/e41c9c0a-9e7c-5f1b-e6f1-6a6a539052b7.png)


**Don’t change** を選んでチェックアウトすると、作業ディレクトリに追加したファイルは維持されたまま、他のブランチがチェックアウトできます。

ただし、これはいつも必ず成功するとは限りません。

チェックアウトするブランチと、編集内容が競合した場合、以下のエラーが表示されます。


![image16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/b9fb5a31-c9c0-35f9-9856-f31d26170f8f.png)


Local Changesがない状態でチェックアウトするようにしましょう！


## Checkout Branch: Discard

Discardを選ぶとどうなるのでしょうか？


![image27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/5bccd581-b277-e6d0-2e6e-058500f92632.png)


Local Changesにある変更をすべて削除してからチェックアウトします！

**取り返しのつかない** ことになる可能性があるので、何が起こるか理解した上で使いましょう！

（効果をわかって使うのはOKです）

Discardというのは、破棄するという意味の英単語です。

手札（card）を離す（dis）が語源です。


## Checkout Branch: Stash and reapply

Stash and reapplyは使いこなすのが難しいため、今回のハンズオンではとくに実践しません。

Stashは、作業ディレクトリにあるファイル変更を別の場所に退避し、Local Changesがない状態にする機能です。

Applyは、別の場所に退避したファイル変更を、作業ディレクトリに反映して、Local Changesがある状態にする機能です。


# ディスカードチェンジ


## 右クリックでDiscard changes

作業ディレクトリにファイルを追加して、 `Local Changes` がある状態にしてください。

`Unstaged` にファイルがあればOKです。


![image28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/9b25a08c-824d-a0c4-97aa-0df953b2d6b6.png)


`Unstaged` にファイルを **右クリック > Discard changes** をクリックすると、ファイル変更を削除できます。

つまり、ファイルを変更する前の状態に戻せます。

「とあるアイデアを試してみたけど、やっぱりやめた」という場面で、 `Local Changes` がない状態へしたいときに便利です！

ただしこれは、**取り返しがつかない作業** なので、何が起こるか理解した上で使うようにしましょう！


## DeleteキーでDiscard changes

Forkの場合、 `Unstaged` のファイルを選択した状態で、キーボードのDeleteキーを押すと、Discard changesが実行できます！

時短テクニックです！

（Fork特有のショートカットキーなので、他のソフトでは使えないかもしれません。）


# プル

**プル = フェッチ + チェックアウト**


![image23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/f762b00f-5913-edf4-73e3-e6d27b3623db.png)


プルは、フェッチとチェックアウトを連続して実施します！

Local Changesがある状態でプルを実行すると、チェックアウトと同じエラーが発生します。

リモートリポジトリの情報を取得したいだけなら、**フェッチの方が安全** です。


# リセット

コミットを削除したいときに使えるのが、リセットです！

Forkには、3種類のリセットがあります！

非常によく使う機能ですが、**選択を間違えると、取り返しのつかないことになります** ので、十分に理解してから使いましょう！


![image6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/00d5cda1-5e84-5203-58dd-55626a4d8dbc.png)


## Soft Reset / Mixed Reset

作業ディレクトリの状態は維持しつつ、コミットだけ削除したいときに使います。


* **Mixed** は、コミットされてたファイル変更が **Unstaged** に移動します。
* **Soft** は、コミットされてたファイル変更が **Staged** に移動します。

あまり違いはないので、とくにこだわりがなければ、デフォルトの **Mixed を使えば良い**です。


## Hard Reset

コミットを削除して、作業ディレクトリを以前の状態へ戻したいときに使います。

**非常に危険で取り返しがつかない操作なので、機能を十分に理解してから使いましょう！**


# リワード


## コミットメッセージでタイプミスをする

以下のように、コミットメッセージをタイプミスしてしまうことはよくあります。


![image11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/302f41e5-e66c-3196-40ec-a5d92a8b80db.png)


今回はあえてタイプミスをしてコミットしたものをプッシュします。


## コミットメッセージを変更する

修正したいコミットで右クリックして、 **Interactive Rebase > Reword** をクリックします。


![image31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/9bc80d30-3527-90a2-e69e-fbfa998b56df.png)


コミットメッセージを修正して、**OK > Rebase** で修正できます。


![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/0282b7f1-8ab1-290b-545a-527217cf5b9f.png)


これでコミットメッセージを修正できました！

しかし、ローカルリポジトリのブランチしか修正されていません。


![image22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/e9f3a7aa-e1ae-678d-54db-d54a24a51427.png)


## 強制プッシュ

こういうときは、強制プッシュをします。

プッシュする際に、 `Force push` にチェックを入れてから、プッシュしてください。


![image35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/ee5e3e51-3e47-8f01-5598-42938c730400.png)


変更後のコミットで上書きされました。


![image30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221845/c38798b8-dac2-244e-8a5e-3d1aa55296f8.png)


## 強制プッシュのリスク

強制プッシュを利用すると、リモートブランチの内容を強制的にローカルブランチの内容で上書きします。

使い方を間違えると、取り返しのつかないことになりますので、何が起こるか理解した上で使いましょう！


# さいごに

今回はここまでです！おつかれさまでした！

次回は無視リスト編です！引き続きこちらも実践していただけると嬉しいです！

https://qiita.com/segur/items/2de61acfa73ce1eceac9

本記事作成にあたり、以下のページを参考にさせていただきました。ありがとうございました！

- [gitでいろいろ取り消したい](https://qiita.com/tani-shi/items/3419600447292abf6c79)