É possível extrair apenas um arquivo no Git?

177

Estou trabalhando em uma ramificação do Git que possui alguns testes quebrados e gostaria de extrair (mesclar alterações, não apenas substituir) esses testes de outra ramificação onde eles já estão corrigidos.

Eu sei que posso fazer

git pull origin that_other_branch

mas isso tentará mesclar muitos outros arquivos, pois ainda não estou pronto.

É possível extrair e mesclar apenas o arquivo especificado (e não tudo) desse outro ramo?

Esta não é uma duplicata da solicitação pull do Git para apenas um arquivo, pois todas as respostas para essa pergunta são como reverter o arquivo alterado localmente para a versão do repositório, sem alterar nenhuma ramificação.

Audrius Meskauskas
fonte
7
Acredito que nenhuma das entradas desta página fornece uma resposta para a pergunta. A pergunta significa extrair apenas um arquivo de um servidor remoto, não extrair todos os arquivos e verificar localmente apenas um. Portanto, a pergunta deve ser refeita ou a resposta selecionada desmarcada como a solução para a pergunta.
Mljrg 12/09/19

Respostas:

153

Você pode buscar e verificar apenas um arquivo desta maneira:

git fetch
git checkout -m <revision> <yourfilepath>
git add <yourfilepath>
git commit

Em relação ao git checkoutcomando: <revision> - um nome de ramo, ou seja origin/master <yourfilepath>, não inclui o nome do repositório (que você pode obter clicando copy pathno botão em uma página de arquivo no GitHub), ou sejaREADME.md

aleroot
fonte
23
Os códigos de hash exigidos pela opção -m podem ser impressos com git branch -v. Impressionante!
Audrius Meskauskas
2
Excelente. Isso me ajudou em mais de uma ocasião. Para esclarecer, o sinalizador -m parece estar satisfeito com o hash do commit do qual você deseja extrair seu arquivo único.
rd108
1
Isso funcionou para mim também. No entanto, eu executei o git log na minha ramificação remota para encontrar a reversão: por exemplo, $ git log remotes / origin / master
Dan
6
É possível extrair um arquivo específico sem puxar outros arquivos?
sinta
3
@aleroot o que significa <revision>?
Wakan Tanka 1/12/16
240

Aqui está um método um pouco mais fácil que eu inventei ao pesquisar isso:

git fetch {remote}
git checkout FETCH_HEAD -- {file}
Chris
fonte
4
fatal: referência inválida: FETCH_HEAD
Antony D'Andrea
4
Esta resposta possivelmente carece de um exemplo de trabalho. Não está claro se é necessário confirmar o próximo.
Dr_Zaszuś 16/08
@ Chris precisamos de {remote} se já estivermos no Branch? Se sim, por que?
Cloud Cho
2
Não é o mesmo que pull, que tentará mesclar, e é por isso que queremos usar pull.
JosephK
22
git checkout master -- myplugin.js

master = nome da filial

myplugin.js = nome do arquivo

Mawardy
fonte
e existe uma maneira de voltar atrás?
liyuan 25/03/19
1
não se esqueça de 'git pull' antes;)
matson kepson
16

@ A resposta de Mawardy funcionou para mim, mas minhas alterações foram no controle remoto, então eu tive que especificar a origem

git checkout origin/master -- {filename}
Luke Flournoy
fonte
2

Sim, aqui está o processo:

# Navigate to a directory and initiate a local repository
git init        

# Add remote repository to be tracked for changes:   
git remote add origin https://github.com/username/repository_name.git

# Track all changes made on above remote repository
# This will show files on remote repository not available on local repository
git fetch

# Add file present in staging area for checkout
git check origin/master -m /path/to/file
# NOTE: /path/to/file is a relative path from repository_name
git add /path/to/file

# Verify track of file(s) being committed to local repository
git status

# Commit to local repository
git commit -m "commit message"

# You may perform a final check of the staging area again with git status

fonte