DEV Community

Cover image for Git branching for small teams

Git branching for small teams

Victoria Drake on May 23, 2022

Here’s a practice I use personally and encourage within my open source projects and any small teams I run for work. I’ve seen major elements of ...
Collapse
 
po0q profile image
pO0q 🦄 • Edited

UNIX mindset.

I think branches that take time and diverge from the main branch are always problematic. There are best practices and software to resolve conflicts, and regular merges from master can ease the pain, but, in my experience, it's often time-consuming, especially when there are lots of contributors and workflows on the same app.

All the points you mentioned, like having a good naming convention and stick with it or delete merged branches, are critical.

For old branches, it occurred to me that some organizations like to keep them for various reasons I won't mention here, but if you have lots of branches, it will impact the size of repo for sure, which may impact CI/CD processes as well.

Tags are really handy to contextualize.

Collapse
 
wesen profile image
Manuel Odendahl

Did you use filter-branch for cleanup? What strategies did you use?

Collapse
 
po0q profile image
pO0q 🦄

I started by removing lots of unused old branches and tags. I extracted all heavy files that had nothing to do with the git workflow.

Yes, filter-branch with an additional option I don't remember to ignore some commits like delete commits.

I made a full backup before all operations, as it's kinda risky even when you know what you're doing. After some time, it was possible to get rid of the backup.

Thread Thread
 
wesen profile image
Manuel Odendahl

That matches things I've done in the past too. Thanks for all the answers.

Collapse
 
wesen profile image
Manuel Odendahl

Also, what were repository sizes at which CI/CD started to be impacted? In which case, what was the checkout strategy you used on the CICD builders?

Collapse
 
po0q profile image
pO0q 🦄

Lots of useless hundreds of MB ^^. I did not use any checkout strategy, I cleaned the repo.
You may experience such configuration when cloning famous open-source projects without a high-speed connection.

Thread Thread
 
wesen profile image
Manuel Odendahl

Was this because of larger files in the repository? delta-compressed gzipped text-source blobs are usually ridiculously small. But I get your point. At my last gig the monorepo was around 1.5 GB big, which was still manageable. For another big repo (which had a fair amount of binaries because of the app itself, and we had bad experience git-lfs), we used a separate "single clean history" for CICD purposes

Thread Thread
 
po0q profile image
pO0q 🦄

various causes but, yes PSD, etc, without LFS, also years and years of commits + some libraries added "as is" without package manager.

we used a separate "single clean history" for CICD purposes

how? another repository with the builds?

Thread Thread
 
wesen profile image
Manuel Odendahl

Exactly. Do normal development on the main fork. Then when a build needs to be made, squash push to the other fork. I'm not sure exactly how we scripted cutting off the history to avoid "blowing" up the other repo, but there was a check in place.

Thread Thread
 
po0q profile image
pO0q 🦄

It's a valid approach, but the only inconvenience is indeed the scripting part, as you have take all edge cases into account.

Thread Thread
 
wesen profile image
Manuel Odendahl

this happened after I was less involved with that one project inside the company. I would probably have tried to rewrite some of the history, but I'm not sure how badly it would have impacted say, the JIRA <> github referencing, exicting pull requests, which is information I would have liked to keep. Maybe noone ever uses that information either, who knows.

Thread Thread
 
po0q profile image
pO0q 🦄

hum, dunno how it could impact hosting providers. I would say you cannot erase everything unless you remove the entire repo, but I'm not sure. In doubt, I recommend asking questions to everyone involved in the process, including "non-technical" people, to determine what should be kept.

Collapse
 
wesen profile image
Manuel Odendahl

What do you think takes time in branching?

Collapse
 
p4l3k1n6 profile image
Pale King

naming lol, sometime my developers take a lot of time to think about naming

Thread Thread
 
po0q profile image
pO0q 🦄

Pretty good sign. Naming is a critical step!

Collapse
 
po0q profile image
pO0q 🦄

Longlasting branches take time. You sometimes have to handle lots of conflicts especially with dependencies or recipes, possibly migrations, etc.

Collapse
 
zirkelc profile image
Chris Cook

I would one more thing: branch naming conventions, e.g. feature/28-add-settings-page or bugfix/issue-28. This can easily be enforced with Git Hooks and in case of Node, with packages like enforce-branch-name

Collapse
 
k4ml profile image
Kamal Mustafa

Voted for this. Protected branch is really essential for centralized workflow like this. Github didn't have this in the beginning (now it has) and it made us moved to bitbucket. It really headache when everyone has to fork the repo because we can't allow them write access to the main repo.

 
wesen profile image
Manuel Odendahl

makes sense. my background is in embedded where branches i guess have more reasons to exist than in a CICD setup. We usually have sidebranches trigger integration tests however. Every commit pushed gets run.

Collapse
 
waylonwalker profile image
Waylon Walker

locking down main is the best thing you can do for any team. we are all human and make mistakes. I often hit the protected branch error and think "whew that was close, glad its protected".

Collapse
 
filipparyz profile image
Filip Paryż

I've worked in very similar workflow to this and it's the best thing I've learned from my coworkers. We used a develop branch rather than master, and master was our release branch. Only the most stable and thoroughly tested software was merged to master, which was also when we released software to clients. We've also made sure to always make a code review before merging to develop branch and that made our codebase so much cleaner, the workflow faster and less prone to bugs.
After experiencing different approaches I'm never letting go of that workflow and I try to introduce every team I work with to it.
Thank you for such a great write up, I'll be able to show it to my co-workers :D

Collapse
 
wesen profile image
Manuel Odendahl

My last post on git got a lot of attention, which led me to start thinking a lot about how people understand git, use them in their workflow. I started gathering a list of questions that I would like to send out as a questionnaire. I would love some feedabck about the questions themselves, and if you can think of other interesting questions to ask:

gist.github.com/wesen/26982b2c7e16...

Collapse
 
wesen profile image
Manuel Odendahl

I use a very similar flow, although I often try to rebase the feature branch instead of merging in master. I will sometimes resort to merging in master when rebasing is just too confused and multiple merged features interact with the work done on the side branch.

If no feature touched a similar area, rebasing is of course trivial. If some slight conflicts occured, this means a few conflicts, and it makes to review them by hand and figure out what is going on. If things are really bad, it's time to stop, consider why the conflicts happened at a team workflow level (why were multiple people working so heavily on the same code area without coordination).

Collapse
 
andresbecker profile image
Andres Becker

Very good stuff

Collapse
 
warwait profile image
Parker Waiters

Thanks for posting

Collapse
 
volker_schukai profile image
Volker Schukai

Great article.

Branching can be hell.
The faster code is in the master, the better.

Collapse
 
wesen profile image
Manuel Odendahl

What do mean by hell exactly in this context? (I'm working on an article where I try to understand why people adopt different workflows, and what their experiences with source control are). My latest article got so much engagement that I realized there is a lot to talk about here.

Collapse
 
wesen profile image
Manuel Odendahl

Is that to save the effort to create a branch and code review?

Collapse
 
snelson1 profile image
Sophia Nelson

Awesome post

Collapse
 
jeromewilson1 profile image
Jerome Wilson

To avoid swapping branches when merging master, I tend to do this instead:

git fetch
git merge origin/master
Enter fullscreen mode Exit fullscreen mode
Collapse
 
aaravrrrrrr profile image
Aarav Reddy

Excellent read

Collapse
 
aghost7 profile image
Jonathan Boudreau • Edited

It also works pretty well for large teams provided you have good CI/CD. Keeping trunk stable is important.

Collapse
 
rafo profile image
Rafael Osipov

We're using this simple approach: dev.to/rafo/comment/1191o

Collapse
 
cjw profile image
Clifford Watson

Thanks for the read.

Collapse
 
alexandrejulien profile image
Alexandre Julien

Thanks, I will try it on a small internal library project soon !