В повседневной жизни я использую SmartGit
качестве клиента для выбора. Тем не менее, мои члены команды придерживаются git native, не коммерческого графического интерфейса. Мы обнаружили некоторые отличия в том, как выглядит наше слияние.
Это параметры, которые SmartGit
дает при запросе на объединение ветки: ![SmartGit commits type]()
На приведенном ниже графике вы можете увидеть мой пример вывода графика SmartGit, содержащий:
- единственная
master
ветвь - Одна ветка объединена с мастером с параметром
merge commit
- Одна ветка объединяется с
simple commit
Одна из ветвей (with_merge_branch
) визуализирует операцию слияния, присоединяя ветвь с мастером через линию. Второй (normal_commit_branch
) - нет.
![git tree]()
Вопрос в том, как применять оба поведения в собственных командах git? То есть разница между этими двумя коммитами?
Ответ 1
Разница между двумя видами слияния только отличается в истории коммитов (как вы показали журналы на графике).
Позвольте проиллюстрировать графиками. Примите историю фиксации, как показано ниже, до слияния:
A---B---C---D master
\
E---F---G develop
Слияние (несколько родителей):
Используемая команда - git merge branchname
. Это стандартный способ объединения двух ветвей.
Когда вы объединяете ветку develop
в ветку master
с помощью Слияние коммитов в SmartGit (git merge develop
), история коммитов будет выглядеть так:
A---B---C---D---M master
\ /
E---F---G develop
Простой коммит (один из родителей, "сквош"):
Он объединяет две ветки с опцией --squash
, используется команда git merge branchname --squash
.
--squash
Создайте рабочее дерево и состояние индекса, как если бы произошло реальное слияние (за исключением информации о слиянии), но на самом деле не выполняйте зафиксировать, переместить заголовок или записать $ GIT_DIR/MERGE_HEAD (чтобы вызвать следующая команда git commit для создания коммита слияния). Это позволяет вам создать один коммит поверх текущей ветки, эффект которого так же, как слияние другой ветки (или более в случае осьминога).
Когда вы объединяете ветку develop
в ветку master
с помощью простой фиксации в SmartGit (git merge develop --squash
), он получает изменения из ветки develop
в ветку master
как новый обычный коммит (как если произошло реальное слияние), и история коммитов будет:
A---B---C---D---M master
\
E---F---G develop
Ответ 2
merge commits
просто commit
, но разница в том, что у них более одного родителя.
как вы знаете, коммиты могут иметь или не иметь родительский коммит, на самом деле merge commit
- это commit
, у которого более одного parent commit
.