В чем разница между git merge --ff <commit> и git reset <commit> --mixed

Если я хочу обновить свой местный филиал, скажем master, в удаленную ветку gitlab/masterЯ вижу два варианта:

  • Я могу объединить локальную ветвь с удаленной, используя ускоренное слияние.
  • Я могу использовать сброс, чтобы переместить мою ветку в положение удаленной ветви.

Первую операцию можно выполнить в моем графическом интерфейсе SmartGit, щелкнув правой кнопкой мыши: merge, Последняя операция может быть достигнута путем перетаскивания маркера локальной ветки в новую позицию.

Есть ли техническая разница между git merge --ff <commit> а также git reset <commit> --mixed?

Я допускаю, что сброс также может быть использован для перемещения локальной ветви в другую ветку, которая не в ускоренном порядке.

2 ответа

Решение

Если слияние решается как ускоренная перемотка вперед, различий не должно быть, но если это не так:

  • Если вы используете git merge, у вас будет коммит слияния и все коммиты из обеих веток.
  • Если вы используете git reset, вы будете иметь только коммиты от gitlab/master и без слияния совершать. Коммиты от master отсутствует gitlab/master будет незафиксирован (сброшен), но их содержимое будет присутствовать в рабочем каталоге.

Вы можете попробовать это самостоятельно, выполнив два сценария:

(Инициализация, общие два обоих сценария, мы используем master как gitlab/master а также branch1 как master)

# Common commit
git init
echo a > a; git add .; git commit -m"a"
# Commit on branch1
git checkout -b branch1
git init
echo b > b; git add .; git commit -m"b"
# Second commit on master
git checkout master~1
echo c > c; git add .; git commit -m"c"

(Сценарий слияния)

git checkout branch1
git merge master

(Сброс сценария)

git checkout branch1
git reset master

Обратите внимание, что оба варианта --ffа также --mixed являются параметрами по умолчанию и могут быть опущены.

Как вы отметили в своем комментарии к ответу Ортомалы Локни, вам понадобится --ff-only форсировать только ускоренную перемотку вперед. Другое важное отличие состоит в том, что этот вид git reset:

  1. всегда перемещается / переназначается HEAD (остановитесь здесь, если --soft);
  2. по желанию сбрасывает индекс (остановитесь здесь, если --mixed);
  3. по желанию сбрасывает рабочее дерево (--hard).

Поскольку вы специально попросили --mixed Сброс, этот тип операции оставит рабочее дерево не синхронизированным с текущим коммитом и индексом. Ускоренное "слияние" (я поместил здесь слияние в кавычки, так как в действительности оно не выполняет слияние) обновляет рабочее дерево.

Другие вопросы по тегам