Worktrees and Remotes

To fetch all remote references from all remotes in a worktree setup, you can use the following command:

$ grm wt fetch
[✔] Fetched from all remotes

This is equivalent to running git fetch --all in any of the worktrees.

Often, you may want to pull all remote changes into your worktrees. For this, use the git pull equivalent:

$ grm wt pull
[✔] master: Done
[✔] my-cool-branch: Done

This will refuse when there are local changes, or if the branch cannot be fast forwarded. If you want to rebase your local branches, use the --rebase switch:

$ grm wt pull --rebase
[✔] master: Done
[✔] my-cool-branch: Done

As noted, this will fail if there are any local changes in your worktree. If you want to stash these changes automatically before the pull (and unstash them afterwards), use the --stash option.

This will rebase your changes onto the upstream branch. This is mainly helpful for persistent branches that change on the remote side.

There is a similar rebase feature that rebases onto the default branch instead:

$ grm wt rebase
[✔] master: Done
[✔] my-cool-branch: Done

This is super helpful for feature branches. If you want to incorporate changes made on the remote branches, use grm wt rebase and all your branches will be up to date. If you want to also update to remote tracking branches in one go, use the --pull flag, and --rebase if you want to rebase instead of aborting on non-fast-forwards:

$ grm wt rebase --pull --rebase
[✔] master: Done
[✔] my-cool-branch: Done

"So, what's the difference between pull --rebase and rebase --pull? Why the hell is there a --rebase flag in the rebase command?"

Yes, it's kind of weird. Remember that pull only ever updates each worktree to their remote branch, if possible. rebase rebases onto the default branch instead. The switches to rebase are just convenience, so you do not have to run two commands.

  • rebase --pull is the same as pull && rebase
  • rebase --pull --rebase is the same as pull --rebase && rebase

I understand that the UX is not the most intuitive. If you can think of an improvement, please let me know (e.g. via an GitHub issue)!

As with pull, rebase will also refuse to run when there are changes in your worktree. And you can also use the --stash option to stash/unstash changes automatically.