Git поведение при слиянии - PullRequest
       25

Git поведение при слиянии

0 голосов
/ 15 февраля 2019

У меня есть проект с исходной веткой - Branch1 и двумя ветвями, которые я получил из Branch1, скажем Branch2 и Branch3.

Я удаляю файл в Branch2 и прошу его объединить с Branch1.Он успешно объединен.

Я обновляю файл в Branch3, но файл, удаленный в Branch2, все еще отображается в Branch3.

Затем я успешно объединяю его с Branch1.

Но я думал, что Git объединит снимок Branch3, на котором все еще есть файл, в Branch1.Но увы Нет, файл, удаленный в первом запросе на слияние, исчез.Фактически, во время запроса на слияние Branch3 с Branch1, git даже не сообщает мне этот файл как diff в GitLab.

У меня вопрос, я думал, что Git всегда будет копировать весь снимок Branch3 и объединять его вbranch1.

Почему этого не произошло?

1 Ответ

0 голосов
/ 15 февраля 2019

Чтобы сделать это более конкретным, давайте назовем файл, который вы удалили в Branch 2 foo.txt.Когда вы объединяете ветку 2 с веткой 1, этот файл теперь также удаляется и в ветке 1.Поскольку Branch 3 не изменяет этот файл, он остается удаленным в Branch 1 даже после объединения Branch 3.

Лучший способ подумать об этом - объединение копий изменений из одной ветви.другому.Он не копирует весь снимок при слиянии.Это все еще немного волнистые, хотя.Чтобы получить более точную мысленную модель того, как работает git, важно понять, что такое коммит.По сути, коммит - это набор изменений, а также некоторые дополнительные метаданные, такие как метка времени, имя автора и т. Д. В этой статье приводится подробное описание, которое очень полезно.

Ветвь - это последовательность коммитов.Когда вы извлекаете ветку, git создает локальные копии всех файлов, которые он отслеживает, применяя все изменения в коммитах в этой ветке.То же самое касается слияния: git merge branch1 будет применять все изменения, которые находятся в branch1, но не в текущей ветви, к локальным файлам.

Теперь легче понять, что происходит в следующих командах:

git checkout branch1
git merge branch3

Поскольку Branch 3 не изменяет файл, который был удален в Branch 1, git оставляет его как есть.Git будет применять только те изменения из ветви 3, которые еще не являются частью ветви 1.

...