gitの相対的なコミットの指定、コミットの範囲指定方法

^、~の違いがよくわからなかったので、調べた。

相対的なコミット指定方法

^を用いる方法

主にブランチをマージしたコミットの場合に用いる。
マージしたコミットの場合、以下のように親が2つ以上いることがある。
この際にHEAD^1とすることで一つ目の親、HEAD^2とすることで2つ目の親を指定することができる。
○ー○
○/

~を用いる方法

常に一番目の親を指定する。

まとめ

つまり、HEAD^1とHEAD~1は同じものを指している。これだから混乱してたんだな^^;

範囲指定

ダブルドット
git log [branchname]..[branchname2]

これで[branchname2]にしか含まれていないコミットが抜き出せる。

git log [branchname2] --not [branchname] 
git log [branchname2] ^[branchname]

としても同じ効果が得られる。
これは2つのブランチを指定しているが、3つ以上の場合は

git log [branch1] --not [branch2] [branch3]
git log [branch1] ^[branch3] ^[branch3]

などと指定すれば、上の場合は[branch1],[branch3]には含まれているが、[branch2]には含まれていないコミットが取り出せる。
下の場合には[branch1]には含まれているが、[branch2],[branch3]には含まれていないコミットを取り出せる。

トリプルドット
git log [branch]...[branch1]

これは[branch][branch1]の両方に存在しないコミットを取り出せる。

git log --left-right [branch]...[branch1]

とするとどっちのコミットかわかるようになる.

emacsで矩形選択とレジストリのまとめ

矩形選択系

キーバインド 関数名 効果
C-x r k kill-rectangle 矩形領域の切り取り
C-x r c clear-rectangle 矩形領域の消去(スペースでの置き換え)
C-x r d delete-rectangle 矩形領域の削除(完全削除)
C-x r t string-rectangle 矩形領域を文字列で置き換え
C-x r y yank-rectangle 矩形領域のはりつけ
C-x r r a copy-rectangle-to-register レジスタaに矩形領域を保存

レジスタ

キーバインド 関数名 効果
C-x r i a, C-x r g a insert-register レジスタaの内容をはりつけ(前置引数をつけるとカーソルが貼付けた最後に移動する)
C-x r s a, C-x r x a copy-to-register レジスタaに保存(前置引数をつけるとカット)
C-x r SPC a point-to-register 現在の位置をレジスタaに登録
C-x r w a window-configuration-to-register 現在の画面分割をレジスタaに登録
C-x r j a jump-to-register レジスターaの位置or画面分割or[Frame状態]に移動
C-u 数値 C-x r n a number-to-register 数値をレジスタaに登録
C-u 数値 C-x r + a increment-register レジスタaの値を数値だけ増加させる

Fedora 16に Tex Live 2011 の環境を構築

調べた限り、大きく分けて2つの方法があるようだ。texlive2011のリポジトリを登録してインストールする方法とTexliveのサイト(tug)のインストール方法である。

texlive2011のリポジトリを登録してインストールする方法(その1)

http://matea2.blogspot.com/2012/01/fedora-16-texlive-2011.htmlに書いてあるとおりにやる。

sudo rpm -i http://jnovy.fedorapeople.org/texlive/2011/packages.fc16/texlive-release.noarch.rpm
sudo yum install texlive
sudo yum install texlive-collection-langcjk


次に/usr/share/texlive/texmf/dvipdfmx/dvipdfmx.cfgのcid-x.mapのコメントアウトを外す。

f cid-x.map

これでpdfファイルの作成には成功したが、xdviでdviファイルを閲覧すると文字化けがひどい。
pxdviを使おうと思ったが、texlive2011のリポジトリの依存関係上、入らないようだ。

Texliveのサイト(tug)のインストール方法にしたがって構築する(その2)

http://flower-snow.blogspot.com/2011/11/fedora15tex.htmlを参考にした。
TeX Liveのサイト http://www.tug.org/texlive/ から install-tl-unx.tar.gz をダウンロード

tar xvzf install-tl-unx.tar.gz
cd install-tl-xxxxxxxx
sudo ./install-tl

インストールが終了したらPATHを設定設定する。このPATH設定をrootでもしておく。(アップデートのため)

export PATH=/usr/local/texlive/2011/bin/x86_64-linux:$PATH

32bitのfedora16の場合、x86_64がi386になる。

texliveのアップデートはrootになって以下の通り

tlmgr update --all


あとはdviを表示するためにpxdvi(xdvik), gv, sazanami font, xorg-x11-fonts-ISO8859-1-75dpiをインストールする。

sudo yum install "xdvik gv sazanami-* xorg-x11-fonts-ISO8859-1-75dpi"

環境変数がLANG=ja_JP.UTF-8だとエラーがでるので以下のようにエイリアスを貼る。

alias pxdvi='LANG=C pxdvi'
alias gv='LANG=C gv'

まとめ

方法その1
- 比較的簡単に構築できたが、dviファイルが閲覧できない
- yumの管理なので、アップデートが楽?
方法その2
- dviファイルの閲覧が可能
- texliveのアップデートは独自でやらなければならない。

xmodmapでキーバインド変更する方法

CapsキーをCtrlキーにする方法はよく紹介されており、Gnomeなどを使っていれば簡単に変更できる。
しかし、そこではあまり詳細に変更できない、詳細に設定したい場合はxmodmapを用いる。


まず現在のkeymapは以下のコマンドで得られる。

xmodmap -pke

この出力を.xmodmapに書きだすために

xmodmap -pke > ~/.xmodmap

とする。
この.xmodmapを編集し、

xmodmap ~/.xmodmap

とすると、変更が反映される


Caps LockのキーをCtrlに変更したい場合の例

ターミナルでxevというコマンドを使用すると、押したキーが何にバインドされていて何番のキーなのかがわかる。
Capsキーを押すと66番、左Ctrlキーは37番だということがわかると思う。

では、capsキーの番号と左Ctrlきーの番号がわかったので.xmodmapを変更してキーバインドを変更しよう。
.xmodmapの66番を以下のように37番に書かれている内容と同じにする。
つまり、

keycode  66 = Eisu_toggle Caps_Lock Eisu_toggle Caps_Lock

から

keycode  66 = Control_L NoSymbol Control_L

へと変更する。

通常のキーはこれで変更できるが、 Ctrl, Caps Lock, Shift, Altなどは特殊キーなので更に変更を加える必要がある。

末尾に

clear Lock
add Control = Control_L

を加える。clear LockによってLockの特殊キーを削除する。
その後Controlの特殊キーにControl_Lを追加する。
もともとControl_L特殊キーに入っているがここで、新しくControl_Lの割り当てキーを増やしたのでそれを反映させるために行う。

この特殊キーの一覧はターミナルで

xmodmap

と叩くことによって得られる。これらのキーを削除または追加するときは注意しよう。


最後に以下のコマンドを叩くことによって以上までの編集内容が反映される。

xmodmap ~/.xmodmap

emacsの設定ファイル.emacsを複数の環境(異なるPC、OS)で統一する方法


今までemacsの設定ファイル(.emacs)がOS等の違いで記述が異なる箇所があった。
そのため異なる部分は別にして共通部分のみ共有してきた。
色々調べて、全て共有することができるようになったのでメモっておく。


emacs lispではOS情報は[system-type]という変数に格納されている。
Linuxではgnu/linuxMacではdarwinBSDではgnu/kfreebsd、windowsではwindows-ntとなるようだ。


また、現在のホスト名も[system-name]という変数に格納されている。
つまり、Linuxのuser1という環境でのみ用いる設定は

(when (and (eq system-type 'gnu/linux) (equal system-name "user1"))
  (setq ...)
)

と書いたり、Macでのみ用いたい設定には

(when (eq system-type 'darwin)
  (setq ...)
)

と書けばよい。

これで全ての設定ファイルが共有できる。

gitコマンドの自分用まとめ

基本

git remote show [remotename] 引数なしでpull、pushした場合に何を取ってくるかわかる。
git pull [remote] [remotebranch] リモートのブランチをpullする
git push [remote] [localbranch] 新しくブランチをpushする場合
git push -u [remote] [localbranch] 新しくブランチをpushする場合(pullもできるようにする。上記のではpushのみしかできない)
git push [remote] [localbranch]:[remotebranch] リモートのブランチの名前を変えたい場合
git push [remote] :[remotebranch] リモートにあるブランチを削除
git status -uno アントラックファイルを無視してステータスを表示する
git status -sb ステータスの表示を簡略化し、ブランチ名を表示する

マージするときなど

git merge [branch] 現在のブランチと[branch]をマージする
git rebase -i HEAD~N N回前のコミットから編集し直す
git cherry-pick [commit] [commit]を今のブランチのHEADに取り込む

[commit]としては例えば、ブランチ名指定でブランチの先端、[ブランチ名]^で[ブランチ名]の一つ前のコミット等が指定できる。

git diff -c mergeした際の変更を見る
git checkout --conflict=merge conflictした時点に戻る

branchコマンドのまとめ

git branch -rd [remotename/remotebranch] ローカルのremoteのブランチを消去?
git branch -d [localbranch] ローカルブランチの消去
git branch ローカルブランチ表示
git branch -a 情報のあるすべてのブランチを表示
git branch -r リモートブランチの表示
git branch -m [oldbranch] [newbranch] rename
git branch --set-upstream [localbranch] [remotename/remotebranch] localbranchにremotebranchを追跡させる(pullやpushができる)

checkoutのまとめ

git checkout -b [newlocalbranch] 新しいローカルブランチを作成し、そこにcheckoutする
git checkout -b [newlocalbranch] [remote/branch] [remote/branch]から新しいローカルブランチを作し成、そこにcheckoutする
git checkout -t [remote/branch] [remote/branch]から新しいローカルブランチをリモートのブランチ名で作成する
git checkout [commit] [/path/to/file] [file]を[commit]のバージョンに戻します

resetのまとめ

git reset --soft HEAD^ 一つ前のコミットを取り消し(ローカルのコミットのみ)
git reset ステージした変更を取り消し。インデックスをHEADに戻す。
git reset HEAD と同様
git reset --hard HEAD インデックスもワーキングツリーもHEADに戻す。

reset をまとめると softはHEADの移動
何もつけないと HEADとインデックスの移動
hardをつけるとHEADとインデックスとワーキングツリーの移動

diffのまとめ

git diff ワーキングツリーとインデックスの差を表示
git diff --cached HEADとインデックスの差を表示
git diff HEAD ワーキングツリーとHEADの差を表示
git diff HEAD^ HEAD HEADと一つ前のコミットの差を表示、引数にはコミット、ブランチやタグを指定できる
git diff -c mergeした際の変更を見る
git diff `git show-branch --merge-base master HEAD` HEAD 分岐元との比較

showのまとめ

git show [commit] [/path/to/file] [file]の[commit]ヴァージョンを表示します

stashのまとめ

git stash 一時的に変更を保存して、前のコミットに戻る
git stash save [name] 一時的な保存に[name]という名前をつけて前のコミットに戻る
git stash list stashさせたlistを表示させる
git stash apply stashを復活させる
git stash pop stashを復活させ、削除する
git stash clear すべてのstashを削除する.
git stash drop [name] [name]のstashを削除する

logのまとめ


git log --graph アスキーアートのブランチやマージの歴史を表示
git log -p logと同時にdiffも表示
git log -p [branch]..[topicbranch] [branch]から[topicbranch]までのログ表示
git log --oneline [branch]..[topicbranch] | wc -l [topicbranch]を作成してから何度コミットが行われたかわかる
git log --graph --decorate --oneline --all gitk --allのようにコミットの歴史などが見れる。

blameのまとめ

git blame [file] ファイルの各行の編集者とそのコミットのハッシュ値を表示する
git blame -s [file] 上記の簡易表記ver
git blame -L 3,7 [file] 3−7行目までを表示
git blame -L 3,+5 [file] 3行目から+5行目まで表示
git blame -C[num] [file] [num]字以上の重複を検出しどこのファイルから移動してきたかを表示する

archiveのまとめ

git archive --format=tar --prefix=[dirname] [commit] スナップショットをtarファイルで作成する。展開時、prefixで指定した[dirname(/を最後につけること)]に展開される
git archive --format=tar --prefix=[dirname] --remote=[remotename] [commit] リモートのスナップショットを作成

cleanのまとめ

git clean -n gitに登録していないファイルorディレクトリの削除リストを表示
git clean -d ディレクトリも削除対称に入れる
git clean -x .gitignoreで指定されたもの削除対象に入れる
git clean -X .gitignoreで指定されたもののみ削除対象にする
git clean -f 実際に削除する

grepのまとめ

git grep [pattern] [pattern]にマッチする文字列を探す
git grep --chaced [pattern] stageされたのものから[pattern]にマッチする文字列を探す
git grep --no-index [pattern] リポジトリに登録されてないものから[pattern]にマッチする文字列を探す
git grep -e [regexp] 正規表現[regexp]でマッチする文字列を探す
git grep -i [pattern] 大文字小文字を無視して[pattern]でマッチする文字列を探す

その他

git config --global alias.co "checkout" これでgit checkout -> git coと出来る。
git rm --cached [filename] ファイルの追跡をやめる
git config --global color.ui true gitの出力に色付けする
git config --global rerere.enable true マージ方法を記録する

Wanderlustの最新版をMacBookAirに入れた

wanderlustmacのemacs23に導入した

http://takanory.net/takalog/1266を参考にして導入した。
ftp://ftp.jpl.org/pub/m17n/から
apel, flim, semi, wandelustを落としてきて、それぞれ順番に

make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs install

を行った。
最後に.emacs

(autoload 'wl "wl" "Wanderlust" t)
(autoload 'wl-other-frame "wl" "Wanderlust on new frame." t)
(autoload 'wl-draft "wl" "Write draft with Wanderlust." t)

を追加して完了のはずが、...
Can't open load file ssl
のエラーメッセージssl.elがパスの通ったとこにないっぽい.
落としてきたwanderlustの中にssl.elがあるのでそれをemacsのpathの通ったところに置いたらうまくいきました。

gmailを使う際の.wlの設定はまた今度書こうかな