Как достичь `git --no-ff -ff-only`, который не разрешен - программирование
Подтвердить что ты не робот

Как достичь `git --no-ff -ff-only`, который не разрешен

В качестве части нашего перегрузочного рабочего процесса я надеюсь использовать слияние на главной ветке. В частности, я хочу объединиться только тогда, когда ветвь темы была переустановлена ​​на самую последнюю фиксацию хозяина, тем самым делая любое слияние быстрым. Я могу добиться этого, используя:

git merge --ff-only

Кроме того, я хотел бы записать интеграцию ветки темы с пустой фиксацией, поэтому я хотел бы использовать -no-ff, которая заставляет это поведение:

git merge --no-ff

Однако, я действительно хочу, это комбинация обоих: слияние только тогда, когда оно тривиально, но позвольте мне записать его в любом случае. Git считает, что

fatal: You cannot combine --no-ff with --ff-only.

который кажется очевидным для некоторых.

git merge --edit --no-ff topicbranch

не достигает того, чего я хочу. Итак, как я могу объединиться с опцией -no-ff, если ветка темы подлежит переустановке до последнего комманда-фиксатора?


ОБНОВЛЕНИЕ: Похоже, что ответ Чарльза Бейли сделает трюк. Если вы хотите, чтобы это было перевернуто в псевдоним Git, вы могли бы выпустить это здесь:

git config --global alias.integrate '!test "$(git merge-base HEAD "$1")" = "$(git rev-parse HEAD)" && git merge --no-ff --edit $1 || echo >&2 "Not up-to-date; refusing to merge, rebase first!"'

Немного глоток, но работает. Обратите внимание на силу редактирования сообщения фиксации с опцией --edit.

4b9b3361

Ответ 1

Вы не хотите --ff-only, потому что вы хотите сделать комманду, которую --ff-only будет блокировать.

Проверку, которую вы хотите, можно сделать отдельной проверкой перед запуском команды слияния. Вы можете скомпоновать это в простую функцию оболочки.

например.

merge_if_ahead () {
  if test "$(git merge-base HEAD "$1")" = "$(git rev-parse HEAD)"; then
      git merge --no-ff "$1"
  else
      echo >&2 "Not up to date; refusing to merge"
      return 1
  fi
}

Ответ 2

Я создал псевдоним, который работает для моих простых тестов

git config --global alias.ffmerge '!sh -c "git merge --ff-only $1 && git reset --hard [email protected]{1} && git merge --no-ff $1" -'

Он состоит из 3-х команд, один за другим, которые будут сбой, как только первый будет терпеть неудачу. Объясняя каждый:

git merge --ff-only $1

Ошибка, если слияние не может продолжаться как быстрое переключение. ($ 1 - имя ветки, переданное как аргумент)

git reset --hard [email protected]{1}

Если первая команда завершается успешно, это означает, что мы можем выполнить быстрое переключение, но, как мы хотим выполнить слияние, мы вернемся к состоянию HEAD непосредственно перед нашим (успешным) слиянием. HEAD @{1} является указателем reflog.

git merge --no-ff $1

Теперь мы сделаем реальное слияние с фиксацией слияния, даже если слияние может идти в голову как быстрая перемотка вперед.

Простой вызов git ffmerge сделает все для нас, единственный шаг, который может потерпеть неудачу, является первым, и это оставило бы нас в неизменной рабочей копии, как раньше.

Как всегда с git reset --hard рабочая копия должна быть чистой.

Ответ 3

git config alias.mff '!mff() { git merge --ff-only "$1" && git reset --hard [email protected]{1} && git merge --no-ff "$1"; }; mff'

а затем

git mff other-branch