<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Iacon</title>
    <description>The latest articles on DEV Community by Iacon (@helloiacon).</description>
    <link>https://dev.to/helloiacon</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4094990%2F5cf99e9e-1e2d-465c-94ff-e0eb42b4a88f.png</url>
      <title>DEV Community: Iacon</title>
      <link>https://dev.to/helloiacon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/helloiacon"/>
    <language>en</language>
    <item>
      <title>GitFuse ⚡ — Move committed Git work between machines without pushing WIP branches</title>
      <dc:creator>Iacon</dc:creator>
      <pubDate>Wed, 26 Aug 2026 04:17:14 +0000</pubDate>
      <link>https://dev.to/helloiacon/gitfuse-move-committed-git-work-between-machines-without-pushing-wip-branches-3iea</link>
      <guid>https://dev.to/helloiacon/gitfuse-move-committed-git-work-between-machines-without-pushing-wip-branches-3iea</guid>
      <description>&lt;p&gt;I kept running into the same Git workflow problem whenever I switched between development machines.&lt;/p&gt;

&lt;p&gt;I’d have a few commits locally that I wanted to continue working on somewhere else, but the branch wasn’t ready to be pushed yet.&lt;/p&gt;

&lt;p&gt;The usual workflow became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit locally
↓
create a temporary WIP branch
↓
push it
↓
switch machines
↓
pull it
↓
clean up the branch later
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There’s nothing technically wrong with doing that.&lt;/p&gt;

&lt;p&gt;It just felt odd to keep using a central Git remote as a transport mechanism for work I wasn’t ready to publish.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;GitFuse ⚡&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;p&gt;GitFuse reduces that process to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit
gitfuse &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switch machines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitfuse pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git commit → gitfuse sync → switch machine → gitfuse pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The goal is intentionally narrow:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Move committed Git work between trusted machines without requiring a temporary remote branch.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;GitFuse isn’t trying to replace GitHub, GitLab, or your normal Git remote.&lt;/p&gt;

&lt;p&gt;It fills the gap before you’re ready to push.&lt;/p&gt;




&lt;h2&gt;
  
  
  What does GitFuse sync?
&lt;/h2&gt;

&lt;p&gt;GitFuse works with &lt;strong&gt;committed Git state&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It deliberately does not behave like Dropbox, Syncthing, or a general-purpose folder synchronization tool.&lt;/p&gt;

&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; sync:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;uncommitted working-tree changes&lt;/li&gt;
&lt;li&gt;untracked files&lt;/li&gt;
&lt;li&gt;ignored files&lt;/li&gt;
&lt;li&gt;stashes&lt;/li&gt;
&lt;li&gt;arbitrary files from the project directory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something hasn’t been committed to Git, GitFuse leaves it where it is.&lt;/p&gt;

&lt;p&gt;That boundary is intentional. I wanted GitFuse to remain repository-aware instead of becoming another filesystem synchronization system.&lt;/p&gt;




&lt;h2&gt;
  
  
  The CLI
&lt;/h2&gt;

&lt;p&gt;The GitFuse CLI is written in &lt;strong&gt;Go&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A basic session looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitfuse auth login

&lt;span class="nb"&gt;cd &lt;/span&gt;my-project
gitfuse add &lt;span class="nb"&gt;.&lt;/span&gt;
gitfuse &lt;span class="nb"&gt;sync&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then on another trusted machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gitfuse auth login
gitfuse pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI currently includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication and headless authentication&lt;/li&gt;
&lt;li&gt;repository tracking&lt;/li&gt;
&lt;li&gt;sync and pull&lt;/li&gt;
&lt;li&gt;dry runs&lt;/li&gt;
&lt;li&gt;commit selection&lt;/li&gt;
&lt;li&gt;repository status&lt;/li&gt;
&lt;li&gt;sync history&lt;/li&gt;
&lt;li&gt;trusted-device management&lt;/li&gt;
&lt;li&gt;restore and recovery workflows&lt;/li&gt;
&lt;li&gt;diagnostics and updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go has been a good fit because I wanted GitFuse to ship as a small cross-platform binary without requiring users to install another runtime.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trusted devices
&lt;/h2&gt;

&lt;p&gt;GitFuse uses an account + trusted-device model.&lt;/p&gt;

&lt;p&gt;A new CLI device goes through an authorization flow before it can access the workspace, and connected devices can later be reviewed or revoked.&lt;/p&gt;

&lt;p&gt;There’s also a Next.js dashboard for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repositories&lt;/li&gt;
&lt;li&gt;trusted devices&lt;/li&gt;
&lt;li&gt;sync history&lt;/li&gt;
&lt;li&gt;usage&lt;/li&gt;
&lt;li&gt;account settings&lt;/li&gt;
&lt;li&gt;upgrade plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CLI remains the main interaction point. The dashboard mainly provides visibility and account/device management.&lt;/p&gt;




&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  macOS / Linux
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://gitfuse.dev/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Homebrew
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap VectorSolus/gitfuse https://github.com/VectorSolus/GitFuse.git
brew &lt;span class="nb"&gt;install &lt;/span&gt;VectorSolus/gitfuse/gitfuse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Windows
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;gitfuse&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pre-built binaries are also available through GitHub Releases.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why not just use a private branch?
&lt;/h2&gt;

&lt;p&gt;That’s a completely valid option.&lt;/p&gt;

&lt;p&gt;There are already several ways to move work between machines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;temporary/private Git branches&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git bundle&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SSH/SCP&lt;/li&gt;
&lt;li&gt;Syncthing&lt;/li&gt;
&lt;li&gt;another private Git remote&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitFuse isn’t trying to say those approaches are wrong.&lt;/p&gt;

&lt;p&gt;What I’m trying to make smaller is this specific workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit → sync → continue elsewhere
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without creating remote branches purely to transport unfinished work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Free version of GitFuse is live&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pro and Team plans are coming later with larger limits and additional workspace features.&lt;/p&gt;

&lt;p&gt;The main question I’m trying to answer right now is simpler:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this actually useful for developers who regularly move between multiple machines?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use two or more development machines, how do you currently move committed-but-not-yet-published work between them?&lt;/p&gt;

&lt;p&gt;Do temporary branches already work well enough, or does a workflow like GitFuse solve a real annoyance for you?&lt;/p&gt;

&lt;p&gt;I’d also appreciate technical feedback on the Go CLI — command structure, error handling, recovery behavior, cross-platform behavior, or anything that feels more complicated than it needs to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/VectorSolus/GitFuse" rel="noopener noreferrer"&gt;https://github.com/VectorSolus/GitFuse&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://gitfuse.dev" rel="noopener noreferrer"&gt;https://gitfuse.dev&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://gitfuse.dev/docs" rel="noopener noreferrer"&gt;https://gitfuse.dev/docs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GitFuse CLI is open source under &lt;strong&gt;AGPL-3.0&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>go</category>
      <category>git</category>
    </item>
  </channel>
</rss>
