A free, professional-grade Git GUI for macOS built with Swift and SwiftUI, featuring excellent diff visualization and complete GitTower feature parity.
- Features
- Requirements
- Installation
- Usage Guide
- Keyboard Shortcuts
- Service Integrations
- Advanced Features
- User Experience Design
- Architecture
- Technical Decisions
- Working Tree Status: View staged, unstaged, and untracked files with clear visual indicators
- File Staging: Stage entire files, individual hunks, or specific lines
- Partial Staging Indicator: Half-checked icons show partially staged files
- Stage/Unstage All: One-click staging for all changes
- Discard Changes: Discard entire files, hunks, or selected lines with confirmation
- Commit Message Editor: Subject line (50 char guide) and body (72 char wrap)
- Commit Templates: Create, edit, delete, and import reusable templates
- Spell Checking: Automatic spell check in commit messages
- Amend Commits: Modify the last commit with or without message changes
- GPG Signing: Sign commits with your GPG key
- Override Author: Custom author identity per commit
- Gitmoji Support: Type "::" in subject to open emoji picker
- Unified Diff View: Single-column diff with context
- Split Diff View: Side-by-side comparison with scroll sync
- Syntax Highlighting: Language-aware highlighting for 200+ languages
- Word-Level Highlighting: Smart tokenization identifies exactly what changed
- Line Numbers: Toggle old and new line numbers
- Whitespace Visualization: Show spaces, tabs, and newlines
- Ignore Whitespace: Option to hide whitespace-only changes
- Image Diffing: Visual comparison for PNG, JPG, and other formats
- Diff Search: Find text within diffs with ⌘F
- Virtualized Rendering: Smooth performance with 5000+ line diffs
- Local Branches: Create, rename, delete, checkout branches
- Remote Branches: View, checkout, track remote branches
- Visual Branch Graph: Interactive commit graph visualization
- Ahead/Behind Indicators: Track sync status with upstream
- Set Upstream: Configure tracking for local branches
- Branch Comparison: Compare two branches side-by-side
- Merge Operations: Normal, squash, and fast-forward merge
- Rebase Operations: Rebase onto any branch
- Branch Review: Identify stale and merged branches
- Branch Archiving: Archive branches to hide without deleting
- Lightweight Tags: Simple tags without metadata
- Annotated Tags: Tags with message and author info
- Push Tags: Push individual or all tags to remote
- Delete Tags: Remove local and remote tags
- Create from Commit: Tag any commit via drag-and-drop
- Add/Remove Remotes: Manage multiple remotes
- Rename Remotes: Change remote names
- Edit Remote URL: Modify fetch and push URLs
- Fetch: Download changes from all or specific remotes
- Pull: Fetch and merge or rebase
- Push: Push with force push and force-with-lease options
- Prune: Remove stale remote-tracking branches
- Sync: One-click fetch, pull, and push
- Create Stash: Save work-in-progress with optional message
- Include Untracked: Option to stash untracked files
- Include Ignored: Option to stash ignored files
- Apply Stash: Apply without removing from stash list
- Pop Stash: Apply and remove from stash list
- Drop Stash: Delete a stash
- Rename Stash: Change stash message
- View Stash Diff: Inspect stash contents before applying
- Partial Apply: Apply only specific files from a stash
- Commit Graph: Visual representation of branch history
- Commit List: Linear view with metadata
- Commit Details: Full commit info, changed files, and diff
- Author Avatars: Gravatar integration
- Filter by Author: Show only specific author's commits
- Filter by Date: Commits within a date range
- Search Messages: Find commits by message content
- Filter by Path: Commits affecting specific files
- File History: Full history for any file
- Blame View: Line-by-line attribution with age coloring
- Copy Commit Hash: Quick copy SHA to clipboard
- Revert Commit: Create a commit that undoes changes
- Cherry-Pick: Apply any commit to current branch
- Reset (Soft/Mixed/Hard): Move HEAD with different staging behaviors
- Create Branch: New branch from any commit
- Create Tag: Tag any commit
- Visual Rebase Editor: Drag-and-drop interface
- Reorder Commits: Move commits up/down
- Squash Commits: Combine multiple commits
- Fixup Commits: Squash without message merge
- Drop Commits: Remove from history
- Edit Commits: Stop to modify commit content
- Reword Messages: Change commit messages only
- Continue/Skip/Abort: Full control over rebase flow
- Conflict Detection: Automatic identification of conflicts
- Three-Way Editor: View ours, theirs, and base versions
- Accept Ours/Theirs/Both: One-click resolution options
- Manual Editing: Full control over final resolution
- Mark Resolved: Complete conflict resolution workflow
- Detect Submodules: Automatic detection on repo open
- Initialize: Clone submodule content
- Update: Pull submodule changes
- Update All: Recursive update
- Open Submodule: Open as separate repository
- View Diff: See submodule pointer changes
- Add Submodule: Add new submodule by URL
- Remove Submodule: Clean removal
- View Worktrees: List all linked worktrees
- Create Worktree: New worktree for parallel work
- Remove Worktree: Clean deletion
- View Reflog: Full reference log history
- Filter by Ref: Branch-specific reflog
- Restore Commits: Recover lost commits
- Restore Branches: Recreate deleted branches
- Initialize: Set up git-flow branches
- Features: Start and finish features
- Releases: Start and finish releases
- Hotfixes: Start and finish hotfixes
- LFS Detection: Automatic detection of tracked files
- File Indicators: Visual badge for LFS files
- Track/Untrack: Manage LFS patterns
- Fetch/Pull/Push: Automatic with git operations
- macOS 13.0 (Ventura) or later
- Git installed on the system (default:
/usr/bin/git)
curl -fsSL https://raw.githubusercontent.com/Nicolas-Arsenault/GitFlow/main/scripts/install.sh | bashbrew tap nicolas-arsenault/tap
brew install --cask gitflow-guiTo update:
brew upgrade --cask gitflow-gui- Go to the Releases page
- Download the latest
GitFlow-x.x.x.dmg - Open the DMG and drag GitFlow to Applications
First Launch: macOS shows a warning for unsigned apps. To open:
- Right-click GitFlow.app and select "Open", then click "Open" in the dialog
- Or run:
xattr -cr /Applications/GitFlow.app
git clone https://github.com/Nicolas-Arsenault/GitFlow.git
cd GitFlow
./scripts/build-dmg.sh- Launch GitFlow
- Click "Open Repository" or use ⌘O
- Select a folder containing a Git repository
- Or drag a folder onto the app window
- Click "Clone Repository" on the welcome screen
- Enter the repository URL (HTTPS, SSH, or local path)
- Choose a destination folder
- Optionally specify a branch to clone
- Click "Clone"
- Stage File: Click checkbox, right-click → Stage, or press Space
- Stage All: Click "Stage All" button
- Stage Hunk: Hover over hunk header → "Stage Hunk" button
- Stage Lines: Select lines in diff → "Stage Lines" button
- Unstage: Same operations in staged section
- Stage the files you want to commit
- Enter a commit message (subject and optional body)
- Click "Commit" or press ⌘↩
- Select a file to view changes in the diff pane
- Toggle Unified/Split view in toolbar
- Enable/disable line numbers in settings
- Search with ⌘F, navigate with Enter or arrow buttons
- Click "History" in the sidebar
- Select a commit to view details and changes
- Use filters to find specific commits
- Click "Branches" in the sidebar
- Checkout: Double-click or right-click → Checkout
- Create: Click + button
- Delete: Right-click → Delete
- Merge: Right-click → Merge Into Current
- Drag: Drag branch to merge, ⌥-drag to rebase
- Click "Stashes" in the sidebar
- Create: Click + button, add message
- Apply/Pop/Drop: Right-click menu
- View: Select to see stash contents
- Fetch: Toolbar button or Sync view
- Pull: Toolbar button (right-click for rebase option)
- Push: Toolbar button (right-click for force push)
- Sync: Toolbar button for fetch + pull + push
| Action | Shortcut |
|---|---|
| Open Repository | ⌘O |
| Refresh | ⌘R |
| Commit | ⌘↩ |
| Commit and Push | ⌘⇧↩ |
| Search in Diff | ⌘F |
| Command Palette | ⌘K |
| Working Copy | ⌘1 |
| History | ⌘2 |
| Stashes | ⌘3 |
| Pull Requests | ⌘4 |
| Reflog | ⌘5 |
| Jump to HEAD | ⌘0 |
| Navigate Back | ⌘[ |
| Navigate Forward | ⌘] |
| New Branch | ⌘B |
| Switch Branch | ⌘⇧B |
| Stash Changes | ⌘⇧S |
| Settings | ⌘, |
- OAuth authentication
- Browse and clone repositories
- View and create pull requests
- PR diff viewer with comments
- Approve, request changes, merge PRs
- Personal Access Token authentication
- Browse and clone projects
- View and create merge requests
- MR diff viewer with notes
- Approve, close, merge MRs
- App Password authentication
- Browse workspaces and repositories
- View and create pull requests
- PR management
- Personal Access Token authentication
- Browse organizations and projects
- View and create pull requests
- Personal Access Token authentication
- Self-hosted server support
- Repository browsing
- Pull request management
- Token authentication
- Repository browsing
- Pull request support
- In History, right-click a commit → "Interactive Rebase"
- Drag commits to reorder
- Select action for each commit (pick, squash, fixup, drop, edit, reword)
- Click "Start Rebase"
- Handle conflicts if any, then continue
- Merge: Drag branch onto current branch
- Rebase: ⌥-drag branch onto current branch
- Cherry-Pick: Drag commit to Working Copy
- Create Branch: Drag commit to Branches header
- Create Tag: Drag commit to Tags header
- Create PR: Drag branch to Pull Requests section
- Apply Stash: Drag stash to Working Copy
- Stage File: Drag file to staged area
- Create Patch: Right-click changes or commits → Create Patch
- Apply Patch: Repository menu → Apply Patch
- Export as ZIP: Right-click commit → Export as ZIP
- Save as Patch: Right-click commit → Create Patch
- Safety First: Confirmation for all destructive actions
- Calm Interface: Muted colors that support meaning without alarming
- Accessibility: Never rely on color alone; icons provide redundant cues
- Descriptive Actions: Labels describe outcomes ("Discard Changes" not "OK")
- Progressive Disclosure: Advanced options in context menus
- Green: Safe/additive actions (stage, create, add)
- Red: Destructive actions (delete, discard, force push)
- Amber: Warnings and caution
- Blue: Informational and navigation
Errors display with:
- Clear explanation of what went wrong
- Why it happened (when known)
- Actionable recovery suggestions
GitFlow follows MVVM (Model-View-ViewModel):
- Models: Pure data structures for Git entities
- ViewModels: Business logic and state management
- Views: SwiftUI user interface
- Services: Git command execution and API integrations
See architecture.md for detailed information.
| Decision | Rationale |
|---|---|
| System Git CLI | Full compatibility with user's config, hooks, and features |
| MVVM Architecture | Natural fit for SwiftUI, testable ViewModels |
| Async/await | UI stays responsive during Git operations |
| Value-type Models | Thread-safe, automatic memory management |
| Actor-based Services | Safe concurrent access to shared resources |
See FEATURES_PROGRESS.md for the complete feature tracking toward GitTower parity.
Current Status: 325 features implemented (100% complete)
Contributions are welcome! Please read our contributing guidelines before submitting pull requests.
MIT License - See LICENSE file for details