Объединить фиксацию с нормальным фиксацией

В повседневной жизни я использую 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.