git push --force-with-lease vs. --force - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь понять разницу между

git push -f

и

git push --force-with-lease

Я полагаю, что последний только подталкивает к удаленному , если пульт не имеетподтверждает, что в локальной ветке нет ?

Если есть лучший способ сформулировать вопрос, lmk, но, надеюсь, это понятно.

Ответы [ 5 ]

0 голосов
/ 21 августа 2019

Сила с арендой не обязательно безопасна.Это просто работает, как сказала Сильви.Одно замечание: в git ветка - это просто указатель на коммит.И коммиты указывают на ноль или более родительских коммитов.Даже если вы полностью изменили ветку с помощью жесткого git-сброса и принудительного пуша или пуша с принудительной арендой без необходимости, это не обязательно является большой проблемой.Вы можете использовать свой локальный git reflog, чтобы увидеть, как ваш локальный совет по веткам (Где был HEAD в то время?) Изменился, сбросить и снова нажать на ветку.Тогда вы потеряете только новые коммиты в удаленной ветке, но даже они могут быть восстановлены членами команды.

0 голосов
/ 29 октября 2018

git push --force разрушительно, потому что безоговорочно перезаписывает удаленный репозиторий любым локальным.Настоятельно не рекомендуется использовать git's push --force , поскольку он может уничтожать другие коммиты, уже переданные в общий репозиторий.Одна из наиболее распространенных причин силовых толчков - это когда мы вынуждены перебазировать ветку.

Например.У нас есть проект с веткой функций, над которой будут работать Алиса и Боб.Они оба клонируют этот репозиторий и начинают работу.Алиса вначале завершает свою часть функции и переносит ее в главный репозиторий.Это все хорошо.Боб также заканчивает свою работу, но, прежде чем поднять ее, он замечает, что некоторые изменения были объединены с мастером.Желая сохранить чистое дерево, он выполняет ребаз против ветки master.Конечно, когда он пойдет, чтобы подтолкнуть эту перебазированную ветвь, она будет отклонена.Однако, не понимая, что Алиса уже подтолкнула ее работу, он выполняет push -force.К сожалению, это сотрет всю запись об изменениях Алисы в центральном репозитории.

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

Здесь - хороший пост относительно gitpush --force и git push --force-with-lease.

0 голосов
/ 22 октября 2018

Ищем ответ из достоверных и / или официальных источников.

Упомянутое "1005 * torek " в комментариях torek *1006* в комментариях и в его другой ответ еще больше искажен источниками самого Git .

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

Эта функция была введена в commit28f5d17 (декабрь 2013 г., Git v1.8.5-rc0)

--force-with-lease будет защищать все удаленные ссылки, которые будут обновлены, требуя, чтобы их текущее значение было таким же, как у некоторыхразумное значение по умолчанию, если не указано иное;

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

Итак," аренда "означает:

" force-with-lease ": ВыПредположим, что вы взяли аренду реф, когда выбрали, чтобы решить, какой должна быть перебазированная история, и вы можете отменить ее, только если договор аренды не был нарушен.

В источниках все еще упоминается "cas":

  • Эта опция была оригинальнойОн называется "cas" (для сравнения и обмена), имя, которое никому не понравилось, потому что оно было слишком техническим.
  • Вторая попытка назвала его «lockref» (потому что это концептуально похоже на толкание после взятия блокировки), но слово «блокировка» было ненавистно, потому что оно подразумевало, что оно может отклонить толчок другими, что не так.эта опция работает.
  • Этот раунд называет его «принудительным с арендой».
    Вы предполагаете, что взяли в аренду аренду рефери, когда выбирали, чтобы решить, какой должна быть перебазированная история, и вы можете отменить ее, только еслиаренда не была нарушена.

Итак: "git push --force-with-lease против --force"

Как я уже упоминал в "push --force-with-lease по умолчанию", как упоминается в Git 2.13 (Q2 2017), опция --force-with-lease может быть проигнорирована , если фоновый процесс (аналогичный тому, который вы найдете в IDE с плагином Git) запускается git fetch origin.
В этом случае --force преобладает.

0 голосов
/ 26 октября 2018

Если предположить, что любые перехваты предварительного получения на сервере принимают push, это всегда будет успешным:

git push --force

В то время как перед запуском выполняется специальная проверка на стороне клиента:

git push --force-with-lease

Вы можете запустить конкретную проверку самостоятельно.Вот алгоритм «проверки аренды»:

  1. Определите вашу текущую ветвь.

  2. Выполните git for-each-ref refs/remotes.Обратите внимание на идентификатор коммита, который, по мнению вашего git-клиента, соответствует исходному состоянию вашей текущей ветки.

Например, если вы находитесь на ветке "foo", запишите фиксациюидентификатор, связанный с "refs / remotes / origin / foo".

Определите фактический идентификатор фиксации удаленной ветви на вышестоящем git-сервере прямо сейчас.

Разрешить «git push» можно только в том случае, если вы подтвердили коммитизвлеченные из шага 2 и 3 согласны.Другими словами, продолжайте, только если представление вашего локального клона git о восходящем потоке согласуется с фактическим восходящим.

Здесь есть печальное следствие: поскольку git fetch обновляет все ссылки в разделе "refs / remotes /origin / * "для их последних версий, эта комбинация команд по существу идентична git push --force:

git fetch

# The command below behaves identically to "git push --force"
# if a "git fetch" just happened!

git push --force-with-lease

Чтобы обойти эту врожденную слабость в git push --force-with-lease, я стараюсь никогда не запускать git fetch.Вместо этого я всегда запускаю git pull --rebase всякий раз, когда мне нужно синхронизироваться с апстримом, так как git pull обновляет только один ref под refs / remotes, сохраняя "аренды" --force-with-lease полезным.

0 голосов
/ 15 октября 2018

force перезаписывает удаленную ветку вашей локальной веткой.

--force-with-lease - более безопасный вариант, который не будет перезаписывать какую-либо работу в удаленной ветви, если в удаленную ветвь было добавлено больше коммитов (другим членом команды или сотрудником или кем-либо еще).Это гарантирует, что вы не перезапишете чью-либо работу с помощью принудительного нажатия.

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

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

Я уверен, что вы посмотрели документы, но здесь может содержаться более многословное объяснение:

https://git -scm.com / docs / git-push

...