Как достичь "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