среда, 27 июля 2016 г.

Git - минимизация merge-commit'ов в master

У нас небольшая команда разработки и, зачастую, мы правки делаем прямо в master.
В среднем у нас 16 commit'ов в день (от 1 до 45), поэтому периодически сталкиваюсь с тем, что кто-то за'push'ил в мастер в центральный репозиторий одновременно со мной, а я забыл с'pull'иться перед своим commit'ом. После слияния веток возникают грязные commit'ы вида:

845f25b 2016-07-26 (Some User) -  Merge branch 'master' of github.com:Company/repository

Чтобы избегать commit'а в мастер, когда в центральном репозитории кто-то что-то поменял, можно использовать hook на pre-commit:

cat .git/hooks/pre-commit

#!/bin/sh

red="\033[01;91m"
green="\033[01;32m"
reset="\033[0m"

branch=`git rev-parse --abbrev-ref HEAD`
if [ a$branch == amaster ]
then
git fetch origin master >/dev/null 2>&1
local_commit=`git rev-parse --verify HEAD`
origin_commit=`git rev-parse --verify origin/master`
#if [ a$local_commit != a$origin_commit ]
if ! git log | grep -qs $origin_commit
then
echo
echo "${red}origin/master ушел вперед.${reset} Сделай сначала: ${green}git pull origin master${reset}"
echo
exit 1
fi
fi
exit 0

Надо отметить, что такой подход не гарантирует отсутствие merge-commit'ов, но если все свои изменения сразу после commit'а push'ить в центральный репозиторий, то таких ситуаций будет крайне мало.