Я пытаюсь понять разницу между
git push --force
и
git push --force-with-lease
Я предполагаю, что последний только отправляет на удаленный, если удаленный не имеет коммитов, которых нет в локальной ветви ?
--force-with-leaseаналогична инструкциям сравнения и замены на современных процессорах: тот, кто хочет, чтобы произошел обмен, предоставляет ожидаемое значение и новое значение. Система, выполняющая обмен, сравнивает ожидаемое значение с истинным текущим значением и выполняет обмен, если и только если оба значения равны. С git pushожидаемым значением будет то, что находится в имени удаленного отслеживания, например, git push --force-with-lease origin Xотправляет ваше собственное origin/Xвместе с новым желаемым значением; originGit говорит вам, если он сделал обмен или нет.
originсделал обмен, вы сделали. Если нет, вы можете запустить, git fetch originчтобы подобрать новое текущее значение, переработать ваши изменения, если необходимо, и выполнить еще одно принудительное сравнение и обмен, чтобы повторить попытку.
git help pushесть сценарии использования, объясняющие его назначение (в основном, чтобы вы не потеряли изменения, которые кто-то только что подтолкнул). Что мне немного неясно, так это то, как работает ветка удаленного отслеживания. Но, по-видимому, обычно нужно будет выглядеть именно так, как он выглядел в прошлый раз, когда вы делали коммитыfetchилиpullбез них.