はじめに
プログラマーにとって git は「変更履歴を管理するツール」です。でも私は違う使い方をしています。
ただの保管庫として使っています。
私は82歳の俳句作家です。プログラミングの専門知識はありません。でも Emacs が好きで、自分のサイト管理や設定ファイルの管理に長年 Linux を使ってきました。
そんな私が長年悩まされてきたのが世代バックアップの問題です。
.muttrc
.muttrc.bak
.muttrc.bak2
.muttrc.20260101
.muttrc.old
「念のため消さずにとっておいたファイル」が気づけばどこにでも散らばっている。どれが何の版なのかもわからない。そんな .bak ファイルの山に悩まされてきました。
ある日気づきました。git はこの問題を完全に解決できる、と。
プロセスはどうでもいい
プログラマーにとって git のコミットメッセージは重要です。「なぜこの変更をしたか」を記録するのが目的だからです。
でも私の目的は違います。あの頃のファイルが取り出せればいい。 それだけです。
だからコミットメッセージは auto で十分。git commit -m "auto" を cron で毎晩自動実行すれば、それだけで完璧な保管庫ができあがります。
# crontab: 毎晩23時に自動コミット
0 23 * * * cd ~/dotfiles && git add -A && git commit -m "auto"
git commit は「今日の状態を瓶に詰めて棚に並べる」作業。棚にはいつでも過去の瓶が並んでいる。必要なときに取り出せばいい。それだけです。
取り出しが面倒という問題
git を保管庫として使うアイデアはシンプルですが、一つ問題がありました。過去のファイルを取り出すコマンドが面倒なのです。
git log --oneline # どのコミット?
git show abc1234:.muttrc > /tmp/.muttrc.old # コマンド長い…
これを毎回調べてやるのは億劫です。せっかくの保管庫も、取り出しが面倒では使えません。
そこで Emacs の ivy を使って、数ステップで完結するコマンド git-peek を作りました。(Claude と一緒に)
自動化の仕組み
「保管庫」として機能させるには、毎晩自動でコミット&プッシュする仕組みが必要です。
Dropbox/makefile の git-push ターゲット
各リポジトリに git ターゲットを持つ Makefile を置き、~/Dropbox/makefile からまとめて呼び出します。
## 各リポジトリの日次 auto-commit + push
git-push:
$(MAKE) -C ${HOME}/Dropbox/GH git
$(MAKE) -C ${HOME}/Dropbox/minorugh.com git
各リポジトリの git ターゲットはこんな形です:
git:
git add -A
git commit -m "auto: $(shell date '+%Y-%m-%d %H:%M:%S')" || echo "No changes"
git push
cron で毎晩自動実行
autobackup.sh を cron に登録して毎晩23時50分に自動実行します。
# crontab
50 23 * * * /usr/local/bin/autobackup.sh >> /tmp/cron.log 2>&1
autobackup.sh は ~/Dropbox/makefile の各ターゲットを順番に呼び出すラッパーです。git のコミット&プッシュはその中の一工程に過ぎません。寝ている間に自動で「瓶詰め」が完了している、という仕組みです。
push 先は GitHub と Xserver に同時送信
.git/config の pushurl を2つ設定することで、GitHub と自前サーバー(Xserver)に同時にプッシュしています。これでバックアップの二重化も実現しています。
[remote "origin"]
url = git@github.com:minorugh/dotfiles.git
pushurl = git@github.com:minorugh/dotfiles.git
pushurl = ssh://minorugh@sv13268.xserver.jp:10022/home/minorugh/git/dotfiles.git
git-peek の使い方
スクリーンショット
左サイドバーにコミット一覧、右にリアルタイムプレビュー。先頭行(背景色付き)に選択中のファイル名が表示されます。
ソースコードは GitHub で公開しています:https://github.com/minorugh/git-peek
操作の流れ
- git リポジトリ配下のバッファで
M-x git-peek - 現在のバッファが git 管理下のファイルであれば ivy をスキップして直接コミット一覧へ(dired からの起動など一致しない場合は ivy でファイルを選択)
- 画面が左右に分割され、左サイドバーにコミット一覧、右にプレビューが表示される
- カーソル移動に連動して右側のプレビューがリアルタイム更新される
-
RETでプレビューバッファにフォーカス移動し、下まで自由にスクロールして内容を精読 - 「これだ」と確信したら
sで保存 -
~/Dropbox/backup/tmp/YYYYMMDD_ファイル名に保存され、dired で保存先が開く
削除済みファイルは M-x git-peek-deleted で同様に操作できます。
コミット選択画面でのキー操作
サイドバー(git-peek-commits)
| キー | 動作 |
|---|---|
↓ / SPC
|
次のコミットへ移動+プレビュー更新 |
↑ / b
|
前のコミットへ移動+プレビュー更新 |
RET |
プレビューバッファへフォーカス移動 |
s |
選択したバージョンを保存 |
C-d |
全文表示 ↔ diff 表示をトグル |
? |
キーガイドをミニバッファに表示 |
q / C-g
|
キャンセル(元のウィンドウに戻る) |
プレビュー(git-peek-preview)
| キー | 動作 |
|---|---|
RET / f
|
サイドバーへフォーカス復帰 |
s |
選択したバージョンを保存 |
? |
キーガイドをミニバッファに表示 |
q / C-g
|
キャンセル(元のウィンドウに戻る) |
| その他 | 通常のスクロール操作(自由) |
C-d を押すたびに全文表示と diff 表示が切り替わります。全文表示のときはそのファイルのメジャーモード(例: emacs-lisp-mode)が、diff 表示のときは diff-mode が自動で適用されます。
プレビューウィンドウについて
コミット一覧でカーソルを動かすたびに、右側のプレビューウィンドウが自動更新されます。
RET でプレビューバッファにフォーカスを移動すると、自由にスクロール・検索ができます。
このときモードラインの色が変わり、現在位置を視覚的に確認できます。
RET または f でサイドバーに戻り、次のコミットの選択を続けられます。
プレビューバッファは buffer-read-only で保護されているため、うっかり編集してしまう心配はありません。
まとめ
git は非エンジニアこそ使うべきツールだと思っています。
-
.bakファイルの山とおさらばできる - 自動コミットで手間いらず
- 今開いているファイルなら ivy をスキップして即コミット一覧へ——起動が一瞬
- ivy でファイルを選ぶだけでコミット一覧が開く(現在のバッファが自動プリセット)
- カーソル移動に連動したリアルタイムプレビューで、目当ての版を素早く確認できる
RETでプレビューに移動して下まで精読、sで保存- サイドバー先頭行に選択ファイル名を表示——今どのファイルを見ているか一目瞭然
- プレビューにフォーカスがあるとモードラインの色が変わる——今どこにいるか一目瞭然
?でキーガイドをミニバッファに表示C-dで全文表示 ↔ diff 表示をその場でトグル-
削除済みファイルの過去バージョンも取り出せる(
git-peek-deleted) qで元のウィンドウ配置にそのまま戻る
「プロセスを管理するツール」ではなく「過去を保管する棚」として git を使う——この発想の転換が、非エンジニアにとっての git の正しい使い方ではないでしょうか。
Emacs ユーザーでなくても、git log と git show を覚えるだけで同じことができます。ぜひ試してみてください。
コードと記事は Claude と一緒に作りました。
