GitHub Слияние филиал "Мастер" - PullRequest
42 голосов
/ 19 августа 2011

Пробовал Git и Github после многих лет использования SVN. Кажется, я разбираюсь с основами, но одна вещь сбивает меня с толку.

  • Пользователь A вносит изменения в FileA и отправляет на удаленный сервер (GitHub)

  • Пользователь B вносит изменения в FileB. Сначала он тянет с пульта сервер, а затем отправляет свое изменение в FileB на удаленный сервер

  • История коммитов GitHub показывает push от пользователя A и push от пользователя B

  • Тем не менее, есть дополнительная запись в истории фиксации от UserB, которая называется 'Merge branch' master '' из https://github.com/xxx/yyy'. Просмотр diff в Github показывает, что это точная копия изменений, которые UserA сделано в файл A

Почему отображается этот дубликат - и передача из UserA в FileA, и основные записи ветви Merge идентичны ... вторая мне кажется излишней.

1 Ответ

68 голосов
/ 19 августа 2011

Каждая версия ("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 определяются точным состоянием исходного дерева, а не изменениями, которые привели дерево в это состояние.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...