Если вы немного знакомы с Git (и DVCS в целом) и начинаете изучать изменения в переписывании истории, вы в безопасности, если репозиторий только локальный, но у вас могут возникнуть проблемы, если вы работаете с удаленными устройствами и попытаетесь толкать такие изменения.
Особенность, которую я ожидаю, - это возможность включить «безопасный режим», который в принципе не позволит мне делать то, что я не должен делать ... И что я имею в виду под этим? Я имею в виду изменения переписывания истории для вещей, уже выдвинутых к происхождению. Я не могу определить это точно, но это будет включать такие случаи, как:
commit --amend
когда ГОЛОВА уже нажатаrebase
нелокального филиалаreset
ветви, которая была раздвинута
Это примеры ситуаций, которые, вероятно, приведут к следующему push
провалу (потому что это не будет перемотка вперед, IIRC). Я сделал это случайно и мне пришлось заново создать ветку на пульте. И мне все же повезло сделать это достаточно быстро, чтобы никто не вытащил историю, которую я переписал.
Я считаю, что можно идентифицировать изменения такого типа и, по требованию, помешать их внесению пользователем. Есть ли вариант для этого?
Если нет, как вы думаете, стоит ли пытаться его создать? Вы бы попытались точно определить, как определить такое «опасное изменение»?
--force
.Ответы:
Это выглядит очень близко, если не тот же вопрос, что и Стратегия предотвращения или перехвата Git History Rewrite
Подводя итог, вы можете включить
git config --system receive.denyNonFastforwards true
и
git config --system receive.denyDeletes true
Или напишите сообщение получения, чтобы отклонить все, что вы считаете переписать.
источник
denyNonFastforwards
, что по умолчанию (?), АdenyDeletes
нет. Эти два полезны, но я представляю себе решение на стороне клиента, которое помешало бы мне сделать, то есть сделать,commit --amend
если я не смогу нажать его (потому что HEAD уже был нажат).denyNonFastfowards
дляtrue
только на мастер - отрасли? Я бы хотел, чтобы мои ветки тем можно было перебазировать и принудительно подталкивать.Нет, потому что это часть философии git, чтобы дать вам полную силу и позволить вам управлять этой силой так, как вы хотите.
Если вы не придерживаетесь этой философии, то, возможно, стоит перейти на Mercurial, поскольку они позволяют переписывать историю, но ограниченным или, чтобы быть ясным, неохотным способом, который заставляет вас чувствовать, что это не очень хорошая идея.
источник
AFAIK, способ, которым git решает эти проблемы, заключается в том, что всякий раз, когда вы запрашиваете такое действие, оно выполняет его локально, но информирует вас о том, что то, что вы делаете, может иметь нежелательные последствия. В этот момент вы еще ничего не выдвинули, поэтому вы можете просмотреть свой локальный репозиторий и, возможно, отменить опасные изменения, прежде чем нажать. Вы должны обратить внимание на то, что говорит вам git, и вам лучше быть осторожным, когда вы исправляете такие ошибки.
источник