Temos um repositório Git remoto que normalmente implantamos git push
no servidor de desenvolvimento e depois git pull
nos servidores ativos para obter a versão mais recente do repositório.
Mas se tivermos confirmado e forçado algumas revisões (sem uma git pull
nos servidores ativos), como podemos fazer uma git pull
referência ao compromisso mais antigo que queremos?
ou seja, algo como git pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4
git pull server:repo
git pull
uploadpack.allowReachableSHA1InWant
Desde o Git 2.5.0, essa variável de configuração pode ser ativada no servidor, aqui a solicitação do recurso GitHub e o GitHub confirmam a ativação desse recurso .
O Bitbucket Server o habilitou desde a versão 5.5 ou superior .
Uso:
fonte
Se algum processo no servidor ativo acessar imediatamente o conteúdo recém-extraído (por exemplo, você não pode trabalhar com o
git checkout 3ef0d
pull), considere marcar a versão que você deseja implantar na produção e fazer check-out específico dessa tag na produção, para que o pull não ocorra imediatamente mude seu diretório de trabalho. Caso contrário, você correria o risco de alguém empurrar pouco antes de sua atração.fonte
Observe que a
git pull git checkout my-old-commit
agora deixa você em um estado DETACHED HEAD - efetivamente você está enviando confirmações futuras neste repositório por um novo caminho de confirmação. Para um repositório de implantação, esse não é um problema importante, pois os únicos confirmados devem ser aqueles já confirmados corretamente antes de serem retirados.No entanto, às vezes é útil verificar se os marcadores de confirmação (cabeçalho, tags, controles remotos) parecem idênticos ao repositório principal. Para corrigir isso após o checkout:
git reset
- recoloca o cabeçotegit fetch
- sincroniza os marcadores para controles remotos [isso pode depender da versão do git - é certo que o nosso ambiente ainda está em 1.7 ... então não é mais necessário YMMV]fonte