| Crates.io | ubr |
| lib.rs | ubr |
| version | 0.1.0 |
| created_at | 2025-03-04 19:12:58.399152+00 |
| updated_at | 2025-03-04 19:12:58.399152+00 |
| description | Unibranch is a wrapper around git to enable a single branch workflow with stacked commits. |
| homepage | |
| repository | https://github.com/mbergenlid/unibranch |
| max_upload_size | |
| id | 1577625 |
| size | 124,512 |
Unibranch is a wrapper around git to enable a single branch workflow with stacked commits.
Imagine you are currently on a branch called main
Create a new virtual branch from origin/main with the changes in the commit referenced by <ref>.
$ ubr create <ref>
Update the virtual branch for commit ref or all virtual branches if ref is omitted.
$ ubr sync [ref]
Push your entire working branch origin/$USER/main
$ ubr push
The idea is to create all your commit on one single main branch, so imagine that you have worked on two independent features simultanously (Feature 1 and Feature 2). These are commited with one commit per feature straight to your main branch, and you would now like to submit these features for review separately.
(local main) * <- Feature 2
|
|
|
* <- Feature 1
|
|
|
(origin/main) *
$ ubr create HEAD^
Creates a hidden branch for the commit HEAD^ (the parent commit of HEAD), i.e. first feature and pushes it to the remote.
So now your git tree looks like this
(local main) * <- Feature 2
|
|
|
Feature 1 -> * * <- origin/feature-1
| /
| /
|/
(origin/main) *
You can now open a PR for origin/feature-1 and submit it for review. In the meantime you would also like to submit feature 2 for review.
$ ubr create HEAD
(local main) * <- Feature 2
|
|
|
Feature 1 -> * * <- origin/feature-1
| /
| / * <- origin/feature-2
|/ /
(origin/main) *----
Imagine now that you get some feedback on you PR for feature-1. You address those comments and ammend your local feature-1 commit.
$ git commit -m "fixup! <hash-of-feature-1>"
$ git rebase origin/main --autosquash # Ammends the changes to your single feature-1 commit
$ ubr sync # Sync the local commits with the remotes
Now, your tree looks like this:
(local main) * <- Feature 2
|
| * <- fixup!
| /
Feature 1 -> * * <- origin/feature-1
| /
| / * <- origin/feature-2
|/ /
(origin/main) *----
Let's say feature-2 is approved and merged on the remote and after you pull the latest changes with git pull --rebase your local git log looks like this:
(local main) * <- Feature 1
|
| * <- fixup!
| /
(origin/main) * * <- origin/feature-1
| /
| /
|/
*
and after running
$ ubr sync
(local main) * <- Feature 1
|
| * <- sync with main commit
| / (The result of merging with origin/main)
| /
| /
| * <- fixup!
| /
(origin/main) * * <- origin/feature-1
| /
| /
|/
*