All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.0.15 - 2026-08-24
rebase --quit: discard a corrupt or abandoned chain-rebase state without touching any branchrebase --no-fork-point: compute merge bases without consulting reflogs (persists across--continue/--skip)
git chain rebasenow skips commits that are already applied upstream, like plaingit rebasedoes (previously the invocation suppressed git's patch-id detection, turning routine cherry-pick-down-then-refine workflows into spurious merge conflicts). Note this also means a commit whose patch the parent applied and later reverted is dropped, matchinggit rebase; git printsskipped previously applied commitwhen this happens, and thebackup-<chain>/*branches (now correctly preserved) are the recovery path- Chain rebase reliability overhaul from the rebase subsystem audit (REBASE_AUDIT.md): state survives failed rebase subprocesses with recovery advice,
--continueretries a failed branch,--abortnever touches branches it did not manage (and resets the working tree it owns),--cleanup-backupsdeletes only backups the run created, newrebase --quitescape hatch for corrupt state, worktree collisions are detected before any work starts,--steprefuses to run during a paused chain rebase, and chain rebases are isolated fromrebase.updateRefs
0.0.14 - 2026-08-24
- After a chain rebase completes, git-chain now suggests running
git chain prunewhen chain branches have become ancestors of the root branch (e.g. after a squash-merge reset) - Uncommitted-changes errors now name the branch the changes are on
- Checking out a branch held by another worktree now fails with a clean error naming the worktree, instead of panicking and leaving phantom changes in the working tree
- Updated all dependencies: git2 0.21 (libgit2 1.9.7), clap 4, colored 3, rand 0.10, regex 1.13, serde_json 1.0.151, assert_cmd 2.2, console 0.16
- clap 4 changes the CLI help/error text style (
Usage:casing, mergedOptions:section, lowercase error messages) and CLI parse errors now exit with code 2 instead of 1; command behavior is unchanged - Drops the unmaintained
atty(RUSTSEC-2021-0145) andansi_termtransitive dependencies and resolves all open security advisories
- clap 4 changes the CLI help/error text style (
- Rebase now shows progress reporting during chain rebase:
馃搶 [2/5] Rebasing feature-auth onto main... - Rebase completion now shows a summary report with counts by category (rebased, skipped, squash-reset)
rebase --continueandrebase --skipnow show progress reporting and summary report- Rebase conflict error message now shows numbered recovery steps with
--continueand--abortinstructions - Replaced
process::exit(1)with proper error propagation in core operationsrebase,backup,push,prune, andproperations now returnResult<(), Error>instead of callingprocess::exit(1)- Errors propagate to the top-level handler in
main.rsfor consistent formatting check_gh_cli_installed()returnsResultinstead of exiting directly
- Updated CLAUDE.md to reference Makefile targets instead of raw cargo commands
- Added
--skipflag torebasecommand for skipping a conflicted branch and continuing the chain rebase- Aborts any in-progress git rebase
- Restores the conflicted branch to its original position using saved refs
- Marks the branch as Skipped and resumes rebasing from the next pending branch
- Added external
git rebase --abortdetection inrebase --continue- Detects when the user has aborted a git rebase directly (bypassing git-chain)
- Compares branch's current OID with saved original ref to identify external aborts
- Provides clear error message suggesting
--skipor--abort
- Added chain modification validation in
rebase --continueandrebase --skip- Validates that pending branches still exist before attempting to rebase them
- Warns and automatically skips branches that were deleted externally during a chain rebase
- Added atomic state file writes using write-to-temp-then-rename pattern
- Prevents state file corruption if the process is killed mid-write
- Added integration tests for rebase --skip:
rebase_skip_conflicted_branch,rebase_skip_no_state,rebase_skip_then_verify_chain_status
- Added integration tests for robustness features:
rebase_continue_after_external_abort,rebase_continue_with_deleted_branch
- Added
--continueflag torebasecommand for resuming a chain rebase after resolving conflicts- Loads saved state from
.git/chain-rebase-state.json - Marks the conflicted branch as completed and resumes from the next pending branch
- Uses pre-computed merge bases for correct rebasing after partial chain rebase
- Loads saved state from
- Added
--abortflag torebasecommand for rolling back a chain rebase- Aborts any in-progress git rebase
- Restores all branches to their original positions using saved refs
- Returns to the original branch and cleans up state file
- Added chain rebase state tracking via
.git/chain-rebase-state.json- Persists original branch refs, merge bases, and per-branch rebase status
- Enables recovery from conflicts without re-computing merge bases
- Blocks new rebase when prior state exists (directs user to --continue or --abort)
- Skipped for
--stepmode which re-runs from scratch each time
- Added
ChainRebaseState,BranchState, andBranchRebaseStatustypes for state serialization - Added
rebase_statemodule for state file I/O (read, write, check, delete) - Added
get_branch_commit_oid()helper for capturing branch refs before rebase - Added integration tests for rebase state tracking:
rebase_continue_with_remaining_branches,rebase_abort_after_conflictrebase_continue_no_state,rebase_abort_no_state,rebase_blocked_when_state_exists
- Added
serdedependency for JSON serialization of rebase state - Added
--squashed-mergeflag torebasecommand with three modes:reset(default): auto-creates a backup branch before destructivegit reset --hardskip: skips squash-merged branches entirely during rebaserebase: forces normal rebase despite squash-merge detection
- Added
SquashedRebaseHandlingenum intypes.rsfor rebase-specific squash handling - Added integration tests for squash-merge handling in rebase:
rebase_squashed_merge_skip,rebase_squashed_merge_force_rebase
- Added
lintMakefile target (combinesfmt-check+clippy-strict) - Added
test-fileMakefile target for running all tests in a specific file - Added
--statusflag torebasecommand to show current chain rebase state- Displays per-branch status with emoji indicators (Completed, Skipped, Pending, Conflict, etc.)
- Shows progress through the chain and original branch information
- Reports "No chain rebase in progress" when no state file exists
- Added
--cleanup-backupsflag torebasecommand for deleting backup branches after successful rebase- Works with
rebase,rebase --continue, andrebase --skip - Deletes
backup-<chain>/<branch>branches created during squash-merge reset - Reports count of cleaned up backup branches
- Works with
- Added integration tests for Phase 3 polish and UX features:
rebase_progress_reporting,rebase_status_no_state,rebase_status_during_conflictrebase_cleanup_backups,rebase_no_cleanup_without_flag,rebase_summary_report_with_skipped_branches
- Added integration tests for error propagation:
rebase_nonexistent_chain,rebase_dirty_working_directory,rebase_missing_branch_in_chainbackup_nonexistent_chain,push_nonexistent_chain,prune_nonexistent_chain
- Squash-merge reset in
rebasenow auto-creates a backup branch before destructivegit reset --hard - Updated
.PHONYdeclaration in Makefile to include all targets
- Removed dead Makefile targets:
test-bench,test-pr-fix,integration-test
0.0.13 - 2025-11-05
- Enhanced error message when running git-chain outside a git repository
- Replaced technical git2 error with clear, actionable message
- Added helpful hints directing users to run 'git init'
- Styled error output consistently with colored formatting (error: in red, hint: in yellow)
- Mirrored Git's own error message style for better user familiarity
- Added integration test for non-git repository edge case
0.0.12 - 2025-11-05
- Fixed test failures when users have custom
init.defaultBranchgit configuration (#47)
0.0.11 - 2025-11-05
- Upgraded git2 dependency from 0.19.0 to 0.20.2
- Updated libgit2-sys to 0.18.2+1.9.1
0.0.10 - 2025-11-05
- Fixed help message to show correct argument order:
init <chain_name> <root_branch>(#46) - Fixed test assertion to match corrected help message
- Fixed PR command --draft and --web flag interoperability issue with GitHub CLI
- Fixed PR tests in GitHub Actions
- Fixed rebase_no_forkpoint test
- Fixed various merge test cases
- Added
prsubcommand for creating GitHub pull requests (#40) - Added support for
--prflag onlistandstatuscommands to show PR information - Added support for
--draftflag when creating PRs - Added tests for PR functionality
- Improved merge commit information retrieval
- Updated GitHub Actions workflow
- Updated gitignore