git-loom 0.18.0

A Git CLI tool that weaves together multiple feature branches into integration branches
# absorb

Automatically distribute working tree changes into the commits that last touched the affected lines. Uses blame to determine the correct target for each hunk, then amends those commits — all in a single operation.

## Usage

```
git loom absorb [-n] [files...]
```

### Options

| Option | Description |
|--------|-------------|
| `-n, --dry-run` | Show what would be absorbed without making changes |

### Arguments

| Argument | Description |
|----------|-------------|
| `[files...]` | Files to restrict absorption to (default: all tracked changed files) |

## How It Works

For each file with uncommitted changes:

1. Parses the unified diff into individual hunks
2. For each hunk, blames the modified/deleted lines to find their originating commit
3. If all hunks trace to the **same in-scope commit**, the whole file is absorbed
4. If hunks trace to **different commits**, each hunk is independently absorbed into its target
5. Hunks that can't be attributed (pure additions, ambiguous) are **skipped** and left in the working tree

After analysis, all assigned hunks are folded into their target commits in a single rebase operation.

## Examples

### Absorb all changes

```bash
git loom absorb
#   src/auth.rs -> a1b2c3d "Add authentication"
#   src/utils.rs -> d4e5f6a "Add utility helpers"
# Absorbed 2 hunk(s) from 2 file(s) into 2 commit(s)
```

### Absorb hunks into different commits

```bash
# src/shared.rs has changes in two separate regions,
# each originating from a different commit
git loom absorb
#   src/shared.rs [hunk 1/2] -> a1b2c3d "Add login form"
#   src/shared.rs [hunk 2/2] -> d4e5f6a "Add dashboard"
# Absorbed 2 hunk(s) from 1 file(s) into 2 commit(s)
```

### Dry run

```bash
git loom absorb --dry-run
#   src/auth.rs -> a1b2c3d "Add authentication"
#   src/shared.rs [hunk 1/2] -> d4e5f6a "Add utility helpers"
#   src/shared.rs [hunk 2/2] -- skipped (pure addition)
# Dry run: would absorb 2 hunk(s) from 2 file(s) into 2 commit(s)
```

### Restrict to specific files

```bash
git loom absorb src/auth.rs src/utils.rs
#   src/auth.rs -> a1b2c3d "Add authentication"
#   src/utils.rs -> d4e5f6a "Add utility helpers"
# Absorbed 2 hunk(s) from 2 file(s) into 2 commit(s)
```

## Conflicts

If the rebase that folds the fixup commits hits a conflict, the operation is
**paused**. Pre-existing staged changes are saved aside automatically.

```bash
git loom absorb
#   src/auth.rs -> a1b2c3d "Add authentication"
# ! Conflicts detected — resolve them with git, then run:
#   loom continue   to complete the absorb
#   loom abort      to cancel and restore original state
```

```bash
git add <resolved-files> && git loom continue
# ✓ Absorbed 1 hunk(s) from 1 file(s) into 1 commit(s)
```

See [`continue`](continue.md) and [`abort`](abort.md) for details.

## Prerequisites

- Must be on an integration branch
- Working tree must have uncommitted changes
- Target commits must be in scope (between merge-base and HEAD)