È possibile estrarre solo un file in Git?


177

Sto lavorando su un ramo Git che ha alcuni test rotti e vorrei estrarre (unire le modifiche, non solo sovrascrivere) questi test da un altro ramo in cui sono già stati corretti.

So di poterlo fare

git pull origin that_other_branch

ma questo tenterà di unire molti altri file, per questo non sono ancora pronto.

È possibile estrarre e unire solo il file specificato (e non tutto) da quell'altro ramo?

Questo non è un duplicato della richiesta pull di Git per un solo file poiché tutte le risposte a quella domanda sono come ripristinare il file modificato localmente nella versione del repository, senza cambiare alcun ramo.


7
Credo che nessuna delle voci in questa pagina fornisca una risposta alla domanda. La domanda significa estrarre solo un file da un server remoto, non estrarre tutti i file e verificarne localmente solo uno. Quindi la domanda dovrebbe essere rifatta o la risposta selezionata non contrassegnata come soluzione alla domanda.
mljrg,

Risposte:


153

Puoi recuperare e quindi estrarre solo un file in questo modo:

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

Per quanto riguarda il git checkoutcomando: <revision> - un nome di ramo, cioè origin/master <yourfilepath>non include il nome del repository (che puoi ottenere facendo copy pathclic sul pulsante su una pagina di file su GitHub), ovveroREADME.md


23
I codici hash richiesti da -m switch possono essere stampati con git branch -v. Eccezionale!
Audrius Meskauskas il

2
Eccellente. Questo mi ha aiutato in più di un'occasione. Per chiarire, il flag -m sembra essere felice con l'hash del commit da cui vuoi estrarre il tuo singolo file.
rd108

1
Questo ha funzionato anche per me. Tuttavia, ho eseguito git log sul mio ramo remoto per trovare l'inversione: ad es. Telecomandi / origine / master $ git log
Dan

6
È possibile estrarre file specifici senza estrarre altri file?
sentirsi bene e programmare

3
@aleroot cosa significa <revision>?
Wakan Tanka,

240

Ecco un metodo leggermente più semplice che ho appena escogitato durante la ricerca di questo:

git fetch {remote}
git checkout FETCH_HEAD -- {file}

4
fatale: riferimento non valido: FETCH_HEAD
Antony D'Andrea

4
Questa risposta probabilmente manca di un esempio funzionante. Non è chiaro se si debba impegnarsi successivamente.
Dr_Zaszuś,

@Chris abbiamo bisogno di {remote} se siamo già in Branch? Se si, perché?
Cloud Cho,

2
Non è lo stesso di pull, che tenterà di unire, motivo per cui vogliamo usare pull.
JosephK,

22
git checkout master -- myplugin.js

master = nome del ramo

myplugin.js = nome del file


e c'è un modo per tornare indietro?
Liyuan,

1
non dimenticare di 'git pull' prima;)
matson kepson

16

La risposta di Mawardy ha funzionato per me, ma le mie modifiche erano sul telecomando, quindi ho dovuto specificare l'origine

git checkout origin/master -- {filename}

2

Sì, ecco il 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.