# git undo エイリアス提案（破壊的提案・ユーザー判断待ち）

> 既存 `git save`（add+commit+push）と対称な `git undo` を新設する提案。
> 設計書：[self_recovery.md](self_recovery.md) §2-1
>
> **alias追加自体はユーザー判断に委ねる**。本ファイルは提案として残すのみで、勝手に `~/.gitconfig` を書き換えない。
> ユーザーが採用判断したら、このファイルの末尾コマンドを実行する。

---

## 1. 動機

A分類（軽量・可逆）の自己リカバリで毎回 `git revert` の sha を手で特定するのは時間効率が悪い。
クローンが「直前のコミットを安全に巻き戻す」を1コマンドで叩けると、リカバリ機構の即応性が跳ね上がる。

既存運用：
```sh
git save  # = git add -A && git commit && git push
```

新規提案：
```sh
git undo  # = 直前のコミットを安全に取り消し（履歴破壊なし）
```

---

## 2. 設計方針

### 2-1. 破壊的にしない（最重要）

- **history rewrite禁止**（`reset --hard` は使わない）
- リモートに既push済の場合は `revert` を使う（履歴に「取り消した」コミットを残す）
- ローカルのみで未pushなら `reset --soft HEAD~1` も許容（変更内容はステージに残す）

### 2-2. 安全側に倒す

- 直前1コミットのみが対象（複数コミット遡及はオプションフラグで明示）
- マージコミットには適用しない（手動判断必須）
- push済の判定で挙動を切り替える

---

## 3. 提案実装（3案）

### 案A：シンプル（push済前提・revertのみ）

```sh
git config --global alias.undo '!git revert HEAD --no-edit && git push'
```

- 動作：直前コミットの逆コミットを作って push
- 利点：履歴破壊ゼロ・常に安全
- 欠点：履歴に revert コミットが1つ増える

### 案B：賢い（push判定で切替）

```sh
git config --global alias.undo '!f() {
  if git rev-parse --verify @{u} >/dev/null 2>&1 && [ "$(git rev-parse HEAD)" = "$(git rev-parse @{u})" ]; then
    git revert HEAD --no-edit && git push;
  else
    git reset --soft HEAD~1;
  fi
}; f'
```

- 動作：リモートと同期済なら revert、未pushなら soft reset
- 利点：push前は履歴汚れず、push後は履歴破壊しない
- 欠点：alias内シェル関数で1行が長い

### 案C：最小（ローカルのみ・soft reset）

```sh
git config --global alias.undo '!git reset --soft HEAD~1'
```

- 動作：直前コミットを取り消し、変更はステージに残す
- 利点：1秒で書ける
- 欠点：push済コミットには使えない（リモートと乖離する）

---

## 4. 推奨

**案B（賢い）を推奨**。理由：

- ユーザーが「push済かどうか」を考えなくていい（ジャービス的）
- 既存 `git save` と完全対称（save=未push→push、undo=push判定→適切に戻す）
- 失敗してもユーザーの覚悟（DNA記載「文句を言わない」）の範疇に収まる

---

## 5. 採用時の操作手順

ユーザーが「採用」と言ったら、クローンは以下を実行：

```sh
git config --global alias.undo '!f() {
  if git rev-parse --verify @{u} >/dev/null 2>&1 && [ "$(git rev-parse HEAD)" = "$(git rev-parse @{u})" ]; then
    git revert HEAD --no-edit && git push;
  else
    git reset --soft HEAD~1;
  fi
}; f'
```

確認：
```sh
git config --global --get alias.undo
```

---

## 6. ロールバック（採用やめる場合）

```sh
git config --global --unset alias.undo
```

---

## 7. 関連動作（`git save` を持っていない環境向け再掲）

```sh
git config --global alias.save '!git add -A && git commit -m "save: $(date +%Y-%m-%d_%H:%M)" && git push'
```

---

## 8. 接続点

- 書込ログ：[action_log_rules.md](action_log_rules.md) §4 の reverse フィールド A分類のテンプレに `git undo` を追加可能
- 自己リカバリ：[self_recovery.md](self_recovery.md) §2-1 の MVP 高速化
- 既存運用：既存 `git save` と命名対称

---

## 9. ユーザー判断欄（このファイルに書き込む）

- [ ] 採用する → §5を実行
- [ ] 採用しない → このファイル削除可
- [ ] 保留 → そのまま放置

---

*作成：2026-05-02 ／ self_recovery.md MVP の補助提案*
*破壊的提案ファイル：alias追加はユーザー承認後のみ実施*
