Каковы типичные случаи использования флагов git - reset --merge и --keep?

В недавнем ответе , в котором он подробно описывает типичные варианты использования git-reset трех наиболее часто используемых опций (--hard, --mixed и --soft), torek упоминает попутно, что git-reset также предлагает два относительно эзотерических флага, называемых --merge и --keep. git-reset man page описывает эти два флага следующим образом:

--merge

   Resets the index and updates the files in the working tree
   that are different between <commit> and HEAD, but keeps
   those which are different between the index and working tree
   (i.e. which have changes which have not been added). If a
   file that is different between <commit> and the index has
   unstaged changes, reset is aborted.

   In other words, --merge does something like a git read-tree
   -u -m <commit>, but carries forward unmerged index entries.

--keep
    Resets index entries and updates files in the working tree
    that are different between <commit> and HEAD. If a file that
    is different between <commit> and HEAD has local changes,
    reset is aborted.

Я прекрасно понимаю, когда использовать --hard, --mixed или --soft, но я узнал только, что --merge и --keep существовал при чтении ответа torek, и я не могу придумать практические примеры использования из этих двух флагов... В каких ситуациях вы обычно используете эти два флага?

В основном я ищу объяснение на простом английском языке. Возьмите следующий отрывок из этого ответа VonC, в котором описывается типичный пример использования git reset --soft в качестве модели:

[...] каждый раз:

  • вы удовлетворены тем, что у вас получилось (в терминах рабочего дерева и индекса)
  • вы не удовлетворены всеми коммитами, которые заставили вас туда добраться:

git reset --soft - ответ.

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

Ответ 1

Честно говоря, я не совсем уверен в этом; Я даже никогда не использовал режимы --merge и --keep. Однако в примечаниях к выпуску указано, что git reset --merge был добавлен в git версии 1.6.2 со следующим примечанием:

  • git reset --merge - новый режим, который работает аналогично git checkout переключает ветки с локальными изменениями переключение на другую фиксацию.

и --keep было добавлено в 1.7.1:

  • git reset узнал --keep вариант, который позволяет отменить фиксацию рядом с кончиком, сохраняя при этом локальные изменения способом, аналогичным как git checkout branch делает.

Тогда в 1.7.9:

  • git checkout -B <current branch> <elsewhere> является более интуитивным способ записать git reset --keep <elsewhere>.

который говорит нам, что идея --keep заключается в том, что вы начали работу над какой-то ветвью, а затем понимаете: oh, эта ветка должна откидываться от какой-то другой точки (вероятно, кончик какой-либо другой ветки). Например, вы можете:

$ git checkout devel
$ git checkout -b fix-bug-1234

а затем выполните некоторую работу по исправлению ошибки 1234 для следующей версии; но потом кто-то говорит: "Эй, нам нужна ошибка 1234, исправленная для старой версии!" Итак, теперь вы хотите fix-bug-1234 отделиться от release вместо devel. Между тем вы еще ничего не совершили. Итак, вы:

$ git checkout -B fix-bug-1234 release

чтобы переместить его в "спуск релиза" вместо того, чтобы "сходить с девела". Что работает в 1.7.9 или новее, но с 1.7.1 по 1.7.8 вы должны записать его git reset --keep.

Это может объяснить --keep, но --merge по-прежнему остается загадкой.