この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。
皆さんはgitを使っていてミスをしてしまうことはありませんか?
ミスとまではいわずとも「あの変更いらなかったな」とか「間違えてコミットしちゃった」とかはあると思います。
それらをなくすために一番大事なのは「確認」です。
確認をより確信あるものにするために個人的によく使うコマンドやオプション、
ミスをしてしまったときになんとかするものを紹介しようと思います。
git diff –cached
git diff
はほぼ必須の確認コマンドだと思います。
現在ブランチの変更した差分を表示してくれるので、僕はcommitする前には必ず確認しています。
ですが、先にaddをしてしまうと差分を表示してくれません。
--cached
オプションをつけることによって、addした後でも差分を表示できます。git diff
で確認し忘れたときに、いちいちgit reset HEAD
してチェックするのはめんどくさいですよね。
git add test.txt
git diff
git add test.txt
git diff --cached
diff --git a/test.txt b/test.txt
index e6a6914..2b70263 100644
--- a/test.txt
+++ b/test.txt
@@ -1,5 +1,5 @@
....以下省略
git status -uall
git status
だけ打っても新しく追加したディレクトリ以下のファイルは表示してくれません。-uall
オプションをつけると全部追跡してくれるので確認することができます。
git status
On branch develop
Untracked files:
(use "git add <file>..." to include in what will be committed)
testDir/
nothing added to commit but untracked files present (use "git add" to track)
git status -uall
On branch develop
Untracked files:
(use "git add <file>..." to include in what will be committed)
testDir/a.txt
testDir/b.txt
testDir/c.txt
nothing added to commit but untracked files present (use "git add" to track)
git log –name-status
個人的に一番使うlogのオプションです。
下記のようにそのコミットで変更されたファイルが出力され、git status
+ git log
のようなイメージで使えます。
git log --name-status
commit 49d8d9c4ff2e3bdfc7fd4e18eb3fa9e5507ed89b
Author: ziguzagu
Date: Tue Jul 4 16:16:40 2017 +0900
テストファイル追加
A test_00.txt
commit 53c55b128356aa960739b5f999b9917ed63a9784
Author: ziguzagu
Date: Tue Jul 4 16:10:10 2017 +0900
hugaクラスにメソッド追加
M app/models/hoge.rb
git reflog
ローカルで行ったcommit, merge, resetなどのログを見ることができます。
マージしていないブランチを消してしまったり、git reset --hard
などで戻しすぎてしまった場合などでも履歴を見れるので、
任意の時点まで戻すことができます。
git reflog
36336b7 HEAD@{0}: commit: xxxx => cccc
331f0b6 HEAD@{1}: commit (merge): Merge branch 'change_text' into develop
4d02134 HEAD@{2}: checkout: moving from change_text to develop
510169f HEAD@{3}: commit: bbbb => cccc
1ef1996 HEAD@{4}: checkout: moving from develop to change_text
4d02134 HEAD@{5}: commit: bbbb => aaaa
1ef1996 HEAD@{6}: commit: テキスト作成
3057744 HEAD@{7}: checkout: moving from master to develop
3057744 HEAD@{8}: commit (initial): 最初のコミット
git reset --hard 4d02134
上記の例ではcommit: bbbb => aaaa
のブランチまでを戻すことができますが、
このやり方の注意点として、以下の点が挙げられるので使用するときは注意しましょう。
- 現在編集中のファイルは消えてしまう
- 作業していたブランチを問わずにもどせてしまう
終わりに
ミスをしないための「確認」についての記事になりましたが、
もしミスをしてしまったときの対処法も知っておけば、より勇気を持って動けると思います。
自分はgit reflog
でhash値を調べられることを知ってからはmergeに対する恐れは減りました。
最終的には確認の方法を知っていても自分が確認を忘れたり、
間違っているものを正しいと思い込んでたりしたら意味がないのでコマンド以外に
他の人にチェックしてもらえたりするとさらにいいですね。