Как достичь "git-no-ff-ff-only", что не разрешено
как часть нашего рабочего процесса rebase-heavy, я надеюсь использовать слияние в главной ветви. В частности, я хочу объединить только тогда, когда ветвь темы была перезагружена на самый последний мастер-коммит, тем самым делая любое слияние быстрым. Я могу достичь этого, используя:
git merge --ff-only
кроме того, я хотел бы записать интеграцию ветви темы с пустой фиксацией, поэтому я хотел бы использовать --no-ff, который заставляет это поведение:
git merge --no-ff
то, что я действительно хочу, это сочетание обоих: слияние только тогда, когда это тривиально, но позвольте мне записать его в любом случае. ГИТ считает, что
fatal: You cannot combine --no-ff with --ff-only.
что кажется очевидным для некоторых.
git merge --edit --no-ff topicbranch
не достигает поведения, которое я хочу. Итак, как я могу слиться с опцией --no-ff, если ветвь темы, о которой идет речь, перезагружена до последнего мастера совершить?
UPDATE: похоже, что ответ Чарльза Бейли сделает трюк. Если вы хотите, чтобы это было свернуто в псевдоним git, вы можете выпустить это здесь:
git config --global alias.integrate '!test "$(git merge-base HEAD "")" = "$(git rev-parse HEAD)" && git merge --no-ff --edit || echo >&2 "Not up-to-date; refusing to merge, rebase first!"'
немного громоздко, но работает. Обратите внимание на силу редактирования сообщения фиксации с опцией --edit
.
3 ответов
не хочешь --ff-only
потому что вы хотите сделать фиксацию слияния, которая --ff-only
помешает.
проверка, которую вы хотите, может быть выполнена как отдельная проверка перед запуском команды merge. Вы можете упаковать это в простую функцию оболочки.
Э. Г.
merge_if_ahead () {
if test "$(git merge-base HEAD "")" = "$(git rev-parse HEAD)"; then
git merge --no-ff ""
else
echo >&2 "Not up to date; refusing to merge"
return 1
fi
}
Я создал псевдоним, который работает для моих простых тестов
git config --global alias.ffmerge '!sh -c "git merge --ff-only && git reset --hard HEAD@{1} && git merge --no-ff " -'
он состоит из 3 команд, одна за другой, которые будут терпеть неудачу, как только первый из них терпит неудачу. Объясняя каждый:
git merge --ff-only
произойдет сбой, если слияние не может продолжаться как быстрое слияние. ($1-это имя ветви, переданное в качестве аргумента)
git reset --hard HEAD@{1}
если первая команда преуспевает, это означает, что мы можем выполнить быстрое слияние, но, поскольку мы хотим сделать коммит слияния, мы вернемся к состояние головы как раз перед нашим (успешным) слиянием. HEAD@{1} является указателем reflog.
git merge --no-ff
теперь мы сделаем реальное слияние с фиксацией слияния, даже если слияние может идти головой вперед.
простой вызов git ffmerge
сделает все для нас, единственный шаг, который может потерпеть неудачу, - это первый, и это оставит нас в неизменной рабочей копии, как и раньше.
С git reset --hard
рабочая копия должна быть чистой.
git config alias.mff '!mff() { git merge --ff-only "" && git reset --hard HEAD@{1} && git merge --no-ff ""; }; mff'
и
git mff other-branch