コンテンツ
gitメモ:ブランチを切ってないのにやばいコードを書いちゃった場
gitを使ってコードの管理をしている場合において、実験的なコードを書く場合はソースコードを編集する前にブランチを作成しておくのが基本だ。しかし、ついブランチを作成し忘れたままでコードを変更してしまった、というパターンがある。
この場合、下記のようにgit stashでいったん変更点を保存した上で直前のcommitに戻し、新たなブランチを作成してそこでgit stash applyを行えばよい。
$ git stash $ git checkout hogehoge -b $ git stash apply $ git add hogehoge foobar $ git commit
git stash、便利だ。
gitメモ:diffとやり直し
最近久しぶりにgitを触って色々と忘れていたので再度メモ。
mergeを取り消す
mergeを実行したらconflictが大量に出てしまったので取り消したい、という場合、下記を実行。
$ git reset --hard ORIG_HEAD
conflictを解決する
gitにはmergeを実行した場合にconflictを解決するコマンド「git mergetool」がある。conflictしているファイルに対して、順番にdiffツールを実行して編集を促すもの。しかし、Windows上のMSysGit環境で実行したら見事にvimのdiffが実行されたので個人的にはデフォルトでは使えない認定(自分はvimはあまり使えないので)。
$ git mergetool
.gitconfigの「merge」および「mergetool」項目で起動するツールを設定できるそうなので、今度はEmacsに設定してテストしてみようかな。
diffを使う
マニュアルに書いてあるけど、「git diff」コマンドの書式は下記のとおり。
git diff <比較元commit> <比較先commit> [<対象ファイルパス>]
ここで、比較元・比較先commitはハッシュだけでなく、「HEAD」(最新のコミット)や「HEAD^」(最新の1つ前のコミット)、「HEAD^^」(最新の2つ前のコミット)、「HEAD~4」(最新の4つ前のコミット)などのほか、tagも利用可能。
例えば最新のコミットと、その1つ前のコミットでdiffを取るには次のようにする。
$ git diff HEAD^ HEAD hogehoge.py
TortoiseGitの記事を書きました
SourceForge.JP Magazineで 実用レベルに達したWindows向けGitクライアント「TortoiseGit」でGitを始めよう を書きました。ふと TortoiseGitのWebページ を見たらバージョンが上がっていて、インストールしてみたらかなり使えるようになっていたので適当に日本語化したうえで記事を書くという、自作自演(笑)。
はてブコメント では「日本語のファイル名に対応していない現状で実用的か?」というものが見られたんですが、日本語ファイルの件はすっかり失念してました。もともとバージョン管理するようなファイル/ディレクトリには日本語のファイル名を使わないもので、一般的にもそうなのかとすっかり思いこんでいたのですが、世間は違うようです……。
ただ、これはTortoiseGitだけの問題ではない話&作者がこれを認識しているか不明なので、TortoiseGitがバージョン1.0になっても解決はされない可能性があります。ということで誰かがパッチを書いて送るべし。
# といっても、コマンドライン版(msysgit/cygwin)との互換性の話もあるので結局はGit本体のほうにファイル名の整合性をとるシステムが入るべきだという気もするのですが
## そして Cygwin 1.7ではコードページの切り替え機能によってUTF-8でファイル名を扱えるという話を初めて知った
gitで特定のファイルを無視させる
gitで特定の拡張子などを持つファイルをtracking対象から外すには、.gitディレクトリがあるディレクトリに.gitignoreファイルで設定すればよい、というのはよく聞かれる話。たとえば自分の場合、下記のように設定することが多い。
*.pyc *~ *.bak
で、毎回これを設定するのは面倒。そんなときは、適当なところにグローバル用の.gitignoreファイルを作成し、git configで そのファイルのパスを「core.excludesfile」に設定すればOK。
$ git config --global --add core.excludesfile "$HOME/.gitignore"
Gitでローカルファイルのバックアップ
Gitでローカルファイルの差分バックアップをやってみるテスト。
前提:
- ミラーリングされているファイルサーバーがある
- いままでは作業用PCがクラッシュしても大丈夫なように、作業後にいちいちファイルをファイルサーバー中のディレクトリに上書きコピーしていた
- ファイル数が多くなる/容量が大きくなると面倒
- これだと履歴管理ができない(Emacsの~.1のようなバックアップファイルに頼ることに)
ということで、下記の手順でGitで差分バックアップをやってみる。
- 作業ディレクトリをgitリポジトリ化する。
$ git init $ git add <対象ファイル> $ git commit -m "<コメント>"
- ファイルサーバーにgitのbareリポジトリを作る
$ cd <バックアップディレクトリ> $ mkdir <適当なディレクトリ名>.git $ cd <ディレクトリ名>.git $ git init --bare
- ファイルサーバー内のbareリポジトリにコミット
$ cd <作業ディレクトリ> $ git remote add origin <ファイルサーバー上のbareリポジトリのパス> $ git push master:master
あとは作業が一段落したタイミングごとにコミット+pushをしていけばいいだけのはず。しかしこういう目的で使い出すとWindows上で動く、使いやすいGUIフロントエンドがほしくなるところではある。