Это неправильно, чтобы гит толкает ветви?

11

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

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

Тем не менее, это приводит к тому, что git push --forceпосле перезагрузки мне часто приходится делать удаленный репозиторий - действие, которое обычно не одобряется. Или, как сказано на связанной странице github:

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

Существует ли (общепринятая) политика, которая разрешает этот конфликт?

Почему это не дубликат. Так ли важен мерзавец "Золотое правило перебазирования"?

Мой вопрос здесь требует политики для разрешения конфликта между желанием сделать резервную копию вашей работы в удаленном репозитории и перебазированием вашей работы , в то время как другой вопрос пытается отрицать, что существует конфликт, и спрашивает, почему некоторые люди думают, что конфликт существует вообще, и, таким образом, спрашивает, почему «важно», чтобы не подталкивать силы перезагрузки?

Чиль тен бринке
источник
1
@gbjbaanb, если вы делаете WIP-коммиты, ребаз очень полезен, чтобы избежать много коммитов за один день работы. Я часто делаю коммиты для небольших изменений только для того, чтобы при необходимости у меня была опция «отменить к состоянию, которое я помню» - большинство из них не имеют никакого отношения к основной истории репо (и поэтому перебазирование так полезно).
enderland
1
@gbjbaanb Это вопрос мнения, я думаю. Многие команды используют стратегию перебазирования, чтобы сохранить свою историю в чистоте.
Чиль тен Бринке
1
@enderland все хотят красивую историю, это все же неправильное (и опасное) действие, как показано по ссылке. Торвальдс никогда не должен был вставлять это, он должен был позволять вместо этого «сжимать» коммиты на дисплее.
gbjbaanb
1
@gbjbaanb, но ... он не сделал, и поэтому мы должны работать с тем, что у нас есть. Для меня гораздо полезнее иметь один коммит в ветке master вместо 30+ отдельных и инкрементных коммитов из каждой ветви функций. Но у всех будет свой рабочий процесс, я думаю ...
enderland

Ответы:

5

Ключевой вопрос, который нужно задать себе:

  • Сохраняете ли вы удаленную ветку после слияния с мастером?

Если вы удалите ветку удаленного компонента после слияния с мастером, вы уже потеряете историю. Предполагая, что вы раздавили / перебазировали ветку до того, как сделали слияние / PR, вы потеряете эту историю. В этом случае все, что вы делаете принудительно, позволяет вам использовать github в качестве резервной копии.

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

Я полагаю, вы спрашиваете, оставлю ли мне ветку без поддержки? Нет, AFAIC. Тем не менее, принудительное принудительное использование может теоретически привести к потере коммитов от других пользователей, которые отправили в ту же ветку.

Похоже, у вас есть несколько человек, которые толкают к этой ветви одновременно. Это означает, что вы заботитесь об истории на ветке.

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

enderland
источник
"Сохраняете ли вы удаленную ветку после слияния с мастером?" Я полагаю, вы спрашиваете, оставлю ли мне ветку без поддержки? Нет, AFAIC. Тем не менее, принудительное принудительное принудительное использование может теоретически привести к потере коммитов от других пользователей, которые отправили в ту же ветку.
Чиль тен Бринке
@ChieltenBrinke Я немного отредактировал об этом. К вашему сведению
enderland
Я думаю, что форкинг как мера предотвращения разрушения коммитов при форсировании на самом деле является очень хорошим предложением. Но AFAIK это на самом деле не концепция git, и вам нужна служебная оболочка, чтобы сделать это легко (например, github). Я прав насчет этого? Или, может быть, я ошибочно принимаю термин «разветвление» за создание отдельной ветки?
Чиль тен Бринке
@ChieltenBrinke хорошо, вы можете сделать то же самое различными способами. Если ваша ветвь функций находится в удаленном репозитории, вы можете разветвить репозиторий и получить свою версию этой ветки. А затем объедините эту ветку с вашей удаленной веткой после фиксации изменений. Или вы можете просто создать другую локальную ветвь (может быть featurebranch-local), а затем сделать активную разработку для этой ветки с таким количеством коммитов, сколько хотите. Как только вы захотите объединить, раздавите эти коммиты, а затем объедините их в функцию. По сути, просто выполняем dev в реальной временной ветке, а затем добавляем / добавляем в вашу функцию.
enderland
Предполагая, что разветвление репо не возможно, потому что никто не использует github, мы бы работали с «частной» develop-featureветкой. Конечно, конфиденциальность является чисто условной и не навязывается ничем, но может быть включена в политику, особенно если для этого введены определенные соглашения об именах филиалов. (Может быть, я сейчас слишком волнуюсь, а может и нет :) Комбинация с --force-with-leaseне может повредить, хотя на нее не следует полагаться, как указано в моем другом посте.
Чиль тен Бринке
3

Я перечисляю некоторые возможности, которые приходят мне в голову.

Всегда ребаз на новую ветку

Если у вас грязная ветка some-feature, перебазируйте ее на новую ветку. Например

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

Затем some-feature-rebaseпересмотрели и интегрировали.

Проблема: большой недостаток в том, что, строго говоря, вам нужна новая ветвь для каждой перебазировки. (Например, вы можете сделать несколько перебаз, если внесете изменения после проверки кода)

использование git push --force-with-lease

Я только что узнал об git push --force-with-leaseальтернативеgit push --force , которая

отказывается обновлять ветку, если мы не ожидаем того состояния; т.е. никто не обновил ветку вверх по течению.

Проблема : Это, кажется, улучшается непосредственно в ситуации, когда мы используем just --force, но все еще есть некоторые предостережения, особенно когда я делаю git fetchвместо a git pull, который обновляет наши локальные ветки upstream, обманывая себя, --force-with-leaseдумая, что на удаленном сервере не было внесено никаких необъявленных изменений. филиал.

Чиль тен бринке
источник