- Published on
Git Better Together: A Teams Journey with SourceTree
- Authors
- Name
- Zairyl Zafra
- @zrylzfra
The Beginning: Terminal Terror
Alex stared at the terminal, hands trembling over the keyboard.
$ git push origin main
To https://github.com/company/project.git
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/company/project.git'
"Not again," Alex muttered. It was their first week at TechFlow Solutions, and they'd already caused three merge conflicts. The terminal felt like a black box of mystery commands that could either save the day or destroy hours of work.
Sarah, the senior developer, rolled her chair over. "Still fighting with Git commands?"
"I just want to push my changes," Alex sighed. "But Git keeps rejecting everything. I don't understand what 'non-fast-forward' means, and I'm terrified I'll mess up the team's code."
Sarah smiled. "Let me show you something that changed my life."
The Discovery: SourceTree
Sarah opened an application that looked nothing like the intimidating terminal. It was SourceTree—a beautiful visual interface showing their project's Git history as a colorful tree diagram.
"This," Sarah explained, "is how our whole team manages Git. No memorizing commands. Just point and click."

Alex's eyes widened. They could actually see the branches, commits, and merges. It was like someone had turned on the lights in a dark room.
Understanding the Visual Tree
main ●──●──●──●──● (Sarah's latest commit)
\
feature ●──●──● (Alex's work)
"See this?" Sarah pointed at the screen. "Each dot is a commit. The branches show who's working on what. You can see exactly where you diverged from the main branch."
For the first time, Git made sense to Alex.
Day 1: The First Collaboration
Setting Up the Workflow
The team at TechFlow used a structured Git workflow:
Branch Strategy:
main- Production-ready codedevelop- Integration branchfeature/*- Individual featureshotfix/*- Emergency fixesrelease/*- Release preparation
Sarah showed Alex how to visualize this in SourceTree:

The morning standup revealed the day's tasks:
- Sarah: Working on user authentication (
feature/auth-system) - Marcus: Building the payment gateway (
feature/payment-integration) - Lisa: Redesigning the dashboard (
feature/dashboard-redesign) - Alex: Adding a new search feature (
feature/search-functionality)
"Everyone works on their own feature branch," Sarah explained. "We merge to develop when ready, then to main for production."
Creating Alex's First Branch
Sarah walked Alex through the process in SourceTree:
Step 1: Sync with Remote
Right-click on 'origin/develop' → Checkout origin/develop
Click 'Pull' button to get latest changes
Visual feedback in SourceTree:
✓ Fetched from origin
✓ develop is up to date
✓ No conflicts detected
Step 2: Create Feature Branch
Click 'Branch' button
Name: feature/search-functionality
Start point: develop
☑ Checkout new branch
SourceTree instantly showed the new branch:
develop ●──●──●──●
\
feature/search ● (Alex is here)
"Now you're in your own safe space," Sarah said. "Nothing you do here will affect anyone else's work."
Alex felt relief wash over them. No more fear of breaking production!
Making the First Commit
Alex spent the morning coding. When it was time to commit:
In SourceTree's File Status view:
Unstaged Files:
M src/components/SearchBar.jsx
M src/utils/searchHelper.js
A src/tests/search.test.js
Sarah showed the workflow:
Step 1: Review Changes
Click on each file to see diff
✓ Green = added lines
✗ Red = removed lines
Step 2: Stage Files
☑ src/components/SearchBar.jsx
☑ src/utils/searchHelper.js
☑ src/tests/search.test.js
All changes staged ✓
Step 3: Write Commit Message
Subject: Add search bar component with autocomplete
- Implemented SearchBar component
- Added debounced search helper
- Created unit tests for search functionality
- Integrated with existing API
Ticket: TECH-1234
Step 4: Commit
Click 'Commit' button
The tree updated instantly:
develop ●──●──●──●
\
feature/search ●──● (Alex's commits)
"See?" Sarah smiled. "You just made your first proper commit. And you could see exactly what you changed before committing."
Day 3: The First Merge Conflict (And How SourceTree Saved the Day)
The Conflict Arises
Alex had been working for two days when disaster struck. They clicked 'Pull' to get the latest changes from develop, and SourceTree showed an ominous message:
⚠️ MERGE CONFLICT
Automatic merge failed; fix conflicts and then commit the result.
Conflicted files:
⚡ src/components/SearchBar.jsx
"Don't panic," Marcus said, appearing beside Alex's desk. "Conflicts are normal when teams work together. SourceTree makes them easy to fix."
Understanding the Conflict
Marcus showed Alex the conflict in SourceTree's diff view:
// src/components/SearchBar.jsx
<<<<<<< HEAD (Your changes)
function SearchBar() {
const [query, setQuery] = useState('');
const [results, setResults] = useState([]);
return (
<input
value={query}
onChange={(e) => setQuery(e.target.value)}
placeholder="Search products..."
/>
);
}
=======
function SearchBar() {
const [searchTerm, setSearchTerm] = useState('');
const [suggestions, setSuggestions] = useState([]);
return (
<input
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
placeholder="Search our catalog..."
/>
);
}
>>>>>>> develop (Incoming changes)
"See what happened?" Marcus explained. "Sarah updated this file on develop while you were working. She renamed the variables and changed the placeholder. Your version and hers both modified the same lines."
Resolving with SourceTree's Merge Tool
Step 1: Launch External Merge Tool
Right-click conflicted file → Resolve Conflicts → Launch External Merge Tool
SourceTree opened a three-way merge view:
┌─────────────────┬─────────────────┬─────────────────┐
│ BASE │ LOCAL (Yours) │ REMOTE (Team) │
│ (Original) │ │ │
├─────────────────┼─────────────────┼─────────────────┤
│ function │ function │ function │
│ SearchBar() { │ SearchBar() { │ SearchBar() { │
│ const [term, │ const [query, │ const │
│ setTerm]... │ setQuery]... │ [searchTerm, │
│ │ │ setSearch... │
└─────────────────┴─────────────────┴─────────────────┘
↓
┌─────────────────┐
│ RESULT │
│ (Your choice) │
└─────────────────┘
Step 2: Choose Resolution Strategy
Marcus showed Alex three options:
1. Keep Mine (Your changes)
→ Use your variable names
2. Keep Theirs (Sarah's changes)
→ Use Sarah's variable names
3. Manual Merge (Best option)
→ Combine the best of both
"Let's combine them," Marcus suggested. "Use Sarah's naming convention—it's our team standard—but keep your better placeholder text."
Step 3: Manual Resolution
function SearchBar() {
// Using Sarah's variable names (team standard)
const [searchTerm, setSearchTerm] = useState('')
const [suggestions, setSuggestions] = useState([])
return (
<input
value={searchTerm}
onChange={(e) => setSearchTerm(e.target.value)}
// Keeping Alex's better placeholder
placeholder="Search products..."
/>
)
}
Step 4: Mark as Resolved
Click 'Save' in merge tool
SourceTree updates:
✓ src/components/SearchBar.jsx (resolved)
Step 5: Commit the Merge
Commit message: Merge develop into feature/search-functionality
Resolved conflicts in SearchBar component:
- Adopted team naming convention for variables
- Kept improved placeholder text
The tree showed the merge:
develop ●──●──●──●──●
\ \
feature/search ●──●──● (conflict resolved!)
"That's it!" Marcus grinned. "You just handled your first merge conflict like a pro."
Alex felt a surge of confidence. What seemed terrifying in the terminal was manageable in SourceTree.
Day 7: Team Code Review with SourceTree
Creating a Pull Request
Alex's search feature was ready. Lisa, the team lead, walked them through the code review process.
Step 1: Push Feature Branch
In SourceTree:
Click 'Push' button
☑ feature/search-functionality
→ Push to origin
Visual confirmation:
Local: feature/search-functionality ●──●──●──●
↓ Pushed
Remote: origin/feature/search... ●──●──●──●
Step 2: Create Pull Request
Click 'Create Pull Request' in SourceTree
(Opens GitHub/Bitbucket)
Title: Add search functionality with autocomplete
Base: develop ← feature/search-functionality
Description:
## Changes
- Implemented search bar component
- Added autocomplete suggestions
- Integrated with product API
- Added comprehensive tests
## Testing
- ✓ Unit tests pass
- ✓ Integration tests pass
- ✓ Manual testing completed
## Screenshots
[Attach screenshots]
Reviewers: @sarah @marcus
The Review Process
The team gathered around Lisa's monitor. She opened SourceTree and checked out Alex's branch:
In SourceTree:
Double-click 'origin/feature/search-functionality'
Application runs with Alex's changes
Lisa's feedback using SourceTree:
"Let me check the history..." Lisa clicked through commits:
Commits on feature/search-functionality:
● Add search tests (2 days ago)
● Implement autocomplete logic (3 days ago)
● Add SearchBar component (4 days ago)
● Initial search setup (5 days ago)
She clicked on each commit to review:
Commit: "Add SearchBar component"
Files changed: 3
+ src/components/SearchBar.jsx (+84 lines)
+ src/styles/SearchBar.css (+23 lines)
M src/components/Header.jsx (+2, -1 lines)
Lisa's comment: "Nice component structure!"
Commit: "Implement autocomplete logic"
Files changed: 2
+ src/utils/autocomplete.js (+45 lines)
M src/components/SearchBar.jsx (+15, -3 lines)
Sarah's comment: "Consider debouncing the API calls"
Commit: "Add search tests"
Files changed: 1
+ src/tests/search.test.js (+67 lines)
Marcus's comment: "Great test coverage! 👍"
Addressing Review Feedback
Alex made the requested changes:
Step 1: Checkout Branch Again
In SourceTree:
Double-click feature/search-functionality
Step 2: Make Changes
// src/utils/autocomplete.js
// Added debouncing as Sarah suggested
import { debounce } from 'lodash'
const fetchSuggestions = debounce(async (query) => {
const response = await fetch(`/api/search?q=${query}`)
return response.json()
}, 300) // Wait 300ms after user stops typing
Step 3: Commit Changes
Modified files:
M src/utils/autocomplete.js
Commit message: Add debouncing to search API calls
- Debounce autocomplete requests (300ms)
- Reduces API calls by ~80%
- Improves performance
Addresses: @sarah's review comment
Step 4: Push Update
Click 'Push' button
→ Updates pull request automatically
The PR updated in real-time:
Pull Request #42: Add search functionality
✓ All checks passed
✓ 3 approvals
✓ No conflicts with develop
✓ Ready to merge
Day 14: The Big Release
Pre-Merge Preparation
Release day arrived. The team had five feature branches ready to merge into develop, then into main for production.
Lisa coordinated using SourceTree's graph view:
main ●──●──●──●
\
develop ●──●──●──●──●
\ \ \ \ \
feature/search ● ● ● ● ●
feature/payment ● ● ● ●
feature/dashboard ● ● ●
feature/analytics ● ●
feature/notifications ●
"Everyone's features are ready," Lisa announced. "Let's merge them one by one, testing after each merge."
The Merge Sequence
Merge 1: Alex's Search Feature
In SourceTree:
1. Checkout develop
2. Right-click feature/search-functionality
3. Select 'Merge feature/search... into develop'
4. Check '☑ Create merge commit'
5. Click OK
Result:
✓ Merged successfully
✓ No conflicts
✓ Tests pass
Merge 2: Marcus's Payment Integration
Same process...
Result:
⚠️ 1 conflict in config/payment.js
Resolution:
- Used merge tool
- Kept both configurations
- Added environment variable check
✓ Resolved and committed
Merges 3-5: Dashboard, Analytics, Notifications
All merged successfully:
✓ Dashboard redesign
✓ Analytics tracking
✓ Push notifications
Final develop tree:
develop ●──●──●──●──●──●──●
Testing the Integration
The team ran the complete test suite:
npm run test
Test Suites: 48 passed, 48 total
Tests: 234 passed, 234 total
Coverage: 87.3%
"Perfect," Lisa smiled. "Everything works together. Time for production!"
The Production Deployment
Step 1: Create Release Branch
In SourceTree:
Branch from: develop
Branch name: release/v2.0.0
☑ Checkout new branch
Step 2: Update Version Numbers
// package.json
{
"version": "2.0.0",
"name": "techflow-app"
}
// Commit
Commit message: Bump version to 2.0.0
Step 3: Merge to Main
In SourceTree:
Checkout main
Right-click release/v2.0.0
Select 'Merge release/v2.0.0 into main'
Result:
✓ Merged successfully
Step 4: Tag the Release
In SourceTree:
Right-click latest commit on main
Select 'Tag...'
Tag name: v2.0.0
Message:
Release v2.0.0 - Major Feature Update
New Features:
- Advanced search with autocomplete
- Payment gateway integration
- Redesigned dashboard
- Analytics tracking
- Push notifications
Contributors: @alex @sarah @marcus @lisa
☑ Push tag to origin
The final tree looked beautiful:
main ●──●──●──●──●──● 📌 v2.0.0
/
develop ●──●──●──●──●
Step 5: Deploy
# CI/CD automatically triggered
Deploying v2.0.0 to production...
✓ Tests passed
✓ Build successful
✓ Deployed to staging
✓ Smoke tests passed
✓ Deployed to production
🎉 Deployment successful!
Day 30: Alex's Reflection
A month into the job, Alex sat in the team retrospective.
"Remember when you couldn't push code?" Sarah teased.
Alex laughed. "I was terrified of Git! Now I actually enjoy it."
"What changed?" Lisa asked.
"SourceTree made Git visual," Alex explained. "I can see what's happening:
- The branch structure - Who's working on what
- The commit history - What changed and when
- Merge conflicts - Exactly where they are and how to fix them
- Team collaboration - How our work comes together
"With the terminal, I was memorizing commands without understanding. With SourceTree, I understand Git itself."
Marcus nodded. "That's why our whole team uses it. Even those who know command-line Git prefer the visual representation."
The Team's SourceTree Workflow
Over time, Alex learned the team's established practices:
Morning Routine
Every day at 9 AM:
1. Open SourceTree
2. Click 'Fetch' (check for updates)
3. Review what teammates pushed overnight
4. Pull latest changes to develop
5. Check for any merge needed
Visual check:
origin/develop ●──●──● (3 new commits)
↓
local/develop ●──● (Pull needed)
During Development
Throughout the day:
1. Work in small commits
- Commit message: Clear and descriptive
- Stage only related changes
- Review diff before committing
2. Push frequently
- At least every 2-3 commits
- Before lunch
- Before going home
3. Pull before pushing
- Avoid conflicts
- Stay synchronized
Code Review Process
When reviewing PRs:
1. In SourceTree, checkout PR branch
2. Click through each commit
3. Review file changes visually
4. Test locally
5. Comment on specific commits
6. Approve or request changes
Emergency Hotfixes
Production bug discovered:
1. Checkout main branch
2. Create hotfix/bug-name branch
3. Fix the bug
4. Test thoroughly
5. Merge to main (deploy)
6. Merge to develop (keep in sync)
Visual flow:
main ●──●──●──● 🔥 Bug!
\
hotfix ● (Quick fix)
\
main ●──● ✓ Fixed!
Advanced SourceTree Features the Team Uses
1. Stash - Save Work in Progress
Scenario: Alex is coding when Sarah asks for urgent help.
In SourceTree:
Click 'Stash' button
Message: "WIP: Search filter implementation"
Your working directory is clean!
Changes safely stored in stash.
Help Sarah with her issue...
Later, restore your work:
Right-click stash
Select 'Apply stash'
Your changes are back!
2. Cherry-Pick - Apply Specific Commits
Scenario: Marcus made a bug fix in his feature branch that's needed on develop now.
In SourceTree:
Checkout develop
Right-click Marcus's commit
Select 'Cherry-pick...'
That one commit is now on develop!
Without merging the entire branch.
3. Interactive Rebase - Clean Commit History
Scenario: Alex made 10 messy commits while experimenting.
In SourceTree:
Right-click the first commit
Select 'Rebase children of [commit] interactively...'
Rebase options:
Pick - Keep commit
Squash - Combine with previous
Edit - Modify commit message
Drop - Remove commit
Alex's 10 messy commits → 3 clean commits
4. Blame/Annotate - Find Who Changed What
Scenario: A bug appeared in old code. Who wrote it?
In SourceTree:
Right-click file → Annotate
Each line shows:
- Who wrote it
- When it was written
- Which commit
Click line → See full commit details
5. Submodules - Manage Dependencies
Scenario: The team uses a shared component library.
In SourceTree:
Repository → Add Submodule
URL: https://github.com/company/shared-components
Visual submodule management:
- See submodule version
- Update to latest
- Track changes separately
Real-World Scenarios: How SourceTree Saved the Day
Scenario 1: The Accidental Commit to Main
The Mistake:
Sarah: "Oh no! I committed directly to main instead of my feature branch!"
main ●──●──●──●──● ⚠️ (Oops!)
The Fix with SourceTree:
1. Right-click the accidental commit
2. Select 'Reset current branch to this commit'
3. Select 'Mixed' (keeps changes, uncommits)
4. Create feature branch
5. Commit to correct branch
6. Force push to fix remote main
Crisis averted!
Scenario 2: The Lost Commit
The Problem:
Marcus: "I accidentally deleted my branch with 3 days of work!"
The Recovery with SourceTree:
In SourceTree:
View → Show All Branches
☑ Show Remote Branches
☑ Show Tags
☑ Show Stashes
☑ Show All Commits (Important!)
Search for commit message...
Found it! Git never truly deletes commits.
Right-click found commit
Select 'Cherry-pick...'
Work recovered!
Scenario 3: The Complex Merge
The Situation:
Lisa: "We need to merge a 2-month-old feature branch into develop.
It diverged significantly."
develop ●──●──●──●──●──●──●──●
\
old-feature ●──●──●──●──●──●
(47 commits behind)
The Strategy with SourceTree:
1. Visualize the divergence
- See exactly where it split
- Count commits behind (47)
- Identify changed files
2. Update feature branch first
Checkout old-feature
Merge develop into old-feature
Fix conflicts incrementally
3. Test thoroughly
4. Then merge to develop
Much easier now!
SourceTree showed each conflict clearly.
Fixed 12 conflicts across 8 files.
Success!
Scenario 4: The Rollback
The Problem:
Production deployed.
10 minutes later: Critical bug discovered!
Need to rollback immediately.
The Solution with SourceTree:
1. Identify last good commit
main ●──●──●──● ⚠️ (Bad)
↑
Last good
2. Right-click last good commit
Select 'Reset current branch...'
Select 'Hard' (discard all changes)
3. Force push to production
☑ Force push
Production rolled back in 2 minutes!
Then fix the bug properly in a branch.
The Team's Growth
Month 3: Smooth Collaboration
The team's velocity doubled. SourceTree enabled:
Better Communication:
Team chat:
Sarah: "Just pushed auth improvements to develop"
Alex: *Checks SourceTree* "Saw it! Pulling now."
Marcus: "I'll merge that into my payment branch"
Fewer Conflicts:
Before SourceTree: 5-10 conflicts per day
After SourceTree: 1-2 conflicts per week
Why?
- Team can see each other's branches
- Coordinate work visually
- Pull changes proactively
Faster Onboarding:
New developer joins:
Day 1: Install SourceTree
Day 2: Make first commit
Day 3: Handle first merge
Day 5: Comfortable with Git workflow
Before: Took 2-3 weeks
Month 6: Advanced Workflows
The team adopted advanced practices:
Git Flow with SourceTree:
main
└─→ hotfix/critical-fix → main
develop
└─→ release/v3.0 → main → develop
└─→ feature/new-auth → develop
Automated Workflows:
SourceTree + CI/CD:
Commit → SourceTree
↓
Push → GitHub
↓
Tests → GitHub Actions
↓
Deploy → Production (if main)
Team Metrics:
Tracked in SourceTree:
- Commits per developer
- Merge frequency
- Conflict resolution time
- Code review turnaround
Data-driven improvements!
Lessons Learned
Alex's Key Takeaways
1. Visualizing Git Makes It Understandable
Command line: Abstract concepts
SourceTree: See the structure
Understanding → Confidence → Productivity
2. Team Collaboration Requires Visibility
What are teammates working on?
Where might conflicts occur?
When should I pull changes?
SourceTree answers these questions visually.
3. Mistakes Are Easy to Fix
Wrong branch? Reset.
Bad commit? Revert.
Lost work? Reflog.
SourceTree makes recovery visual and safe.
4. Learning Git Properly Matters
SourceTree teaches Git concepts:
- Branches
- Commits
- Merges
- Rebases
Not just memorizing commands.
Team Best Practices
1. Commit Messages Matter
Bad: "fix"
Good: "Fix search bar dropdown alignment issue
- Adjusted CSS positioning
- Added responsive breakpoints
- Tested on mobile devices
Fixes: TECH-456"
SourceTree displays these beautifully.
2. Small, Frequent Commits
Better: 10 small commits
Worse: 1 giant commit
Why?
- Easier to review
- Easier to revert
- Better history
- SourceTree shows each change clearly
3. Pull Before Push
Daily routine:
1. Fetch (check updates)
2. Pull (get changes)
3. Work (make changes)
4. Push (share work)
SourceTree makes this workflow smooth.
4. Use Feature Branches
Never commit directly to:
- main
- develop
Always use feature branches:
- feature/search
- bugfix/dropdown
- hotfix/security-patch
SourceTree keeps them organized.
The Transformation
Before SourceTree
Team struggles:
- Frequent merge conflicts
- Lost code
- Confusing history
- Slow code reviews
- Fear of Git commands
- Poor collaboration
Productivity: 60% of potential
After SourceTree
Team strengths:
- Rare conflicts
- Safe experimentation
- Clear history
- Fast reviews
- Git confidence
- Seamless collaboration
Productivity: 95% of potential
Conclusion: A Year Later
Alex looked at SourceTree's commit graph—365 days of work visualized beautifully.
main ●──●──●──●──●──●──●──●──● (45 releases)
\ \ \ \ \ \ \ \ \
develop ●──●──●──●──●──●──●──●──● (230 features merged)
"Remember when you were terrified of Git?" Sarah asked.
Alex smiled. "Now I teach new developers how to use it. SourceTree transformed Git from a scary command-line tool into a visual collaboration platform."
"That's the power of good tooling," Lisa added. "SourceTree didn't just help you learn Git—it helped our entire team work better together."
The team had shipped:
- 45 production releases
- 230 features
- 1,247 commits
- Zero critical Git disasters
All visible in SourceTree's beautiful commit tree.
Getting Started with SourceTree
Installation
Download SourceTree:
- Visit sourcetreeapp.com
- Available for Windows and macOS
- Free forever
- No credit card required
Setup:
1. Install SourceTree
2. Connect GitHub/Bitbucket account
3. Clone your first repository
4. Start collaborating!
Essential SourceTree Features
Graph View:
- Visualize entire project history
- See all branches simultaneously
- Identify merge points
- Track divergence
File Status:
- See modified files
- Review changes before committing
- Stage/unstage selectively
- Compare versions side-by-side
Merge Tools:
- Visual conflict resolution
- Three-way merge view
- Pick changes intuitively
- Safe conflict resolution
Interactive Rebase:
- Reorganize commits
- Combine related changes
- Clean up history
- Edit commit messages
Resources
Official Documentation:
Community:
"Git is powerful. SourceTree makes that power accessible. Together, they transform how teams collaborate." - The TechFlow Solutions Story
Ready to visualize your Git workflow? Download SourceTree today! 🌳