Skip to content

Instantly share code, notes, and snippets.

@wellington1993
Created August 22, 2025 14:15
Show Gist options
  • Save wellington1993/81bf3bebad30dd3d6ee27657d1989116 to your computer and use it in GitHub Desktop.
Save wellington1993/81bf3bebad30dd3d6ee27657d1989116 to your computer and use it in GitHub Desktop.
Prevent code lost in merge
#!/bin/bash
# Identifica o branch atual
current_branch=$(git rev-parse --abbrev-ref HEAD)
# Evita executar o hook no próprio branch pai (ex.: main ou develop)
if [ "$current_branch" = "main" ] || [ "$current_branch" = "develop" ]; then
echo "ℹ️ Hook ignorado: você está no branch $current_branch, que não é derivado."
exit 0
fi
# Faz fetch do origin para atualizar referências
git fetch origin --quiet
# Encontra o branch pai (o branch remoto mais próximo no histórico)
parent_branch=$(git for-each-ref --format='%(refname:short)' refs/remotes/origin | while read -r branch; do
if git merge-base $current_branch $branch >/dev/null 2>&1; then
echo $branch
break
fi
done)
if [ -z "$parent_branch" ]; then
echo "⚠️ Não foi possível determinar o branch pai. Prosseguindo sem validação..."
exit 0
fi
# Remove o prefixo 'origin/' do nome do branch pai
parent_branch_name=${parent_branch#origin/}
# Verifica se o branch local está atrás do branch pai no origin
behind=$(git rev-list --count $current_branch..$parent_branch 2>/dev/null)
if [ $? -ne 0 ]; then
echo "⚠️ Erro ao verificar o status do branch. Verifique sua conexão ou configuração do Git."
exit 0 # Não bloqueia o commit
fi
if [ $behind -gt 0 ]; then
echo "🔔 Atenção, Wellington! Seu branch está $behind commits atrás de $parent_branch."
echo "Simulando merge para verificar conflitos..."
# Simula o merge sem commitar
git merge --no-commit --no-ff $parent_branch > /dev/null 2>&1
merge_status=$?
# Desfaz a simulação
git merge --abort > /dev/null 2>&1
if [ $merge_status -ne 0 ]; then
echo "🚨 Conflitos detectados ao simular o merge com $parent_branch!"
echo "Recomendamos rodar 'git merge $parent_branch' e resolver conflitos antes de prosseguir."
else
echo "✅ Simulação de merge bem-sucedida. Nenhum conflito detectado."
fi
echo "Você pode commitar, mas lembre-se de sincronizar com: git merge $parent_branch"
else
echo "✅ Branch $current_branch está atualizado com $parent_branch."
fi
# Permite o commit, mesmo com conflitos potenciais
exit 0
#!/bin/bash
# Identifica o branch atual
current_branch=$(git rev-parse --abbrev-ref HEAD)
# Evita executar o hook no próprio branch pai
if [ "$current_branch" = "main" ] || [ "$current_branch" = "develop" ]; then
echo "ℹ️ Hook ignorado: você está no branch $current_branch, que não é derivado."
exit 0
fi
# Faz fetch do origin para atualizar referências
git fetch origin --quiet
# Encontra o branch pai
parent_branch=$(git for-each-ref --format='%(refname:short)' refs/remotes/origin | while read -r branch; do
if git merge-base $current_branch $branch >/dev/null 2>&1; then
echo $branch
break
fi
done)
if [ -z "$parent_branch" ]; then
echo "⚠️ Não foi possível determinar o branch pai. Prosseguindo sem validação..."
exit 0
fi
# Remove o prefixo 'origin/' do nome do branch pai
parent_branch_name=${parent_branch#origin/}
# Verifica se o branch pai remoto mudou
remote_hash=$(git rev-parse $parent_branch 2>/dev/null)
local_parent_hash=$(git merge-base $current_branch $parent_branch 2>/dev/null)
if [ $? -ne 0 ]; then
echo "⚠️ Erro ao verificar o status do branch pai. Verifique sua conexão ou configuração do Git."
exit 1
fi
if [ "$remote_hash" != "$local_parent_hash" ]; then
echo "🚨 O branch $parent_branch foi atualizado por outros commits!"
echo "Faça o merge com: git merge $parent_branch"
exit 1
fi
echo "✅ Branch $current_branch está sincronizado com $parent_branch. Prosseguindo com o push..."
exit 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment