はじめに
Gitって初めて使うときすごく怖くないですか?
僕は怖かったです。
全ての操作がよく分からないし、他の人の作業の邪魔になるようなことをしてしまったらどうしよう・・・と毎日怯えていました。
そんな人のためにこの記事では、
「これができればGitが使いこなせる!」
とまではいかなくても、
「Git、ちょっと怖くないかも!」
と思えるように、
自分が実際に遭遇したトラブルや、よく遭遇するトラブルを元に、
その対処法を記載しこうと思います。
なお、Gitを利用するときの大まか流れは、Gitこわい①をご覧ください。
トラブル①:なんかブランチがぐちゃぐちゃになっちゃった!
対処法
作業ツリーやローカルのブランチはあなたのPCの中にしか存在しないので、
作業ツリーを変更したとしても、
ローカルブランチにコミットしたとしても、
ローカルブランチに別のブランチをマージしたとしても、
とにかくプッシュしない限りは、リモートブランチがぐちゃぐちゃになって、他の人に迷惑がかかって取り返しのつかないことになる...ということはないです。
(自分は最初、プルするときもマージするときもビクビク怯えていました。)
もし、「なんかマージしたら作業ツリーがぐちゃぐちゃになっちゃったよ~」というときは、
「この状態に戻したい!」というコミットを選んで、リセット(種類:ハード)を行えば、とりあえず元に戻ります。
ただし、作業ツリーの変更内容とローカルブランチにコミットした内容も消えてしまうので注意してください。
作業ツリーやローカルブランチに保存しておきたい変更内容がある場合は、
スタッシュしておくか、対象のファイルだけ別フォルダに保存してバックアップを取っておくと安心です。
また、リセット先のコミットを選ぶときは、リモートブランチの最新コミットよりも前のコミットは選ばない方がよいです。
プッシュしたときに先祖返りしてしまう可能性があるためです。
トラブル②:detached headって出てきた!
「Gitを色々いじってたら、detached headって表示されちゃった!」ということが、
(特に最初のうちは)よくあります。
対処法
ありがちなのが、「特定のコミットIDを直接指定してチェックアウトを行う」 という操作でdetached headになってしまうケースです。
チェックアウトは必ずブランチ単位で行うようにしましょう。
この状態で作業してコミットしていくと、ブランチが存在しない状態でコミットを積み重ねていくことになります。これは土台がない状態で石を積み上げているようなもので、せっかく積み重ねてきたコミットが無駄になってしまう可能性があります。
detached headになってしまったら、
ブランチを指定してチェックアウトを行えば元に戻ります。
作業ツリーに特に変更がない場合は、最新のコミットを指定してリセットしてもよいです。
detached headがどういう状態なのかという説明は、補足に記載しておきます。
トラブル③作業中に他の人が作業中のリモートブランチにプッシュしちゃった!
対処法
これはトラブルでも何でもないのですが、最初のうちは焦りますよね。
自分がプッシュを行う前に、プルを行えば大丈夫です。
もし作業中の変更箇所と、他の人がプッシュした箇所が被ってしまっている場合は、
プルした後に競合を解決すればOKです。
補足:detached headとは
detached head状態を理解するには、逆にdetached headではない状態(正常な状態)を理解すると早いです。
正常な状態
headがブランチを指し、ブランチがコミットIDを指している状態です。
head → ブランチ → コミットID
※headというのは、あなたの現在地を指すものです。
これに対して、detached headは以下のような状態です。
detached headな状態
headが直接コミットIDを指している状態です。
head → コミットID
この状態でコミットを積み重ねてしまうと、積み重ねたコミットを記録するブランチがないため、ブランチを変更したタイミングで全てのコミットが無かったことになってしまいます。
コミットを行う際は、detached head状態になっていないことを確認するようにしましょう。