Estou tentando entender a diferença entre
git push --force
e
git push --force-with-lease
Meu palpite é que o último só envia para o controle remoto se o controle remoto não tiver confirmações que a filial local não possui ?
--force-with-lease
é semelhante à das instruções de comparação e troca nas CPUs modernas: quem deseja que a troca ocorra forneça o valor esperado e o novo valor. O sistema que faz a troca compara o valor esperado com o valor atual verdadeiro e faz a troca se e somente se os dois forem iguais. Com git push
, o valor esperado é o que estiver no nome do rastreamento remoto, por exemplo, git push --force-with-lease origin X
envia o seu próprio origin/X
junto com o novo valor desejado; origin
O Git diz se você fez a troca ou não.
origin
fez a troca, está feito. Caso contrário, você pode executar git fetch origin
para pegar o novo valor atual, refazer suas alterações, se necessário, e executar outra comparação e troca de força com concessão para tentar novamente.
git help push
tem casos de uso explicando sua finalidade (basicamente para impedir que você troque uma alteração que alguém acabou de enviar). O que não está claro para mim é como o ramo de rastreamento remoto funciona. Mas, presumivelmente, normalmente será necessário ter a aparência exata da última vez que você fez umfetch
oupull
sem novos commit.