2013年7月11日木曜日

目からうろこの?Gitトラブル対処術

こんにちはNashioです.

Git講座第3回ということで,今回が最終章トラブル対処術講座になります.
Gitを使っていると時々トラブルが起こることがあります.
その時の対処法をいくつか紹介して行きたいと思います.

Git講座をまだ見ていないという人はGit講座入門編Git講座中級編を見てくださいね.

Gitトラブル対処術

git status編

まずGitを使っていて真っ先に直面するトラブルとして,「なんでうまく~できないの???」ってやつですね.
特にPushがうまくいかないケースが多い気がします.
このトラブルに関しては,正しいやり方をしていれば起こらないはずなんですが,ついうっかりしていて起こってしまうことがあります.

こんな時に便利なのが,statusコマンドです.
使い方は以下のとおり
$ git status
このコマンドを実行することによってその名の通り現状のステータス(状態)を確認することができます.
なにもしていない状態ならば以下のような表示になります.
$ git status
# On branch master
nothing to commit (working directory clean)
英語を見ての通り(頑張って読みましょう.英語は大事です)現在どこのブランチにいるのか,コミットの状態は,作業はしているのかが分かります.

では,新しいファイルを作成するとどうなるでしょう
$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       hoge
nothing added to commit but untracked files present (use "git add" to track)
こんな感じになります.英語を読んでみると「git addしろ」みたいなことが書いてあります.なのでaddをしてあげましょう.

このような感じでコミットをしてないときはコミットしろと表示されます.
このコマンドを使えば何をしなければいけないかがわかるので便利です.

git reset編

次にあるのは「変更作業してたけど,うまくいかないから元に戻したい」というケースですかね.
これに関してはresetコマンドが用意されています.

オプションがいろいろあってややこしいのでじっくり見て行きましょう.

まず知っておかなければならないのがGitの作業履歴は3層構造で管理されているということです.
最後にコミットされた位置を記憶しておくHEAD,変更点を管理するインデックス,変更を行うワーキングツリーがあります.
上の図は最後のコミットから何もさぎょうをしていない状態の図になります.
何もしていないのでワーキングツリー,インデックス,HEADは同じ場所を示しています.

この状態から変更をするとワーキングツリーが移動し,addをするとインデックスがワーキングツリーと同じものになります.

上の図が変更をした際の動きです.
上の図が変更後addをしたものです.commitの-aオプションはインデックスとHEADをいっぺんに移動しちゃうオプションなので何気なく使っていた人はこのへんがわかりにくいかもしれません.

ここまではGitの内部的なお話でした.
ここからはresetコマンドのオプションがどのようなものなのかについてお話します.

resetコマンドには主に使われるオプションとして--soft,--mixed(または未指定),--hardがあります.
それぞれの動作を上記の内部的なお話をもとに解説していきます.

まずは--softオプションです.
コマンドは
$ git reset --soft HEAD
で実行されます.
動作としては,HEADをHEADに移動し,ワーキングツリーとインデックスはそのままというコマンドです.

察しの良い人は気づいていると思いますが,このままのコマンドではなにも変更されませんw.
--softオプションはHEADの位置を更に前に戻すときに使われます.
使い方は,
$ git reset --soft HEAD~
このようにします.
HEADの後ろに付いている”~”の数によってどこまで戻るかを示します.
1つ前のコミットの状態なら1つみたいな感じですね.

主に前のコミットを取り消したいときなどに使います.

続いて--mixed(または未指定)オプションです.
コマンドは
$ git reset (--mixed) HEAD
で実行されます.
動作としては,HEADとインデックスをHEADに移動し,ワーキングツリーはそのままというコマンドです.
addを取り消したいときなどに使います.

--softの時と同様にHEADの後ろに”~”をつけることによってその位置まで戻ります.

最後は--hardオプションです.
コマンドは
$ git reset --hard HEAD
で実行されます.
動作としては,HEADとインデックスとワーキングツリーをHEADに移動するコマンドです.
完全に前のコミット状態に戻ります.

変更した黒歴史をなかったコトにする時などに使います.

他の時と同様にHEADの後ろに”~”をつけることによってその位置まで戻ります.

resetコマンドは動きを理解することが少し大変ですが便利なので使ってみましょう.

git stash編

最後は「やべ,ブランチ切る前に作業始めちゃった」時の対処法です.
そんなときはstashコマンドを使いましょう.

stashコマンドはワーキングツリーの状態をスタックに一時的に保存するものです.
使い方は,
$ git stash
これでワーキングツリーの内容がスタックに保存されます.
あとはブランチを切り,ブランチに移動後
$ git stash pop
をすることでワーキングツリーの内容が戻ってきます.やったね

おわりに

今回はトラブルにあった時の対処術について紹介をさせて頂きました.
しかしながら紹介したコマンドの使い方はこれだけではありませんし,トラブルもこれだけではありません.
ですがここまでお付き合いいただけた皆さんなら,もう自力でトラブルに対応出来るようになっているはずです.

3回に渡るGit講座を通じてみなさんのGitライフが有意義なものになっていただけると嬉しいです.

0 件のコメント:

コメントを投稿