{ "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": "\n
Here are some snippets from my Git configuration file.<\/p>\n\n
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.<\/p>\n\n
I use I also have and use a number of aliases.<\/p>\n\n Some like I also have some like This is a snapshot of my Git configuration. The full version is on GitHub<\/a>.<\/p>\n\n ",
"format": "full_html",
"processed": "\n Here are some snippets from my Git configuration file.<\/p>\n\n 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.<\/p>\n\n I use I also have and use a number of aliases.<\/p>\n\n Some like I also have some like This is a snapshot of my Git configuration. The full version is on GitHub<\/a>.<\/p>\n\n ",
"summary": null
}
]
}branch.autosetuprebase = always<\/code> and
pull.rebase = true<\/code> configure Git to always rebase instead of pull. It does this for all branches, though I might override this for
main<\/code> branches.<\/p>\n\n
pull.ff = only<\/code> and
merge.ff = only<\/code> 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<\/code> option on the command line.<\/p>\n\n
checkout.defaultRemote = origin<\/code> to ensure that the
origin<\/code> remote is used if I have multiple remotes configured, and
push.default = upstream<\/code> to set the default remote to push to.<\/p>\n\n
merge.autoStash<\/code> allows for running merges on a dirty worktree by automatically creating and re-applying a stash of the changes, and
fetch.prune<\/code> will automatically prune branches on fetch - keeping things tidy.<\/p>\n\n
pl = pull<\/code> and
ps = push<\/code> are shorter versions of existing commands, and some like
aa = add --all<\/code>,
fixup = commit --fixup<\/code> and some additional arguments to commands.<\/p>\n\n
current-branch = rev-parse --abbrev-ref HEAD<\/code> and
worktrees = worktree list<\/code> which add simple additional commands, and some like
repush = !git pull --rebase && git push<\/code> which use execute shell commands to execute more complex commands or combine multiple commands.<\/p>\n\n
branch.autosetuprebase = always<\/code> and
pull.rebase = true<\/code> configure Git to always rebase instead of pull. It does this for all branches, though I might override this for
main<\/code> branches.<\/p>\n\n
pull.ff = only<\/code> and
merge.ff = only<\/code> 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<\/code> option on the command line.<\/p>\n\n
checkout.defaultRemote = origin<\/code> to ensure that the
origin<\/code> remote is used if I have multiple remotes configured, and
push.default = upstream<\/code> to set the default remote to push to.<\/p>\n\n
merge.autoStash<\/code> allows for running merges on a dirty worktree by automatically creating and re-applying a stash of the changes, and
fetch.prune<\/code> will automatically prune branches on fetch - keeping things tidy.<\/p>\n\n
pl = pull<\/code> and
ps = push<\/code> are shorter versions of existing commands, and some like
aa = add --all<\/code>,
fixup = commit --fixup<\/code> and some additional arguments to commands.<\/p>\n\n
current-branch = rev-parse --abbrev-ref HEAD<\/code> and
worktrees = worktree list<\/code> which add simple additional commands, and some like
repush = !git pull --rebase && git push<\/code> which use execute shell commands to execute more complex commands or combine multiple commands.<\/p>\n\n