Estou usando o git e trabalhando no ramo mestre. Esta ramificação tem um arquivo chamado app.js
.
Eu tenho um experiment
ramo no qual fiz várias alterações e toneladas de confirmações. Agora, quero trazer todas as alterações feitas apenas para app.js
de experiment
para master
ramificação.
Como faço isso?
Mais uma vez, não quero mesclar. Eu só quero trazer todas as alterações app.js
de experiment
filial para master
filial.
git
git-checkout
Nick Vanderbilt
fonte
fonte
master
pode divergirexperiment
, por exemplo, pode conter alterações mescladas de outros ramos que seriam perdidos no arquivo, apenas copiadas. PS, por outro lado, ele não deseja mesclar, mas, tanto quanto eu sei, ogit merge
termo é apenas para ramificação, não para arquivo específico, portanto não há contradição aqui.Respostas:
Veja também git como desfazer alterações de um arquivo?
Atualização em agosto de 2019, Git 2.23
Com o novo
git switch
e osgit restore
comandos, isso seria:Por padrão, apenas a árvore de trabalho é restaurada.
Se você deseja atualizar o índice também (ou seja, restaurar o conteúdo do arquivo e adicioná-lo ao índice em um comando):
Como Jakub Narębski menciona nos comentários:
também funciona, exceto que, conforme detalhado na pergunta do SO " Como recuperar um único arquivo de uma revisão específica no Git? ", você precisa usar o caminho completo no diretório raiz do repositório.
Daí o caminho / to / app.js usado por Jakub em seu exemplo.
Como Frosty menciona no comentário:
Mas, para
git checkout
ougit show
, você pode realmente fazer referência a qualquer revisão que desejar, conforme ilustrado na pergunta SO " revisão de git checkout de um arquivo no git gui ":seria o mesmo que $ FILENAME é o caminho completo de um arquivo com versão.
$REVISION
pode ser como mostrado emgit rev-parse
:e assim por diante.
schmijos acrescenta nos comentários :
fonte
experiment:./app.js
. (Você não precisa especificar o caminho completo.) Aprendi isso graças à mensagem de erro muito útil que o git me deu: "Você quis dizer 'mybranch: full / caminho / para / meu / arquivo.xsl', também conhecido como 'mybranch: ./file.xsl '? " Sim eu fiz! Acho que nunca fiquei tão encantado com uma mensagem de erro fatal.git restore -s new-feature path/to/app.js
Tudo é muito mais simples, use o git checkout para isso.
Suponha
you're on master
ramificação, para obterapp.js from new-feature
ramificação faça:Isso exibirá o conteúdo do arquivo desejado. Como sempre, você pode usar parte do sha1 em vez do nome do ramo do novo recurso para obter o arquivo como estava naquele commit específico.
Nota :
new-feature
precisa ser uma filial local , não remota.fonte
git checkout origin/source_branch path/to/file
porque se você não tiver atualizado a ramificação de origem do seu repositório local, poderá obter uma versão antiga do arquivo ... Pergunte-me como eu sei. ;)Exemplo:
Isso não funcionará se o nome do seu ramo tiver um período.
fonte
Complementar às respostas de VonC e chhh.
ou
fonte
--
) entre o nome da ramificação e os caminhos é opcional? É apenas para impedir que caminhos, que começariam com um traço, sejam tratados como opções / opções?--
é opcional, mas é mais útil evitar conflitos com nomes de filiais. Por exemplo,git checkout -- foo
significa "retirar o arquivo foo do HEAD" (ou seja, substituir as alterações locais no foo , isto é, um subconjunto degit reset --hard
), masgit checkout foo
pode significar isso ou "vamos para o ramo foo ".Ou se você quiser todos os arquivos de outro ramo:
fonte
.
faz uma enorme diferença: em vez de mudar para outro ramo, ele copia todos os arquivos de lá, deixando-o no atual. Você obtém conteúdo de outro ramo sem entrar nele.Revise o arquivo no github e puxe-o de lá
Essa é uma abordagem pragmática que não responde diretamente ao OP, mas alguns acharam úteis:
Se a ramificação em questão estiver no GitHub, você poderá navegar até a ramificação e o arquivo desejados usando qualquer uma das muitas ferramentas oferecidas pelo GitHub, clique em 'Raw' para visualizar o texto sem formatação e (opcionalmente) copiar e colar o texto como desejado.
Eu gosto dessa abordagem porque permite que você olhe o arquivo remoto na íntegra antes de puxá-lo para a máquina local.
fonte
Se você desejar o arquivo de uma confirmação específica (qualquer ramificação), diga 06f8251f
git checkout 06f8251f path_to_file
por exemplo, no windows:
git checkout 06f8251f C: \ A \ B \ C \ D \ file.h
fonte
Outra maneira é criar um patch com as diferenças e aplicá-lo no ramo mestre. Por exemplo. Digamos que o último commit antes de você começar a trabalhar no app.js seja 00000aaaaa e o commit contendo a versão desejada seja 00000bbbbb
Você executa isso no ramo da experiência:
Isso criará um arquivo com todas as diferenças entre essas duas confirmações para app.js que você pode aplicar onde quiser. Você pode manter esse arquivo em qualquer lugar fora do projeto
Então, no master, você apenas executa:
agora você verá as alterações nos projetos como se as tivesse feito manualmente.
fonte
Espero que isso ajude você. Entre em contato se você tiver alguma dúvida.
fonte