Отделение от текущей работающей ветки - Git - PullRequest
2 голосов
/ 07 июля 2019

Мы строго не следуем рабочему процессу Gitflow для кода конвейера Jenkins.

Существует ветвь X от master, которая в настоящее время используется другим специалистом для его собственных изменений.В ближайшие недели будет много коммитов на ветке X.

+----+------------- master
      \
       \
         -----------X (currently used by Developer A)

Мой менеджер попросил меня создать еще одну ветку Y на ветке X, чтобы внести свои собственные изменения.Мне нужно убедиться, что изменения в ветке X актуальны в моей ветке, прежде чем я начну кодировать каждый день в ветке Y

Но проблема в том, что мне нужно каждый день объединять веткуX, чтобы быть в курсе, что приводит к конфликтам слияния.Я получаю следующие ошибки, прежде чем создать какую-либо ветку Y:

$ git branch
  master
* X
$
$
$ git pull origin X
error: Pulling is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm <file>'
hint: as appropriate to mark resolution and make a commit.
fatal: Exiting because of an unresolved conflict.
$

Каков наилучший подход к работе над моей собственной веткой с меньшим количеством конфликтов слияния с веткой X?

1 Ответ

5 голосов
/ 07 июля 2019

Каков наилучший подход к работе над моей собственной веткой с меньшим количеством конфликтов слияния с веткой X?

Используйте кратковременные, сфокусированные функциональные ветки вне ветви X. Просто потому, что все остальные не означают, что вы не можете. Использование кратковременных ветвей функций вне X сводит к минимуму отклонения X от вашей ветви функций и уменьшает конфликты.

Создайте ветку, внедрите одну вещь в свою ветку и как можно быстрее объедините ветку с X, прежде чем X сможет дрейфовать слишком далеко. В идеале ваши филиалы должны длиться несколько дней, если не часов.

После того как вы закончили свою задачу и объединили свою ветку, не используйте ее повторно. Удали это. Создайте новую ветку из X для следующего задания.


Рабочий процесс для решения этой проблемы аналогичен переходу от мастера, за исключением того, что вы переходите от X.

Вот иллюстрация вашего хранилища с ответвлением Y от X. Y устарел.

A - B [origin/master]
     \
      C - D - G - H [origin/X]
           \
            E - F [Y]

Вы установили Y для отслеживания origin/X.

$ git branch -u origin/X Y
Branch 'Y' set up to track remote branch 'X' from 'origin'.

Вместо слияния с веткой upstream для обновления я рекомендую перебазировать. Это сделает вашу историю чище и упростит работу со слияниями. Запустите git pull --rebase. Вместо получения и слияния, Git будет получать и перезагружать. Это повторяет каждый ваш коммит поверх последней версии X.

A - B [origin/master]
     \
      C - D - G - H [origin/X]
                   \
                    E1 - F1 [Y]

Это похоже на то, как будто вы все время работали над последним X. Это позволяет избежать большого количества запутанных и ненужных «слияний обновлений».

Это также облегчает управление конфликтами слияния. Вместо того, чтобы иметь дело со всеми конфликтами слияния с X все сразу, вы можете делать их коммит за коммитом. Сначала вы имеете дело с конфликтами между E и X. Затем F и X. Разделение конфликтов на коммит позволяет легче увидеть, что конфликтует и почему.

Вы можете сделать это по умолчанию в вашем .gitconfig. К этому нужно привыкнуть.

[pull]
        rebase = preserve

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

Или решите, что все пошло ужасно неправильно, и вы хотите начать с git rebase --abort.

Как только вы закончите работу со своим компонентом, объедините Y с X (или пусть Боб сделает это), удалите Y и начните новую ветвь с X для следующей функции.


Существует ветвь Х от мастера, которая в настоящее время используется другим техником для его собственных изменений. В ближайшие недели в ветви X будет много коммитов.

А теперь немного о том, почему долгоживущие и личные ветви - это кошмар, которого лучше всего избегать.

Ветвь объекта имеет четко определенную цель и четко определенную точку, когда они будут объединены. Напротив, личные ветви не имеют фокуса; они могут просто содержать то, над чем Боб работает сегодня. И у них нет конца. Они становятся долгоживущими ветвями.

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

Худшее - это долгоживущая личная ветвь. Он содержит все, над чем работал Боб. Кто знает, какие там изменения? Что они все должны делать? Они работают? Эти изменения хороши или плохи? Это именно то, что Боб решил сделать. Слияние - это прыжок веры в Боба.

Если возможно, закройте ветвь X как можно быстрее, избегайте личных ветвей и переходите к использованию кратковременных, четко определенных ветвей элементов .Хорошее управление филиалом достаточно сложно, как оно есть.Жизнь каждого будет гораздо лучше.

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