Каждая версия ("commit"), хранящаяся в git, является частью графа, и часто полезно думать о том, что вы делаете в git, в терминах этого графа.
Когда UserA начинается, давайтескажем, что было создано только два коммита, которые мы назовем P
и Q
:
P--Q (master)
Затем он изменяет FileA, изменяет этапы и создает коммит, который представляет новое состояниеисходный код - допустим, коммит называется R
.У него есть один родительский элемент, который является коммитом Q
:
P--Q--R (master)
После успешного нажатия граф фиксации для репозитория GitHub выглядит одинаково.
UserB запущен с той же историей:
P--Q (master)
... но создал другой коммит, скажем, с именем S
, который имеет свою модифицированную версию FileB:
P--Q--S (master)
Пользователь B пытается отправить его на GitHub,но в push-запросе отказано - если вы не «принудительно» нажмете, вам не разрешено обновлять удаленную ветвь, если версия, которую вы нажимаете, не включает всю историю в этой удаленной ветке.Итак, UserB тянет с GitHub.Тяга действительно состоит из двух шагов: выборки и слияния.Выборка обновляет origin/master
, которая похожа на кэш состояния удаленной ветви master
с удаленного origin
.(Это пример «ветви удаленного отслеживания».)
P--Q--S (master)
\
R (origin/master)
История на этом графике разошлась, поэтому объединение пытается объединить эти две истории, создав коммит слияния (скажем, * 1028).*) который имеет как S
, так и R
в качестве родителей и, как мы надеемся, представляет изменения из обеих веток:
P--Q--S--M (master)
\ /
\ /
R (origin/master)
Когда GitHub показывает вам diff, представляющий изменения, внесенные коммитом, это простов случае коммита с одним родителем - он может просто сделать diff из этой версии.Однако, в случае коммита, такого как M
, с более чем одним родителем, он должен выбрать родителя, чтобы показать разницу с ним.Это объясняет, почему разница, показанная для коммита слияния M
, может выглядеть так же, как и для одного из S
или R
.Коммиты в git определяются точным состоянием исходного дерева, а не изменениями, которые привели дерево в это состояние.