git town sync
git town sync [--all] [--detached] [--dry-run] [--no-push] [--stack] [--verbose]
The sync command ("synchronize this branch") updates your local Git workspace with what happened in the rest of the repository.
Merge conflicts are not fun and can break code. Minimize them by syncing your
branches frequently. Git town knows how to sync many different types of
branches. When properly configured, git town sync --all
can synchronize all
your local branches the right way without losing changes, even in edge cases.
You can (and should) sync all branches many times per day without thinking about it, even in the middle of ongoing work. If a sync goes wrong, you can safely go back to the exact state you repo was in before the sync by running git town undo.
- pulls and pushes updates from all parent branches and the tracking branch
- deletes branches whose tracking branch was deleted at the remote if they contain no unshipped changes
- removes commits of deleted branches from their descendent branches, unless when using the merge sync strategy.
- safely stashes away uncommitted changes and restores them when done
- does not pull, push, or merge depending on the configured branch type
If the parent branch is not known, Git Town looks for a pull/merge request for this branch and uses its parent branch. Otherwise it prompts you for the parent.
--all / -a
By default this command syncs only the current branch. The --all
aka -a
parameter makes Git Town sync all local branches.
--detached / -d
The --detached
aka -d
flag does not pull updates from the main or perennial
branch at the root of your branch hierarchy. This allows you to keep your
branches in sync with each other and decide when to pull in changes from other
developers.
--dry-run
Use the --dry-run
flag to test-drive this command. It prints the Git commands
that would be run but doesn't execute them.
--no-push
The --no-push
argument disables all pushes of local commits to their tracking
branch.
--stack / -s
The --stack
aka -s
parameter makes Git Town sync all branches in the stack
that the current branch belongs to.
--verbose / -v
The --verbose
aka -v
flag prints all Git commands run under the hood to
determine the repository state.
Configuration
sync-perennial-strategy configures whether perennial branches merge their tracking branch or rebase against it.
sync-feature-strategy configures whether feature branches merge their parent and tracking branches or rebase against them.
If the repository contains a Git remote called upstream
and the
sync-upstream setting is enabled, Git Town
also pulls new commits from the upstream's main branch.
sync-tags configures whether Git Town syncs Git
tags with the origin
remote.
Why does git-sync sometimes update a local branch whose tracking branch was deleted before deleting it?
If a remote branch was deleted at the remote, it is considered obsolete and "git town sync" will remove its local counterpart. To guarantee that this doesn't lose unshipped changes in the local branch, "git town sync" needs to prove that the branch to be deleted contains no unshipped changes.
The easiest way to prove that is when the local branch was in sync with its
tracking branch before Git Town runs git fetch
. This is another reason to run
git town sync
regularly.
If a local shipped branch is not in sync with its tracking branch on your machine, Git Town must check for unshipped local changes by diffing the branch to delete against its parent branch. Only branches with an empty diff can be deleted safely. For this to work, Git Town needs to sync the branch first, even if it's going to be deleted right afterwards.