Удаление функциональности из ветки Git и последующее объединение? - PullRequest
1 голос
/ 08 апреля 2019

Скажем, у меня есть две ветви:

  1. Разработка
  2. Производство

У меня есть файл в обеих ветках прямо сейчас, но я хочу удалитьнекоторые элементы <li> из производственной ветви, но храните их в моей ветви разработки.

Поэтому я вхожу и фиксирую в своей производственной ветви удаление этого элемента.

Позже я решаюЯ хочу добавить эти элементы <li> обратно в производственную ветвь (в частности, из элементов <li> в моей обновленной ветке разработки).

Если я просто сделаю слияние, элементы не будут добавлены обратно. Как лучше всего обновить ветку Production в этом случае?

1 Ответ

1 голос
/ 08 апреля 2019

Нет способа использовать универсальный подход для удаления данных в одной ветви и последующего объединения этих данных через другую ветвь, в то же время сохраняя другие изменения изолированными в их соответствующих ветвях (большеоб этом позже).Но может быть подход специфический для вашего рабочего процесса.

Явное решение

Если у вас нет других изменений в вашей ветке master, то вы ищетедля этого:

git checkout master
vim <file where you delete lis>
git add <file>
git commit

git checkout development
git merge master
git revert master

Позвольте мне объяснить, что там происходит:

  1. Вы вносите свои изменения в ветку master - там вы удаляете все эти <li> изафиксируйте обновление.

  2. После этого вы переключаетесь в ветку разработки и объединяете там свою ветку master.Так что обе ветки находятся на одной странице.Таким образом, все последующие изменения в ветви разработки будут изменениями, видимыми для Git как «разница по сравнению с мастером» - и они будут применены в будущих слияниях ветви разработки с мастером.

  3. Тогдаgit revert master создает новый коммит в ветке разработки с инверсией изменений, сделанных последними в ветке master - т.е. он эффективно добавляет <li> назад, потому что их удаление было последним коммитом в master.

Позже, когда вы объедините development в master, он восстановит ваш <li> там.

Еще раз подчеркну одну особенность: она работает хорошо только в том случае, если в ветке master нет других изменений, кроме удаления li.Это потому, что когда вы выполняете git merge master, он вносит все master изменения в ветку разработки, что может быть нежелательно.

Обратите внимание, что вы не можете избежать объединения master с веткой разработки, потому что они нуждаютсяиметь общий предок коммит, где <li> были удалены.Кроме того, ветка разработки должна иметь явную фиксацию, где <li> были добавлены обратно.Только с этой настройкой Git будет применять этот коммит позже, когда вы будете объединять ветку разработки с master.

Неявное решение

Универсальный предлагаемый подход в этом случае заключается в запоминании идентификатора фиксации., где вы удалили li с.Позже вам нужно будет вернуть его вручную после слияния ветки разработки с master:

git checkout master
git merge development

git revert <id of the commit where you deleted li>

Могут быть и другие решения, но они более организационные или требуют других инструментов, помимо простого Git.

...