Irbisa · Cheatsheet
Git & Team Workflow
Merge vs rebase, conflicts, reset and revert, cherry-pick, stash, reflog and bisect, branching strategies, pull requests and code review, commit conventions, secrets in history, pubspec.lock and generated files
What are a commit, a branch and
HEADin Git, and what does "detached HEAD" mean?What is the difference between
git fetchandgit pull, and what doesgit pull --rebasechange?git fetch origingit log --oneline main..origin/main # what others pushedgit log --oneline origin/main..main # what only you have git pull --rebase # fetch, then replay your commits on topgit config --global pull.rebase true # the default from now onWhat is the difference between merge and rebase, and why should you never rebase a branch other people work on?
# feature/cart was cut from main, and main has moved sincegit switch feature/cartgit rebase main # your commits replayed on top: new hashesgit push --force-with-lease # only because the branch is yours alone git switch main…How do you resolve a merge conflict step by step, and what must you never do?
git merge main# CONFLICT (content): Merge conflict in lib/cart/cart.dartgit status --short # UU lib/cart/cart.dartgit log --merge --oneline -- lib/cart/cart.dart # who changed it on each side # edit it: keep both intentions, delete <<<<<<< ||||||| ======= >>>>>>>…What do
git stashandgit cherry-pickdo, and what are the traps of each?How does
.gitignorework, and why does Git keep tracking a file after you add it there?# android/.gitignore already lists /local.properties, yet:git ls-files android/local.properties # prints the path: the file is trackedgit status --short # M android/local.properties git rm --cached android/local.propertiesgit commit -m "chore: stop tracking android/local.properties"…How do you make every developer and CI build with the same Flutter version, and what goes into git for it?
fvm use 3.38.0 # writes .fvmrc, links .fvm/flutter_sdk, updates .gitignoregit add .fvmrc .gitignoregit commit -m "build: pin Flutter 3.38.0" # a teammate after cloningfvm install # installs the version named in .fvmrc…After
git merge main, bothpubspec.yamlandpubspec.lockconflict. How do you resolve them without hand-editing the lock file?git merge main# CONFLICT (content): Merge conflict in pubspec.yaml# CONFLICT (content): Merge conflict in pubspec.lock # 1) pubspec.yaml by hand: keep both sides' new dependencies# 2) main's lock, then let pub add your packages on top…Each command below runs on its own from the same pushed history. What do
git logandgit statusshow after each, and which is safe on a pushed branch?# main, already pushed:# c3 Add retry <- HEAD# b2 Add client# a1 Init# c3 changed lib/data/api_client.dart; the working tree is clean. git reset --soft HEAD~1 # Agit reset HEAD~1 # B (--mixed is the default)git reset --hard HEAD~1 # Cgit revert HEAD # DHow do you clean up your branch with an interactive rebase before merging, and why push with
--force-with-leaseinstead of--force?git fetch origingit rebase -i --autosquash origin/main # the todo list Git opens, after your edits# (--autosquash already moved the fixup! commit under its target):pick 3f9c2e1 # feat: cart badge…After a
git reset --hardor a rebase gone wrong, your commits seem lost. How do you get them back, and when can you not?$ git reset --hard HEAD~2 # oops: two commits "gone"$ git refloga872130 HEAD@{0}: reset: moving to HEAD~2d6eb664 HEAD@{1}: commit: Debounce search7a7b367 HEAD@{2}: commit: Add search fielda872130 HEAD@{3}: checkout: moving from main to feature/search…How does
git bisectfind the commit that broke something, and how do you automate it withgit bisect run?git bisect startgit bisect bad # HEAD: the cart total is wronggit bisect good v1.4.0 # the last release where it was right# Bisecting: 37 revisions left to test after this (roughly 5 steps) # test/cart_total_regression_test.dart is new and untracked…What makes a good commit message, and how do Conventional Commits turn the history into version numbers and a changelog?
feat(cart): show a discount badge on eligible items The badge reads the rule from /v2/discounts instead of theclient-side list, so marketing can change rules without a release. Closes #418…What makes a pull request easy to review, and how do you handle review comments you disagree with?
Your feature branch has lived for three weeks and now conflicts with half of
main. How do you get it merged, and how do you avoid this next time?You committed a secret and pushed it. What do you do, and why is deleting it in a new commit not enough?
# 0) Revoke the secret at the provider and ship the new one. Only then:git clone git@github.com:acme/shop.git shop-clean && cd shop-clean # drop the file from every commitgit filter-repo --sensitive-data-removal --invert-paths --path config/prod.json# or replace the value wherever it appears ("old==>new" per line):…PR #42 broke checkout, so its merge was reverted on
main. The author fixed the branch and merged it again, yetmainstill has no discounts. Why?git switch maingit merge --no-ff feature/discounts # PR #42: two feature commitsgit revert -m 1 HEAD # checkout broke: undo the mergegit push git switch feature/discounts# add a guard in lib/cart/cart.dart, away from the lines the feature changedgit commit -am "fix: skip checkout for an empty cart"git switch maingit merge feature/discounts # merges cleanlyWhen would you keep several apps and shared libraries in one monorepo instead of separate repositories, and what does each choice cost?