В чем разница между 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
:
- всегда перемещается / переназначается
HEAD
(остановитесь здесь, если--soft
); - по желанию сбрасывает индекс (остановитесь здесь, если
--mixed
); - по желанию сбрасывает рабочее дерево (
--hard
).
Поскольку вы специально попросили --mixed
Сброс, этот тип операции оставит рабочее дерево не синхронизированным с текущим коммитом и индексом. Ускоренное "слияние" (я поместил здесь слияние в кавычки, так как в действительности оно не выполняет слияние) обновляет рабочее дерево.