I seguenti file dell'albero di lavoro non tracciati verrebbero sovrascritti dall'unione, ma non mi interessa


344

Sul mio ramo avevo alcuni file in .gitignore

Su un ramo diverso questi file non lo sono.

Voglio unire il diverso ramo nel mio e non mi interessa se quei file non vengono più ignorati o meno.

Purtroppo ottengo questo:

I seguenti file dell'albero di lavoro non tracciati verrebbero sovrascritti dall'unione

Come potrei modificare il mio comando pull per sovrascrivere quei file, senza che io debba trovare, spostare o eliminare quei file da solo?





1
Questa è la risposta migliore in quanto rimuoverà solo i file che si stanno bloccando da fusione: stackoverflow.com/a/52255219/551045
RedX

Risposte:


539

Il problema è che non stai monitorando i file localmente ma i file identici vengono tracciati da remoto, quindi per "tirare" il tuo sistema sarebbe costretto a sovrascrivere i file locali che non sono controllati dalla versione.

Prova a correre

git add * 
git stash
git pull

Ciò terrà traccia di tutti i file, rimuoverà tutte le modifiche locali a tali file e quindi otterrà i file dal server.


59
git add -A .; git stashha funzionato per me. La git add *variante si lamentava di percorsi ignorati.
imsky,

11
Ho provato git add., Git stash, git pull. Funzionava, ma ancora non capisco perché?
ARK,

1
Per me, avevo un file remoto che era stato rintracciato e nel mio repository locale avevo un file con lo stesso nome che non era stato rintracciato. Quindi, se aggiungi il file locale, metti via le modifiche e poi tira, il file remoto dovrebbe sovrascrivere il file locale.
userFog

2
Ecco un buon link per capire come funziona, se qualcuno è interessato. git-scm.com/book/en/v1/Git-Tools-Stashing
James M. Lay

2
//, Questo in realtà non va molto oltre lo scopo di questo errore, davvero.
Nathan Basanese,

137

Puoi provare a cancellare i file non tracciati dal comando locale

Git 2.11 e versioni più recenti:

git clean  -d  -f .

Versioni precedenti di Git:

git clean  -d  -f ""

Dove -dpuò essere sostituito con il seguente:

  • -x vengono rimossi anche i file ignorati e i file sconosciuti a Git.

  • -d rimuovere le directory non tracciate oltre ai file non tracciati.

  • -f è necessario per forzare l'esecuzione.

Ecco il link che può anche essere utile.


23
Vorrei aggiungere -iper la modalità interattiva. Oltre a cancellare la directory indesiderata, ho anche cancellato le mie impostazioni utente per il progetto :-(
silente

6
Vale la pena scansionare i commenti per ottenere una risposta simile a quella che -xpuò ferire.
stupido,

10
Ma questo è un compito molto pericoloso e non annullabile !! potresti perdere molti file! STAI ATTENTO!!
Mohamed Kawsara,

16
Ciò ha eliminato tutta la directory del mio fornitore su Slim Framework . ESSERE MOLTO CARREFOLO CON QUESTO COMANDO
RousseauAlexandre,

2
Dovresti rimuovere la "x" dalla tua risposta. È molto pericoloso!
Earl3s

107

Gli unici comandi che hanno funzionato per me sono stati:

git fetch --all
git reset --hard origin/{{your branch name}}

5
Va notato che questa risposta è necessaria se sono stati rimossi i sottomoduli e li sono stati letti come librerie nel repository originale. Avevo bisogno di una risposta e questo era tutto ciò che funzionava.
Routhinator,

Non avevo sottomoduli e ho provato git clean e git stash come suggerito nelle altre risposte, ma solo questo mi ha aiutato.
kslstn,

Dopo aver eliminato una varietà di sottomoduli, questa è stata l'unica cosa che ha funzionato anche per me. Di particolare nota, ho avuto un problema di distinzione tra maiuscole e minuscole anche su un file. Ex. Da XML.php a Xml.php nella cartella del mio venditore dal compositore.
KazaJhodo,

1
Ha funzionato anche per me. Puoi per favore spiegare cosa sta succedendo? Non capisco
Dimitris Karamanis,

1
Questo ha eliminato due dei miei commit locali, fai attenzione prima di usare questo!
David Cian,

27

Una sostituzione per git mergequesto sovrascriverà i file non tracciati

I commenti qui sotto usano 'FOI' per i 'file di interesse', i file che

  • esiste nel ramo donatore,
  • non esistono nel ramo ricevente,
  • e stanno bloccando l'unione perché sono presenti e non tracciati nella directory di lavoro.
git checkout -f donor-branch   # replace FOI with tracked `donor` versions
git checkout receiving-branch  # FOI are not in `receiving`, so they disapppear
git merge donor-branch  # now the merge works

Una sostituzione per git pullquesto sovrascriverà i file non tracciati

pull = fetch + merge, quindi seguiamo git fetchil git checkout -f, git checkout, git mergetrucco sopra.

git fetch origin  # fetch remote commits
git checkout -f origin/mybranch  # replace FOI with tracked upstream versions
git checkout mybranch  # FOI are not in mybranch, so they disapppear
git merge origin/mybranch  # Now the merge works. fetch + merge completes the pull.

Spiegazione dettagliata

git merge -fnon esiste, ma git checkout -fesiste.

Utilizzeremo git checkout -f+ git checkoutper rimuovere i file di interesse (vedi sopra), quindi la tua unione può procedere normalmente.

Passaggio 1. Questo passaggio sostituisce forzatamente FOI non monitorato con versioni tracciate del ramo donatore (verifica anche il ramo donatore e aggiorna il resto della directory di lavoro).

git checkout -f donor-branch

Passaggio 2. Questo passaggio rimuove i FOI perché vengono tracciati nel nostro ramo (donatore) corrente e assenti nel receiving-branchpassaggio a.

git checkout receiving-branch

Passaggio 3. Ora che gli FOI sono assenti, l'unione nel ramo del donatore non sovrascriverà alcun file non tracciato, quindi non otteniamo errori.

git merge donor-branch

3
È troppo pulito per essere la 7a o 8a risposta!
Majed DH

1
Grazie, @MajedDH, mi hai reso felice! <3
Esteis

1
Questo qui era l'insetto che stavo cercando! Grazie
AFM-Horizon,

Felicissimo di averti aiutato, @ AFM-Horizon!
Esteis,

20

Rimuovi tutti i file non tracciati:

git clean  -d  -fx .

8
eliminare i file eventualmente utilizzati in un progetto non dovrebbe essere la vera soluzione
Erdinç Çorbacı

4
yikes, ripulito anche i file IDE :(
kisna il



12

Aggiornamento: una versione migliore

Questo strumento ( https://github.com/mklepaczewski/git-clean-before-merge ):

  • elimina i file non tracciati identici ai loro git pullequivalenti,
  • ripristinare le modifiche ai file modificati la cui versione modificata è identica ai loro git pullequivalenti,
  • segnalare file modificati / non tracciati che differiscono dalla loro git pullversione,
  • lo strumento ha l' --pretendopzione che non modificherà alcun file.

Vecchia versione

In che modo questa risposta differisce dalle altre risposte?

Il metodo presentato qui rimuove solo i file che verrebbero sovrascritti dall'unione. Se nella directory sono presenti altri file non monitorati (probabilmente ignorati), questo metodo non li rimuoverà.

La soluzione

Questo frammento estrarrà tutti i file non tracciati che verrebbero sovrascritti git pulle li eliminerà.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

e poi fai semplicemente:

git pull

Questo non è il comando git porcelain, quindi ricontrolla sempre cosa farebbe con:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Spiegazione - perché una fodera fa paura:

Ecco una ripartizione di ciò che fa:

  1. git pull 2>&1- cattura l' git pulloutput e reindirizza tutto su stdout in modo da poterlo catturare facilmente con grep.
  2. grep -E '^\s- l'intenzione è quella di acquisire l'elenco dei file non tracciati che verrebbero sovrascritti git pull. I nomi dei file hanno un sacco di caratteri bianchi davanti a loro, quindi li usiamo per ottenerli.
  3. cut -f2- - rimuove gli spazi bianchi dall'inizio di ogni riga catturata in 2.
  4. xargs -I {} rm -rf "{}"- ci xargsconsente di scorrere su tutti i file, salvare il loro nome in "{}" e chiamare rmper ciascuno di essi. Usiamo -rfper forzare l'eliminazione e rimuovere le directory non tracciate.

Sarebbe bello sostituire i passaggi 1-3 con il comando di porcellana, ma non sono a conoscenza di alcun equivalente.


Grazie, ho spesso file non tracciati nella mia directory di lavoro che non voglio eliminare o impegnati. Nel mio caso dovevo sostituire git pullcongit checkout <branch_name>
mihow il

6

Se si considera l'utilizzo del -fflag, è possibile eseguirlo prima come dry-run. Solo che sai in anticipo che tipo di situazione interessante finirai dopo ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.

6

Oltre alla risposta accettata, puoi ovviamente rimuovere i file se non sono più necessari specificando il file:

git clean -f '/path/to/file/'

Ricordati di eseguirlo prima con il flag -n se vuoi vedere quali file git clean rimuoverà. Si noti che questi file verranno eliminati. Nel mio caso, comunque, non mi importava di loro, quindi quella era una soluzione migliore per me.


5

Un modo per farlo è nascondere le modifiche locali ed estrarre dal repository remoto. In questo modo, non perderai i tuoi file locali poiché i file andranno allo stash.

git add -A
git stash
git pull

Puoi controllare i tuoi file locali nascosti usando questo comando - git stash list


4

Per chi non lo sapesse, git ignora le differenze di nome maiuscole / minuscole in file e cartelle. Questo risulta essere un incubo quando li rinomini con lo stesso nome esatto con un caso diverso.

Ho riscontrato questo problema quando ho rinominato una cartella da "Petstore" a "petstore" (maiuscolo e minuscolo). Avevo modificato il mio file .git / config per smettere di ignorare il caso, apportato modifiche, annullato i miei commit e bloccato le mie modifiche per passare a un altro ramo. Non ho potuto applicare le mie modifiche nascoste a questo altro ramo.

La correzione che ho scoperto che ha funzionato è stata modificare temporaneamente il mio file .git / config per ignorare nuovamente temporaneamente il caso. Questo ha git stash applyavuto successo. Quindi, ho cambiato nuovamente ignoreCase a false. Ho quindi aggiunto tutto tranne i nuovi file nella cartella del petstore che git ha affermato stranamente che sono stati eliminati, per qualsiasi motivo. Ho eseguito il commit delle mie modifiche, quindi sono corso git reset --hard HEADper sbarazzarmi di quei nuovi file non tracciati. Il mio commit è apparso esattamente come previsto: i file nella cartella sono stati rinominati.

Spero che questo ti aiuti a evitare il mio stesso incubo.


Non ha funzionato per me. Ho cancellato tutti i file nella cartella. Allora git pull -fallora git checkout .. Che incubo.
m.rufca,

Veramente? Ha funzionato bene per me solo poche settimane fa. Hai provato a modificare il tuo file gitconfig per avviare / interrompere l'ignoranza del caso come appropriato?
A. Davidson,

Grazie. Ho dovuto unirmi dal master dopo aver corretto l'involucro nel percorso della cartella. Sono stato in grado di unirlo con git ignore case attivato, dopo di che ho appena riattivato la sensibilità del case.
Rubenisme,

3

Né clean / reset / hard checkout / rebase hanno funzionato per me.

Quindi ho appena rimosso i file di cui Git si è lamentato *

rm /path/to/files/that/git/complained/about

* Ho verificato se questi file possono essere rimossi controllando un repository nuovo di zecca in una cartella separata (i file non erano lì)


1

Nel mio caso quando ho avuto questo problema. Avevo un file locale che avevo rinominato sul telecomando.

Quando git pullho provato a Git mi ha detto che il nuovo nome file non è stato rintracciato, che era sul telecomando sebbene non esistesse ancora su local.

Perché non c'era un esempio locale a livello locale, non ho potuto farlo git pullfino a quando non ho fatto git rmil vecchio nome di file (che all'inizio non era ovvio a causa della mia stupida idea di rinominarlo).


0

Se hai i file scritti sotto .gitignore, rimuovi i file ed esegui nuovamente git pull. Questo mi ha aiutato.


0

Il problema è quando abbiamo modifiche in entrata che uniranno file non tracciati, git si lamenta. Questi comandi mi hanno aiutato:

git clean -dxf
git pull origin master
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.