uuid: - value: d1a650c6-fd8f-4509-801b-10c14f10344e langcode: - value: en type: - target_id: daily_email target_type: node_type target_uuid: 8bde1f2f-eef9-4f2d-ae9c-96921f8193d7 revision_timestamp: - value: '2025-05-11T09:00:55+00:00' revision_uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 revision_log: { } status: - value: true uid: - target_type: user target_uuid: b8966985-d4b2-42a7-a319-2e94ccfbb849 title: - value: 'Useful Git configuration' created: - value: '2022-09-19T00:00:00+00:00' changed: - value: '2025-05-11T09:00:55+00:00' promote: - value: false sticky: - value: false default_langcode: - value: true revision_translation_affected: - value: true path: - alias: /daily/2022/09/19/useful-git-configuration langcode: en body: - value: |
Here are some snippets from my Git configuration file.
These days, I use a much simpler workflow and configuration since doing more trunk-based development, but in general, I rebase instead of merging by default, and prefer to use fast-forward merges that doesn't create a merge commit.
branch.autosetuprebase = always
and pull.rebase = true
configure Git to always rebase instead of pull. It does this for all branches, though I might override this for main
branches.
pull.ff = only
and merge.ff = only
prevents creating a merge commit and will prevent the merge if it would create one. If I needed to override this, I could by using the --no-ff
option on the command line.
I use checkout.defaultRemote = origin
to ensure that the origin
remote is used if I have multiple remotes configured, and push.default = upstream
to set the default remote to push to.
merge.autoStash
allows for running merges on a dirty worktree by automatically creating and re-applying a stash of the changes, and fetch.prune
will automatically prune branches on fetch - keeping things tidy.
I also have and use a number of aliases.
Some like pl = pull
and ps = push
are shorter versions of existing commands, and some like aa = add --all
, fixup = commit --fixup
and some additional arguments to commands.
I also have some like current-branch = rev-parse --abbrev-ref HEAD
and worktrees = worktree list
which add simple additional commands, and some like repush = !git pull --rebase && git push
which use execute shell commands to execute more complex commands or combine multiple commands.
This is a snapshot of my Git configuration. The full version is on GitHub.
format: full_html processed: |Here are some snippets from my Git configuration file.
These days, I use a much simpler workflow and configuration since doing more trunk-based development, but in general, I rebase instead of merging by default, and prefer to use fast-forward merges that doesn't create a merge commit.
branch.autosetuprebase = always
and pull.rebase = true
configure Git to always rebase instead of pull. It does this for all branches, though I might override this for main
branches.
pull.ff = only
and merge.ff = only
prevents creating a merge commit and will prevent the merge if it would create one. If I needed to override this, I could by using the --no-ff
option on the command line.
I use checkout.defaultRemote = origin
to ensure that the origin
remote is used if I have multiple remotes configured, and push.default = upstream
to set the default remote to push to.
merge.autoStash
allows for running merges on a dirty worktree by automatically creating and re-applying a stash of the changes, and fetch.prune
will automatically prune branches on fetch - keeping things tidy.
I also have and use a number of aliases.
Some like pl = pull
and ps = push
are shorter versions of existing commands, and some like aa = add --all
, fixup = commit --fixup
and some additional arguments to commands.
I also have some like current-branch = rev-parse --abbrev-ref HEAD
and worktrees = worktree list
which add simple additional commands, and some like repush = !git pull --rebase && git push
which use execute shell commands to execute more complex commands or combine multiple commands.
This is a snapshot of my Git configuration. The full version is on GitHub.
summary: null field_daily_email_cta: { }