Versionamento com Git
Colocar mapas do Freeplane sob controle de versão: por que funciona, como resolver conflitos e o fluxo em equipe.
O que você vai aprender
- Versionar mapas .mm com Git de forma útil
- Ler um diff de mapa e entender o que mudou
- Reduzir ruído de diff com hábitos simples
- Resolver conflitos sem perder conteúdo
Antes de começar
- Git instalado e noções de
add,commit,merge - Salvando e formatos de arquivo
Versionamento com Git🔗
O .mm é XML de texto puro, o que faz dele um cidadão de primeira classe num repositório Git. Você ganha histórico completo, desfazer sem limite de sessão, comparação entre versões e trabalho em equipe — coisas que nenhum recurso interno do Freeplane oferece.
Começando🔗
mkdir mapas && cd mapas
git init
cp ~/meus-mapas/*.mm .
git add .
git commit -m "mapas iniciais"
Uma pasta com os mapas, as imagens numa subpasta img/, e o repositório em volta.
O .gitignore🔗
O Freeplane deixa arquivos temporários que não devem entrar no histórico:
# Cópias de recuperação e backups
*.mm.autosave*
*.mm.bak
*~
# Bloqueio de arquivo aberto
*.mm.lck
.~lock.*
# Sistema
.DS_Store
Thumbs.db
Sem isso, cada gravação polui o git status.
Lendo um diff🔗
git diff mapa.mm
O resultado é XML, mas legível:
- <node TEXT="Contratar dev" ID="ID_1" MODIFIED="1690000000000">
+ <node TEXT="Contratar desenvolvedora sênior" ID="ID_1" MODIFIED="1690003600000">
+ <attribute NAME="prazo" VALUE="2026-09-15"/>
Dá para ver exatamente que o texto mudou e que um atributo foi acrescentado. O ID estável é o que torna isso possível: o mesmo nó é reconhecível entre versões, mesmo se mudar de lugar.
Um git log -p mapa.mm conta a história de um mapa de planejamento melhor que qualquer ata. Cada commit é um momento em que a estrutura do problema mudou.
Reduzindo o ruído🔗
Alguns hábitos deixam os diffs muito mais úteis:
-
Commits pequenos e frequentes. Um commit por sessão de trabalho, com mensagem que diga o que mudou no pensamento, não no arquivo.
-
Não commite mudanças só de dobramento. O estado dobrado é gravado no arquivo, então abrir e fechar ramos gera diff. Se isso incomodar, padronize: dobre até o primeiro nível antes de salvar.
-
Cuidado com o atributo
MODIFIED. Todo nó tocado ganha carimbo novo. Nas preferências dá para desativar a gravação de datas de criação/modificação, o que limpa muito os diffs — ao custo de perder essa informação. -
Imagens referenciadas, não embutidas. Uma imagem embutida em base64 vira um blob gigante que muda por inteiro a cada gravação.
-
Um assunto por mapa. Mapas menores dão históricos compreensíveis e reduzem conflitos.
Conflitos🔗
Aqui está o ponto delicado. Quando duas pessoas editam o mesmo mapa, o Git tenta unir o XML e frequentemente consegue — desde que tenham mexido em ramos diferentes. Quando não consegue, o resultado é um .mm com marcadores de conflito, que o Freeplane não abre.
O procedimento:
# 1. Guarde as duas versões antes de qualquer coisa
git show :2:mapa.mm > /tmp/minha.mm
git show :3:mapa.mm > /tmp/dela.mm
# 2. Abra as duas no Freeplane, lado a lado
freeplane /tmp/minha.mm /tmp/dela.mm
A partir daí, o caminho confiável não é editar o XML: é escolher uma das versões como base, copiar do outro mapa (Ctrl+C / Ctrl+V de ramos inteiros) o que faltar, e commitar o resultado.
cp /tmp/resolvido.mm mapa.mm
git add mapa.mm
git commit
O add-on Mind Map Diff ajuda muito nessa hora: ele compara dois mapas e mostra o que difere, em vez de você conferir a olho.
Evitando conflitos🔗
Melhor que resolver:
- Divida os mapas. Um mapa por pessoa ou por área elimina a maior parte dos conflitos.
- Combine quem mexe em quê. O protocolo social resolve o que a ferramenta não resolve.
git pullantes de abrir,git pushdepois de salvar. A janela de conflito encolhe.- Branches para trabalho longo, com merge consciente no fim.
Git LFS🔗
Se houver imagens grandes ou mapas com anexos embutidos:
git lfs install
git lfs track "*.png" "*.jpg" "*.mmx"
git add .gitattributes
Isso mantém o repositório leve. Para mapas .mm puros não é necessário — texto é exatamente o que o Git faz melhor.
Um driver de diff mais legível🔗
Para diffs mais amigáveis que XML cru, dá para registrar um driver que converte o mapa em texto antes de comparar:
# .git/config
[diff "freeplane"]
textconv = /usr/local/bin/mm2txt*.mm diff=freeplane
Onde mm2txt é um script seu — pode ser um script Groovy do Freeplane em modo linha de comando, ou um pequeno programa que percorre o XML e imprime a árvore indentada. É trabalho, mas transforma a experiência.
Hospedagem🔗
Qualquer serviço Git serve: Forgejo, Gitea, GitHub, GitLab, ou um repositório nu numa máquina sua. Como os mapas são texto, o custo é irrisório.
Para mapas pessoais, um repositório privado sincronizado entre máquinas resolve backup, histórico e portabilidade de uma vez — melhor que qualquer pasta de nuvem.
Erros comuns
- Commitar arquivos
.autosavee.bakpor falta de.gitignore - Tentar resolver conflito editando os marcadores no XML; o mapa quebra
- Imagens embutidas em base64 fazendo o repositório crescer sem controle
- Um mapa gigante compartilhado por cinco pessoas, com conflito toda semana
Na prática🔗
- Crie um repositório com dois mapas e o
.gitignoreacima. - Faça três commits em momentos diferentes de edição.
- Rode
git log -pe leia a história. - Provoque um conflito: edite o mesmo nó em dois clones e faça merge.
- Resolva pelo método de copiar ramos entre mapas abertos.
- Desative a gravação de datas de modificação e compare o tamanho do diff seguinte.
Você aprendeu
.mmé XML de texto: Git funciona de verdade, com diffs legíveis.gitignorepara autosave, bak e lock é o primeiro passo- Resolva conflitos copiando ramos entre mapas abertos, nunca editando os marcadores
- Dividir mapas por assunto ou pessoa evita a maior parte dos conflitos
Perguntas para reflexão
- Por que Git funciona de verdade com
.mm? - O que entra no
.gitignore, e por quê? - Como se resolve um conflito de merge num mapa, e o que não fazer?
- Que divisão de mapas evita a maior parte dos conflitos?