Temos um repositório git remoto que normalmente implantamos usando git push
em nosso servidor dev e depois git pull
em nossos servidores ativos para obter a versão mais recente do repositório.
Mas se nós confirmamos e enviamos algumas revisões (sem um git pull
nos servidores ativos), como podemos fazer um git pull
que esteja se referindo ao commit mais antigo que queremos?
ou seja, algo comogit pull -r 3ef0dedda699f56dc1062b5dcc2c59f7ad93ede4
Depois de puxar o repositório, você deve poder ir:
uploadpack.allowReachableSHA1InWant
Desde o Git 2.5.0 esta variável de configuração pode ser habilitada no servidor, aqui a solicitação de recurso do GitHub e o commit do GitHub habilitando esse recurso .
O Bitbucket Server o habilitou desde a versão 5.5+ .
Uso:
Se algum processo em seu servidor ativo acessar imediatamente o conteúdo recém-puxado (ou seja, você não pode trabalhar com
git checkout 3ef0d
após o pull), você deve considerar marcar a versão que deseja implantar na produção e verificar especificamente essa tag na produção, para que o pull não seja imediatamente altere seu diretório de trabalho. Caso contrário, você arriscaria alguém empurrando pouco antes de sua puxada.Observe que a
git pull git checkout my-old-commit
agora deixa você em um estado DETACHED HEAD - efetivamente você está enviando commits futuros neste repositório por um novo caminho de commit. Para um repositório de implantação, isso não é um problema importante, pois os únicos commits devem ser aqueles já confirmados corretamente antes de serem puxados.No entanto, às vezes é útil verificar se os marcadores de confirmação (head, tags, remotes) parecem idênticos ao repositório mestre. Para corrigir isso após o seu checkout:
git reset
- recoloca a cabeçagit fetch
- sincroniza os marcadores para controles remotos [isso pode ser dependente da versão do git - é certo que nosso ambiente ainda está no 1.7 ... então pode não ser mais necessário YMMV]