Другой подход - сохранить локальные изменения общих файлов конфигурации в другой частной ветке. Я делаю это для некоторых проектов, требующих нескольких локальных изменений. Этот метод может быть применим не ко всем ситуациям, но в некоторых случаях он работает для меня.
Сначала я создаю новую ветку на основе главной ветки (в этом конкретном случае я использую git-svn, поэтому мне нужно выполнить фиксацию от мастера, но это не очень важно здесь):
git checkout -b work master
Теперь измените файл (ы) конфигурации по мере необходимости и зафиксируйте. Я обычно помещаю в сообщение фиксации что-то особенное, например «NOCOMMIT» или «PRIVATE» (это будет полезно позже). На этом этапе вы можете работать над своей частной веткой, используя свой собственный файл конфигурации.
Если вы хотите вернуть свою работу вверх по течению, выбирайте каждое изменение из своей workветки к мастеру. У меня есть сценарий, который поможет в этом, он выглядит примерно так:
#!/bin/sh
BRANCH=`git branch | grep ^\\* | cut -d' ' -f2`
if [ $BRANCH != "master" ]; then
echo "$0: Current branch is not master"
exit 1
fi
git log --pretty=oneline work...master | grep -v NOCOMMIT: | cut -d' ' -f1 | tac | xargs -l git cherry-pick
Это первая проверка, чтобы убедиться, что я нахожусь в masterветке (проверка работоспособности). Затем он перечисляет каждую workсделанную фиксацию , отфильтровывает те, которые упоминают ключевое слово NOCOMMIT, меняет порядок и, наконец, выбирает каждую фиксацию (теперь сначала от самой старой) master.
Наконец, после внесения изменений в основной восходящий поток, я снова переключаюсь на workи перебазирую:
git checkout work
git rebase master
Git повторно применит каждый из коммитов в workветке, фактически пропуская те, которые уже были применены masterчерез выбор вишни. У вас должны остаться только локальные коммиты NOCOMMIT.
Этот метод делает процесс отправки немного более трудоемким, но он решил проблему для меня, поэтому я решил поделиться.