garasubo's note

(´・ω・`)

Git Pullをrebaseで行う

| Comments

複数人でリモートのレポジトリをいじるとリモートの変更を git pullでひっぱって来ないといけないわけだが、 git pullはremoteの変更をgit fetchして取ってきてから、 その変更を自分の追跡ブランチにmergeをするということをしている。
そのため、場合によっては無駄にマージコミットができてしまい、気が分岐しているように見えて、 ログの参照性をさげてしまう。
そこでpull時にmergeの代わりにrebaseを使い、そのようなことを避けるオプションがある。

git pull --rebase

見えないチカラ: 【翻訳】あなたの知らないGit Tipsによると、

git config --global pull.rebase true

としてあげると全追跡ブランチでpull時はオプション無しでrebaseを使うようになる。(Git 1.7.9から)

ただし、rebaseでpullしてくると

1. 追跡ブランチからブランチを切る
2. そのブランチに対して追跡ブランチにマージコミットを打つ(その間、追跡ブランチには何もコミットしていない)
3. 追跡ブランチでpull

とすると、マージコミットが消えて、その追跡ブランチからブランチを切ったという情報が消えてしまった。
これはマージコミットをリバートするときはどちらを残すか明示的に指定しないといけないように、 どちらが本来の流れか分からなくなるからか?
にわかだからよくわかりません><

Gitでのミスリカバリー

| Comments

マージコミットをリバート

うっかり間違ったブランチで—no-ffでmergeを打ってしまった場合、 revertでそのコミットの変更を消すコミットをつくることができる。
ただし、このときどちらのブランチを残すのかという事を指示してあげる必要がある。
git logなどで、その時のマージコミットのログを見ると、どのコミット同士をマージしたのかということが書いてある。
それを見てどちらを残すかを-mオプションで指定する。

詳しくはここの80ページ目あたりが親切。

リモートレポジトリに対してリセットをする

Gitでリモートリポジトリを巻き戻す – @tmtms のメモを参考にした。

まず、リセットしたいレポジトリのバックアップレポジトリをつくる。
これはいざ間違えた時の対策。

git push origin tar_bak

つづいてgit reflogして戻したい地点を見つける

******* HEAD@{0}: hoge
******* HEAD@{1}: hogehoge
******* HEAD@{2}: hogehogehoge
******* HEAD@{3}: hogehogehogehoge
...

hogehogehogeの地点まで戻りたいとして、

git push -f origin HEAD@{2}:tar

とすればよい。こうすると、origin/tarの指すコミットが移動する。

他の人にも影響することなので、やるときは注意。

Ubuntuのgccでリンクのオプションが無視される問題について

| Comments

Ubuntuを10.04から12.04にアップデートした際、 gccで-lで指定したファイルが全然リンクされないという問題があった。 たとえば、

gcc -lm main.c

として、main.cで普通にmathライブラリを使うようなファイルを書くと、 そんな関数の実体見つからんよ、と怒られていた。

ちょっと検索したらこんなの見つかった。
Ubuntu日本語フォーラム / math.h へのリンクがうまくいかない
どうやら、Ubuntuのあるバージョンからgccの—as-neededというオプションが デフォルトで有効になるような親切設計になったらしく、 これがあると-lのオプションはソースファイルの後に置かないと無視されるようになるらしい。 なので、

gcc main.c -lm

とすればいいのだが、makeの暗黙ルールでLDFLAGSはソースの前に置かれるようなっているので、なんかルール書き換えるのは癪。

そこで、LDFLAGSに

-Wl,--no-as-needed

というオプションを追加してやると、—as-neededオプションが無効化された。

しかし、なんでこんなオプションをデフォルトで有効にしてしまったのか。

Gitでのbranchでの開発

| Comments

最近何かとgitを使うことが多くなったので、branchの作り方から mergeの仕方まできちんと学ばなきゃなと思い立って色々調べた。

リモートブランチの扱い方

“gitのリモートブランチを使って作業を行う流れのメモ – 那由多屋 開発日誌”

merge

ブランチつくったら、あとでマージしなきゃいけない。 実はgitのマージにはいくつか種類があるらしく、これはきちんと把握しておく必要が有りそう。
“図で分かるgit-mergeの—ff, —no-ff, —squashの違い – アジャイルSEを目指すブログ”
これを読む限り、基本的には—no—ffでマージコミットをきちんとつくるのが あとでログ見返すときにも良さそうな気がする。

うっかりマージミスした時の対処。

commitを取り消すコマンドであるresetは使い方を誤るととんでもないことになるので気をつけなければならない。 このへんが参考になりそう。
git で merge をとりけす法 – ToMmY Makes Love with Codes
~nabeken/diary/ : git で間違って merge してしまった場合 (fast forward でマージしてしまったのを取り消したい)

rebaseコマンドについて

誰かがrebaseコマンド使えない奴はgit使えるうちに入らないと言っていたので調べた。 コミットに対して直接変更を加えるので危ないことは確かっぽいが、 小さなmergeをしたい時とかはこっちのほうが良いのかもしれない。 少なくとも知っておいて損はないと思うので。
図で分かるgit-rebase – アジャイルSEを目指すブログ

間違ったブランチを変更してしまった!

gitならこんなことまで出来るんだって感じ。 記事読んで理解するのにちょっと時間かかった。
別のトピックブランチにしてしまった複数のコミットを移動する – ToMmY Makes Love with Codes

Sublime Text 2を使ってみる

| Comments

こんな記事を見たのがきっかけ
”恋に落ちるエディタ”「Sublime Text」 完全入門ガイド! | デザイナーブログ | 株式会社LIG

普段はvimを愛用して、たしかに単体のファイルを編集する分にはいいのだが、 ある程度のプロジェクトを管理するために便利なものはないかなあと思っていたが、これは便利そうだなと思った。

導入方法とかはさっきの記事にあるので割愛。
ただし、package controlのインストールのところだけはなんかコピペじゃうまくいかなかった。 公式のところにあるのをコピペしたらうまくいった。

設定として、まずはvimキーバインドを使いたいので、 Preferences > Setting —Defaultを開き、

"ignored_packages": ["Vintage"]

とかなっているのを

"ignored_packages": []

としてやれば、Vintageというパッケージが有効化されvimのコマンドが使えるようになる。
参考:Sublime Text 2をvim風に操作するには、プラグインすら不要でした。設定の変更のみ。
ただし、すべてのコマンドが使えるわけでなく:eとか:qとかは使えない。

あと、タブをスペースに展開したかったので
Sublime TextでHaskell編集時のタブをスペース4つにする にあった設定をSetting —Usersに追加した。

便利だと思う機能としてCtr-pでのファイルサーチで、 今までだと、あるディレクトリの下にあるファイルとかをそのディレクトリ 名をいちいち入力しなきゃならなかったのが、その手間が省けて便利。

他にもいろいろな便利なショートカットがあるらしく、
Emacs, Vim, Sublime Text 2 徹底比較
とかいう記事がそれなりにまとまっている。

とまあ、便利そうなんだけど、やっぱり新しいツールとだけあって自分はまださぐりさぐりの状態で使っている。
makeコマンドをsublimeから呼び出したいのだが、build systemとかいうのを使えばできるのか?

あとはgitとかとの連携もできるらしいけど、そのへんもよくわかんない。

Octopress導入記

| Comments

octopressを導入するまで

ruby 1.9を導入

octopressを動かすにはruby 1.9以上が必要。 自分のubuntu 12.04には1.8.7しか入っていなかったのでrvmというものをつかって導入。 rvmとはrubyの複数のバージョンを管理するためのツールで、これを使うとrubyの様々なバージョンをインストールすることが可能。

で、「rvm インストール」とかで検索したらいろいろな方法があるのだが、どうもうまくいかない。 twitterでヘルプを投げたところ@ompugaoさんから教えてもらった方法がうまくいった。

  1. curl -L get.rvm.io | bash -s stable
  2. rvm requirementsで必要なパッケージを確認してinstall
  3. rvm install ruby-1.9.3

これをやる前にうっかりaptitudeでrvm-rubyをinstallしちゃったら

It looks you are one of the happy Ubuntu users, 
RVM packaged by Ubuntu is old and broken, 

とか言われる。happyだから仕方ないね。 まあ、解決策もちゃんとでてきて Installed Ruby 1.9.3 with RVM but command line doesn’t show ruby -v の言われたとおりにすれば直った。

それで

rvm 1.9.3

とかすれば、バージョン1.9.3が使える。が、シェルの設定でログインシェルとして使用するとかいうのをチェックしないとうまくいかない。

octopress導入

GithubとOctopressでモダンな技術系ブログを作ってみる あたりを参考にすれば何とかなる。

あとつまずいたのは、実際の記事を書くときになぜかファイルの文字コードがutf-8になっていなくてrake generateでコケたことくらいか。