É 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.


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


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}

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


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}

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.