295 releases

new 0.10.189 Apr 20, 2024
0.10.185 Mar 25, 2024
0.10.149 Dec 28, 2023
0.10.144 Nov 23, 2023
0.7.27 Nov 22, 2022

#11 in Command line utilities

Download history 7/week @ 2023-12-23 44/week @ 2023-12-30 11/week @ 2024-01-06 66/week @ 2024-01-27 5/week @ 2024-02-03 28/week @ 2024-02-10 227/week @ 2024-02-17 81/week @ 2024-02-24 708/week @ 2024-03-02 605/week @ 2024-03-09 636/week @ 2024-03-16 536/week @ 2024-03-23 109/week @ 2024-03-30 165/week @ 2024-04-06

1,469 downloads per month

MIT/Apache

91KB
2K SLoC

git disjoint

Build Status

conceptual diagram of git-disjoint operation

git-disjoint automates an optimal git workflow for PR authors and reviewers by grouping commits by issue into GitHub PRs.

This encourages the submission of small, independent PRs, minimizing cognitive load on reviewers, maximizing the utility of your git history, and keeping cycle time low.

Elevator Pitch

git-disjoint demo

You're working on a feature. As you work, you create some commits that don't directly implement your feature. Maybe you improve some documentation, fix a minor bug, or first refactor to make the change easy, before making the easy change^1. In any case, you commit directly to master^2 as you go, because you want each change to persist in your development environment, even before it's gone through code review and landed upstream.

When you come to a natural stopping point, you are ready to ship several commits. Each commit is atomic, relating to just one topic. It comes with a detailed commit message referencing an issue in your work tracker, passing unit tests, and documentation. You don't want to shove all these changes into a single PR, because they deal with orthogonal concerns. You trust your team to contribute quality code reviews, and iterating on one changeset shouldn't delay unrelated changes from merging.

Instead of creating a PR directly from your master, or manually moving commits into separate branches, do this:

git disjoint

git-disjoint will identify which commits relate to the same issue, batch these commits into a new branch, and create a PR.

How does it work?

git-disjoint looks for trailers^3 in each commit message to determine which issue a commit relates to. By default, it creates one PR for each issue and associates the PR to an existing issue in your work tracker.

When a PR merges, your next git pull effectively moves upstream's master from behind your local commits to ahead of them.

Supported Integrations

git-disjoint adds value to your workflow if you:

  • use a work tracker (supports Jira and GitHub Issues)
  • use GitHub and Pull Requests

Requirements

You need a GitHub personal access token with repo scope. Either export this as the GITHUB_TOKEN environment variable or pass it to git-disjoint with the --token option.

Install

From GitHub releases

The easiest way to install git-disjoint is to download a release compatible with your OS and architecture from the Releases page.

Alternatively, install git-disjoint with one of the following package managers:

Repository Command
Cargo cargo +nightly install git-disjoint
Cargo binstall cargo binstall git-disjoint
Nix nix profile install github:EricCrosson/git-disjoint

Use

Make commits

  1. Add all of your commits to a single branch. I recommend using the repository's default branch.

  2. In each commit message, include a reference to the relevant issue.

    For example, use the Jira automation format:

    Ticket: COOL-123
    

    or

    Closes Ticket: COOL-123
    

    Or use the GitHub format:

    Closes #123
    

Open PRs

When you're ready to:

  1. turn the set of commits addressing each issue into its own branch,
  2. push that branch, and
  3. create a draft PR,

run git disjoint.

How-to Guide

How do I ignore certain commits?

To ignore commits associated with an issue, use the --choose flag. This will open a menu where you can select the issues to create PRs for.

How do I use git-disjoint on commits without an associated issue?

Use the --all flag to include commits without a recognized trailer.

Dependencies

~25–42MB
~721K SLoC