> For the complete documentation index, see [llms.txt](https://np-complete.gitbook.io/cho-practical-git/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://np-complete.gitbook.io/cho-practical-git/trouble-shooting.md).

# 困った時は

まず、困った時とはどういう時でしょうか。 Gitで重要なのは、**今のブランチの状況を完全把握**しておくことです。 今どのブランチにいて、*master* との分岐点はどこで、どんなコミットが伸びてて、remoteはどうなってて、そういう感じの状況を脳内で可視化できなければいけません。 もしそれができてない場合、**たぶん大丈夫・・・**&#x3068;いう楽観論でそのまま進むと、多くの場合**大事故**になります。

## gitk

今どういう状況か把握できてない場合、先に進まず現状把握を最優先します。 `gitk` という、コミットツリーをGUIで表示してくれるツールがあります。 まず、現状のブランチの状態やコミットを知るために `gitk` を使いましょう。

コミットツリーが表示され、ブランチやタグが指している場所がひと目で把握できます。 それぞれのコミットの内容も確認することができます。 いろいろなGitの操作もでき、個人的には**cherry-pick**はこのツールで行うのが便利だと思います。

## git reset

`git reset` は現在のブランチが指すコミットを、任意のコミットに変更するコマンドです。 例えばブランチを切らずに *master* に間違ってコミットしてしまった場合、このように修正することができます。

```
$ git reset origin/master
```

*master* ブランチが *origin/master* と同じになり、さっき間違えてコミットした変更点が**未ステージの状態**で残ります。

他にも、例えばいくつかコミットを重ねたものの、一部の変更点を抜いてプルリクエストしたい場合などにもよく使います。

```
$ git reset master
$ git add -p
# 必要な部分だけステージ
$ git commit
$ hub pull-request
```

こうすると、必要な部分がプルリクエストされ、抜きたかった部分は未ステージ状態で残ります。

`--hard` のオプションをつけると変更点も全部ぶっ飛ばしてくれて、綺麗サッパリ元の状態に戻ります。

## cp

言わずと知れたコピーのコマンドです。 わけがわからない状態になった時、一番簡単に頼れるのは**Gitの機能ではなく慣れたOSの機能**です。 いったん変更したファイルを別ディレクトリに退避し、 `git reset --hard origin/master` を実行すれば、とりあえず**何もかもが解決**します。
