Лучшая практика для запросов Pull на GitHub

Я прочитал этот и этот обсуждение, но все еще испытывает проблемы с пониманием лучшего способа сотрудничества на GitHub.

Предположим, что я разветкил репо и разработал его самостоятельно (исходное репо не было активно какое-то время). Таким образом, у меня есть своя ветвь develop, где я делаю все изменения: ветвление из feature it, развивающееся там, а затем слияние с develop. Время от времени я хочу представить PR для оригинального репо. Но я не могу делать PR из feature, так как он будет включать всю историю develop. Итак, что я делаю:

  • checkout master, которые отслеживают исходное репо
  • brahnch из него
  • вишневый выбор из feature и нажмите его в GitHub
  • отправить PR

Когда эти PR объединены с master исходного репо, я вытаскиваю его, а затем объединяю master в develop.

Он работает довольно хорошо, но это приводит к умножению идентичных коммитов в моем собственном репо, поэтому я не уверен, что лучший выбор здесь - это выбор вишни?

Ветвление из master могло бы быть лучше, но часто возникает ситуация, когда я делал функцию-2, зависящую от функции-1; и функция-1 все еще ждет, когда PR будет объединен, но не в master.

Буду признателен за любые предложения и примеры.

Ответ 1

В теории это всегда зависит от проекта, над которым вы работаете, и руководителя проекта.

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

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

Ваш рабочий процесс в основном останется прежним. Branch из разработать, чтобы создать новую функцию -X, зафиксировать функцию-X, а затем отправить запрос на перенос на функция-X. После того, как вы слились в develop, вы потянете это и продолжаете работать; или просто объединить его на своей личной вилке и продолжить работу, git должен понимать. Как только руководитель проекта почувствует, что проект находится в следующей версии, он/она будет сливаться с мастером.

Посмотрите на эту 5 минут: Понимание потока GitHub.

Ответ 2

Я согласен с Райеном, что это зависит от того, какой проект.

На моей работе мы создали довольно хорошую систему, с которой мы все согласились.

  1. Начните с последнего мастера.
  2. Работа над вашей разработкой или художественная работа
  3. git add -p (для ваших изменений) или git add <filename> для новых дополнений
  4. git checkout -b new-branch-name
  5. git commit -m "whatever you feel should be said"
  6. git pull -r origin master
  7. git push origin new-branch-name
  8. откройте PR и дождитесь 2 одобрений
  9. слиться с мастером
  10. удалить новое -b ранчо

После этого мы просто возвращаемся к мастеру и повторяем. Если кто-то запрашивает изменения, мы храним все, над чем работаем, и checkout new-branch-name запрошенные изменения, снова git pull -r origin master, затем git push -f origin new-branch-name, затем checkout master и git stash pop. Иногда вы попадаете в то место, где вам нужны внесенные вами изменения, в этом случае мы просто продолжаем работать над этим новым -b ранчо-именем и не удаляем его локально, только на github или чем-либо еще, что вы используете.

Я знаю, что сломал стиль Барни, но я не хотел что-то пропустить. Не стесняйтесь использовать его. Это также хорошо работает для нас, потому что мы много говорим и сотрудничаем. Что касается разветвленных репозиториев и PRS, просто откройте PR, когда вы довольны тем, над чем работали. Я не от всей души согласен с целым: от ветки master до ветки dev, а затем от этого ветки. Мастер должен быть всегда готов, а затем, если вы придерживаетесь этих персон, вам не нужно беспокоиться. Кроме того, если вы боитесь большого пиара, не стесняйтесь требовать, чтобы несколько человек просмотрели его, и это не должно быть просто два. У нас всего 6 человек, поэтому у нас работают 2 человека. Надеюсь, это поможет.

Ответ 3

Учитывая комментарий, опубликованный OP на Ryen Nelsen, ответьте:

... master/develop разделение на самом деле не проблема - обычно я следую парадигме gitflow. Что мне интересно - как отправить pull-запрос только для функции-X, учитывая, что моя разработка намного опережает исходный репозиторий? Я использую вишневый сбор, но это лучший способ?

Я спрошу: что вы имеете в виду, что ваш ветвь develop намного опережает исходный репозиторий (что я буду называть ветвью master с этого момента)? Что все остальные в вашей ветке develop?

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

Если вы будете осторожны, вы можете минимизировать различия между различными ветвями функций, включая взаимозависимости, обсуждаемые в цитате. Например, предположим, что вы поддерживаете develop и пытаетесь отправить запросы на растяжение на master для fea1 и fea2.

  • Настройте 2 ветки функций off master и Cherry-pick или Rebase из до fea1 и fea2, пока они не будут иметь необходимую базу существующий develop изменяет ваши исправления.
  • Если есть взаимозависимости, это означает, что вы будете вишней - выберите некоторые из тех же самых коммитов для каждой ветки признаков или закончите разработку нового кода, который будет объединен или пересоздан между двумя ветвями функций.
  • Разработайте новые исправления для fea1 и fea2 и слейте (или rebase/squash) в develop, как вы сочтете нужным. Слияние в этом контексте, где вы только один, развивающийся в этом репо, прост - вы будете работать только с одним из develop, fea1 или fea2 за раз, поэтому слияние действительно будет которые вы должны решить в любом случае...

После подготовки запросов на вытягивание вы можете оставить fea1 и fea2 сидящими в своих отдельных ветвях и продолжить работу над develop отдельно. Между тем, поскольку запросы Pull Request получают обратную связь, вы всегда можете проверить fea1 или fea2 и обновить их, возможно, требуя слияния от fea1 до fea2 или наоборот, и, вероятно, также потребуется объединить новый коммит (s ) назад, чтобы развиться, чтобы он оставался актуальным.

Как только PR будут приняты, вы можете очистить все, что вам нужно, в соответствующей ветки частной функции в своем репо и убедиться, что окончательные слияния с другой ветвью и develop завершены.

Затем вы можете удалить ветвь функции, но лично я бы пометил последнюю фиксацию, чтобы я мог вернуться к ней в будущем в случае необходимости, а затем удалить ссылку на ветку. Таким образом, вы можете вернуться к фиксации, который, вероятно, намного ближе к master, чем develop, хотя зависит от того, сколько времени прошло, может быть, нет - по крайней мере, у вас будет выбор. Это может произойти, например, если дефект в вашем PR попадает в master,, и открывается новая проблема, которую вы можете раздавить быстро, но займет больше времени.