See the Elephant

1992生まれのプログラマが書くエンジニアブログ

怖くないgit reset

git reset について

git reset... 怖い!!!

どのサイトに行っても, git resetは操作がログに残らないので, 慎重に!! といった書き込みが多く, 少しgit reset恐怖症になっていた.

そこで改めてgit resetについて再勉強した.

参考サイトから大事だと思う部分をpickupさせていただきました. 先人様様です.

git-resetは結局何を戻すのか - Qiita

git reset についてもまとめてみる - murankの日記

resetは何を操作しているのか.

それは, working treeindexheadである.

対象 説明
head 最新コミットを表す代名詞
index Addされたファイルを記憶する領域
working tree 作業中のファイルを記憶する領域

操作対象を決める --soft と --hard オプション

resetには--soft--hardというオプションがある. これは, どの操作対象をresetするかを決めるオプションである.

オプション HEAD index working tree
--soft
no option
--hard

つまり,

git reset <何を戻す?> <どこまで戻す?>

というコマンドである.

qiita.com

git resetの動作

何となく, resetの機能は掴めてきた.
とは言っても, 実際にどのように動作しているのかイメージしづらい.
ここを見ると, head, index, working treeの動きが視覚的に見てわかりやすい.

d.hatena.ne.jp

git resetを使う場面をケース別に考える.

1 : 間違えて必要のないファイルをindexに追加してしまったのでindexを消去したい. しかし, working treeを消したくない場合.

# indexをHEADの状態に戻す(headは同じ場所を指す).
$ git reset HEAD

2 : 今のコミット上で編集済みのworking tree, indexがある.この2つを保持したまま, 直前のコミットに戻りたい.

# headだけを直前のコミットに戻す.
$ git reset --soft HEAD^

3 : 一度全てを今のコミットの初期状態に戻したい!

# head, index, working treeをHEADの状態に戻す
$ git reset --hard HEAD

4 : 直近のコミットは致命的なバグを含んでいる! n個前のコミットに全てを戻そう!!

# head, index, working treeをn個前のコミットに戻す

$ git reset --hard n個前のコミットのhash値

例えば, コミットした後に直前のコミットにミスが含まれていることに気づいた場合,ケース2で対処できる.

# index, working treeを保持したまま, 直前のコミットに移動
$ git reset --soft HEAD^

# 新しくコミットする
$ git add .
$ git commit -m "replace commit"

しかし, これをやると ログに編集作業が残らない .

git では編集ログはわかりやすく残すことが流儀とされているので, ログが残らない ことはタブーらしい.

だから, git resetは云々... って言われているみたい.

まとめ

理解すれば, git resetもそれほど怖くないとわかった.
あと, git reset でやらかした場合は, git reflogで全ての編集作業を辿れるので,このコマンドは覚えておいたほうがいいと思う.

以上, git resetについて簡単にまとめた.

gitのreset / rebase / revertがいまいち理解できてなかった件について

git reset / rebase / revert... 何が違うの?

gitは過去のコミットを自由に編集できることは知っていたけども,
いまいち理解できていなかった.

ちょっと触ってなんとなく感覚をつかんだのでメモ.

今後詰まったときのために, コマンド早見表でも書いておこう.

やりたいこと 適正コマンド
ある地点のコミットまで完全に歴史を消して戻りたい! reset
あるコミットだけをなかったことにしたい!(ログは残す) revert
複数のコミットを1つのコミットとしてまとめたい!(ログ残らない) rebase

なぜかgemが環境変数http_proxyを読んでくれない理由

問題発生!!!

$echo $http_proxy
http://my.proxy:port/

$sudo gem install ***
...(don't work)

がプロキシを通らない!!!

この理由がどっかのサイトに書いてあった.

sudoすると, bashrc(zshrc)を読まない.  

つまり, bashrc(zshrc)で設定している環境変数は読み込まれない。
と, いうことはhttp_proxyが設定されない!
つまりプロキシ設定がなされない!

ということらしい。
sudoするときはこれに気を付けたい。

mint17にbrewを入れる


パッケージ管理ソフトの話

世の中にはいろいろパッケージ管理ソフトがあるよねー。

パッケージ管理ソフトっていうとちょっとわかりづらい。 語弊や誤植を恐れずに言えば、google playappleapp store的に色んなソフトウェアを配信するためのソフトウェアととらえて問題ないと思う(少なくとも僕はそれくらいの理解で留まっている)。

細かく見ると, ソフトウェア開発にはバージョンが大きくかかわるのでかなり細かく管理されている。だから一緒というにはかなり無理があると思うが...

バージョン管理ソフトは 例えば, linuxならば yum, apt-getあたりが有名だし

macならば macportとかhomebrewが有名。

ぼくはmacユーザでなおかつミーハーなのでhomebrewが大好き。 依存関係あたりの解決が楽だし最近はbrew関連のエントリが多いので管理も楽。

この前先輩に聞いた話によるとlinuxにもbrewがあるらしい。。。

その名もlinux brew。 まんまだよね。

linux brew

これはapt-getでインストールする。 linuxbrewを入れるエントリはここがわかりやすかった.

qiita.com

ここで少し躓く。
mintを入れたばっかりの僕はapt-get update, apt-get upgradeを繰り返してから上記エントリのapt-get installを実行したら通った。

...あと, このエントリのコマンド, ちょっと綴りがちがうっぽい... だから, コマンドは公式を参照しよう。

Linuxbrew

って感じで簡単にlinuxbrewが入りました。 linuxでもmacでもbrewが使えると移行が簡単になりそうだし、 胸が高鳴るね。

windows8にvirtualboxでmint17をインストール


linuxで環境構築が必要だったためvirtualboxでmint17を入れた
プロキシ周り, 容量周りで躓いたのでメモ。

容量周りに関して

pc-karuma.net

結果から言うと、インストールは問題ないのだが
インストール後の容量が足りな過ぎてこけた。

デフォルトでは8GBのストレージで仮装ディスク容量を確保するのだが、 それではapt-get upgradeをかけただけで容量不足になった。

インストール後にストレージを拡張することもできるだが パーテーション周りのツールが使いづらかったので インストール時に最初から25GB程度ストレージを確保すべきだとおもう。

mint導入はここを参照した。

sstea.blog.jp

プロキシ設定に関して

このブログが秀逸。

garbagetown.hatenablog.com

bashrc(bash_profile)で環境変数http_proxyを通しても aptは読み込んでくれないらしく躓いた。
sudo vi /etc/apt/apt.conf.d/01proxy01の数字は特になんでもよいっぽい。

今後の目標として, とりあえずgitが動くようにしてlinuxbrewが動けばそれでいいかな...

gmailで既読後に自動で受信トレイからアーカイブする

既読したメールが自動でアーカイブできればいいなぁ・・・

そんな願いを叶えてくれるのが, google app script

うちのGMailはこうなっている(2014年完全版) を参考に,
というか丸パクリしてgasをgmailに導入した.
archiveReadMailがその内容.

トリガの起動がいまいちわからなかったので, ここを参考にした.
Gasでgmailをもっと自動化してみる

これでうちのgmailが5分おきに, 受信トレイを走査してアーカイブするようになった. あと, これならば例外的に受信トレイに残ったメールも全てのメールに勝手にアーカイブされることがないのが素晴らしい.

gas便利だなぁ...

gmailで連絡先グループからの連絡をラベル付けする方法


gmailのフィルタ機能を調整していて, 躓いたところに対しメモ.

グループからの連絡をラベルづけしたい!!!

研究室のメンバーからの連絡を"lab"としてラベル付けしたい, と思い
googleさんを信じて, 以下のクエリを入力.

From:(group:lab)

... まぁ動かないよね.

調べてみると

googleのフォーラムにたどり着く. 連絡先のグループ別にラベルを貼るフィルタを作りたい。
要約すると, fromにgroup名を打つとメンバのアドレスは補完入力されるけど, グループ名で指定することはできない そうだ.
皆さん考えることは同じようだ.

#fromフォームに入力
From:lab  #labの部分は任意のグループ名

と入力するとメンバーの連絡先が連続でずらっと入力される.

"松本" <hoge@ac.jp>, "君田" <huga@ac.jp>, ...

よし出た!と思い, フィルタを作成しようとすると,
指定された検索条件が長すぎます。詳細検索条件を短くしてください。
と怒られてしまう. どうやら名前が無駄ならしい.

エディタを使った置換でゴリ押し

しかたがないので, エディタで置換を行い以下の形まで持って行った.

from:(hoge@ac.jp OR huga@ac.jp OR ...)

これで対処できた.

このサイトを参考した.
この手の置換は正規表現を使うと, 楽に置換ができる.
vimユーザはs/\v regex //gとすると一般的な正規表現を使えるようになるので便利です.

使用した正規表現. 
# アンダースコアは半角スペース
".*"_< → 空文字   # "名前"_< を消す
>      → 空文字   # > を消す
,      → _OR_    # ,をORに置き換え

もし今後, グループのメンバーが変化した場合この方法だと毎回更新しないといけないのでかなり面倒くさい. かといって, google app script書くのも面倒くさい...

From:(group:lab)

みたいなクエリでヒットするようになればいいなー...

それでは.