怖くないgit reset
git reset について
git reset... 怖い!!!
どのサイトに行っても, git resetは操作がログに残らないので, 慎重に!!
といった書き込みが多く, 少しgit reset
恐怖症になっていた.
そこで改めてgit reset
について再勉強した.
参考サイトから大事だと思う部分をpickupさせていただきました. 先人様様です.
git reset についてもまとめてみる - murankの日記
resetは何を操作しているのか.
それは, working tree
とindex
とhead
である.
対象 | 説明 |
---|---|
head | 最新コミットを表す代名詞 |
index | Addされたファイルを記憶する領域 |
working tree | 作業中のファイルを記憶する領域 |
操作対象を決める --soft と --hard オプション
resetには--soft
と--hard
というオプションがある.
これは, どの操作対象をresetするかを決めるオプションである.
オプション | HEAD | index | working tree |
---|---|---|---|
--soft | ○ | ||
no option | ○ | ○ | |
--hard | ○ | ○ | ○ |
つまり,
git reset <何を戻す?> <どこまで戻す?>
というコマンドである.
git resetの動作
何となく, resetの機能は掴めてきた.
とは言っても, 実際にどのように動作しているのかイメージしづらい.
ここを見ると, head, index, working treeの動きが視覚的に見てわかりやすい.
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 playやappleのapp store的に色んなソフトウェアを配信するためのソフトウェアととらえて問題ないと思う(少なくとも僕はそれくらいの理解で留まっている)。
細かく見ると, ソフトウェア開発にはバージョンが大きくかかわるのでかなり細かく管理されている。だから一緒というにはかなり無理があると思うが...
バージョン管理ソフトは 例えば, linuxならば yum, apt-getあたりが有名だし
macならば macportとかhomebrewが有名。
ぼくはmacユーザでなおかつミーハーなのでhomebrewが大好き。 依存関係あたりの解決が楽だし最近はbrew関連のエントリが多いので管理も楽。
この前先輩に聞いた話によるとlinuxにもbrewがあるらしい。。。
その名もlinux brew
。
まんまだよね。
linux brew
これはapt-getでインストールする。 linuxbrewを入れるエントリはここがわかりやすかった.
ここで少し躓く。
mintを入れたばっかりの僕はapt-get update
, apt-get upgrade
を繰り返してから上記エントリのapt-get installを実行したら通った。
...あと, このエントリのコマンド, ちょっと綴りがちがうっぽい... だから, コマンドは公式を参照しよう。
って感じで簡単にlinuxbrewが入りました。 linuxでもmacでもbrewが使えると移行が簡単になりそうだし、 胸が高鳴るね。
windows8にvirtualboxでmint17をインストール
linuxで環境構築が必要だったためvirtualboxでmint17を入れた。
プロキシ周り, 容量周りで躓いたのでメモ。
容量周りに関して
結果から言うと、インストールは問題ないのだが
インストール後の容量が足りな過ぎてこけた。
デフォルトでは8GBのストレージで仮装ディスク容量を確保するのだが、 それではapt-get upgradeをかけただけで容量不足になった。
インストール後にストレージを拡張することもできるだが パーテーション周りのツールが使いづらかったので インストール時に最初から25GB程度ストレージを確保すべきだとおもう。
mint導入はここを参照した。
プロキシ設定に関して
このブログが秀逸。
bashrc(bash_profile)で環境変数http_proxyを通しても
aptは読み込んでくれないらしく躓いた。
sudo vi /etc/apt/apt.conf.d/01proxy
の01
の数字は特になんでもよいっぽい。
今後の目標として, とりあえず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)
みたいなクエリでヒットするようになればいいなー...
それでは.