O cenário:
- I fazer algumas mudanças em um único arquivo localmente e executar
git add
,git commit
egit push
- O arquivo é enviado ao repositório principal de origem remota
- Eu tenho outro repositório local que é implantado via Capistrano com o método "remote_cache" desse repositório remoto
- Agora, não quero implantar o aplicativo inteiro, apenas atualizar / fazer check-out desse arquivo único.
Isso é de alguma forma possível com o git? Não consegui encontrar nada que funcionasse nem consegui descobrir. Com SVN acabei de fazer svn up file
e pronto.
git
git-checkout
foresth
fonte
fonte
git restore -s origin/master -- path/to/file
. Veja minha resposta abaixo .Respostas:
É possível fazer (no repositório implantado)
A busca fará o download de todas as alterações recentes, mas não o colocará em seu código de saída atual (área de trabalho).
O checkout atualizará a árvore de trabalho com o arquivo específico das alterações baixadas (
origin/master
).Pelo menos isso funciona para mim, para aquelas pequenas correções de erros de digitação, nas quais é estranho criar um ramo etc. apenas para alterar uma palavra em um arquivo.
fonte
git status
vejo comoChanges to be committed:
- ou seja, preciso comprometê-las novamente? (Basta notar que eu queria para atualizar um único arquivo intocado mas o repo em si é tocado em uma máquina diferente)O código a seguir funcionou para mim:
fonte
fonte
git archive --remote=https://github.com/git/git.git master:git/contrib/completion git-completion.bash | tar -x
Dá-me uma mensagem de erro:fatal: Operation not supported by protocol.
tar
: s--to-stdout
,git archive --remote="gitolite3@<host>:<repo>" <tag> <file> | tar xf - --to-stdout
Com o Git 2.23 (agosto de 2019) e o novo comando (ainda experimental)
git restore
, visto em " Como redefinir todos os arquivos do diretório de trabalho, mas não da área de preparação? ", Isso seria:A idéia é:
git restore
lida apenas com arquivos, não com arquivos e ramificaçõesgit checkout
.Veja " Confundido por
git checkout
": é aí quegit switch
entra)codersam acrescenta nos comentários :
fonte
git restore -s upstream/master -- path/to/file
O que você pode fazer é:
Atualize seu repositório git local:
git fetch
Crie uma filial local e faça checkout nela:
git branch pouet && git checkout pouet
Aplique a confirmação que você deseja neste ramo:
git cherry-pick abcdefabcdef
(abcdefabcdef é o sha1 do commit que você deseja aplicar)
fonte
git checkout -b pouet
.Ou git stash (se houver alterações) no ramo em que está, checkout master, obtenha as alterações mais recentes, pegue esse arquivo na área de trabalho (ou no aplicativo inteiro). Faça o checkout da filial em que você estava. O Git stash aplica-se novamente ao estado em que você estava e, em seguida, corrija as alterações manualmente ou arraste-o substituindo o arquivo.
Dessa forma, não é tããããããão legal, mas funcionará se vocês não puderem descobrir mais nada.
fonte
Eu acho que encontrei um truque fácil.
Exclua o arquivo que você possui no repositório local (o arquivo que você deseja atualizar a partir da confirmação mais recente no servidor remoto)
E então faça um
git pull
Como o arquivo foi excluído, não haverá conflito
fonte