Come impongo "git pull" per sovrascrivere i file locali?



Answers

Prova questo:

git reset --hard HEAD
git pull

Dovrebbe fare quello che vuoi.

Question

Come posso forzare una sovrascrittura di file locali su un git pull ?

Lo scenario sta seguendo:

  • Un membro del team sta modificando i modelli per un sito web su cui stiamo lavorando
  • Aggiungono alcune immagini alla directory delle immagini (ma dimentica di aggiungerle sotto il controllo del codice sorgente)
  • Stanno inviando le immagini per posta, più tardi, a me
  • Sto aggiungendo le immagini sotto il controllo del codice sorgente e inserendole in GitHub insieme ad altre modifiche
  • Non possono estrarre gli aggiornamenti da GitHub perché Git non vuole sovrascrivere i loro file.

Gli errori che sto ottenendo sono:

errore: il file dell'albero di lavoro non tracciato "public / images / icon.gif" verrebbe sovrascritto dall'unione.

Come faccio a forzare Git a sovrascriverli? La persona è un designer - di solito risolvo tutti i conflitti a mano, quindi il server ha la versione più recente che devono solo aggiornare sul proprio computer.




Come Riccio penso che le risposte siano terribili. Ma anche se la risposta di Hedgehog potrebbe essere migliore, non penso che sia così elegante come potrebbe essere. Il modo in cui ho trovato di farlo è utilizzando "fetch" e "merge" con una strategia definita. Il che dovrebbe fare in modo che le modifiche locali vengano mantenute purché non siano uno dei file con cui si tenta di forzare una sovrascrittura.

Prima fai un commit delle tue modifiche

 git add *
 git commit -a -m "local file server commit message"

Quindi recuperare le modifiche e sovrascrivere se c'è un conflitto

 git fetch origin master
 git merge -s recursive -X theirs origin/master

"-X" è un nome di opzione e "loro" è il valore per tale opzione. Stai scegliendo di utilizzare le "loro" modifiche, invece delle "tue" modifiche se c'è un conflitto.




Un modo più semplice sarebbe:

git checkout --theirs /path/to/file.extension
git pull origin master

Questo sovrascriverà il tuo file locale con il file su git




Potresti trovare utile questo comando per eliminare le modifiche locali:

git checkout <your-branch> -f

E poi fai una pulizia (rimuove i file non tracciati dall'albero di lavoro):

git clean -f

Se si desidera rimuovere le directory non tracciate oltre ai file non tracciati:

git clean -fd



Ho letto tutte le risposte ma stavo cercando un singolo comando per farlo. Ecco cosa ho fatto. Aggiunto un alias git a .gitconfig

[alias]
      fp = "!f(){ git fetch ${1} ${2} && git reset --hard ${1}/${2};};f"

Esegui il tuo comando come

git fp origin master

equivalente a

git fetch origin master
git reset --hard origin/master



Ho avuto un problema simile. Dovevo fare questo:

git reset --hard HEAD
git clean -f
git pull



Sulla base delle mie esperienze simili, la soluzione offerta da Strahinja Kustudic sopra è di gran lunga la migliore. Come altri hanno sottolineato, la semplice reimpostazione completa rimuoverà tutti i file non tracciati che potrebbero includere molte cose che non si desidera rimuovere, come i file di configurazione. Ciò che è più sicuro, è quello di rimuovere solo i file che stanno per essere aggiunti, e per questo, è probabile che si voglia anche fare il checkout di tutti i file modificati localmente che stanno per essere aggiornati.

Tenendo a mente, ho aggiornato lo script di Kustudic per fare proprio questo. Ho anche corretto un refuso (mancante nell'originale).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull



Questi quattro comandi funzionano per me.

git reset --hard HEAD
git checkout origin/master
git branch -D master
git checkout -b master

Per controllare / tirare dopo aver eseguito questi comandi

git pull origin master

Ho provato molto ma alla fine ho avuto successo con questi comandi.




Bonus:

Parlando di pull / fetch / merge nelle risposte di cui sopra, mi piacerebbe condividere un trucco interessante e produttivo,

git pull --rebase

Questo comando sopra è il comando più utile nella mia vita git che ha salvato un sacco di tempo.

Prima di spingere il tuo nuovo commit al server, prova questo comando e sincronizzerà automaticamente le ultime modifiche del server (con un fetch + unisci) e posizionerà il tuo commit nella parte superiore del log git. Non c'è bisogno di preoccuparsi di pull / fusione manuale.

Trova i dettagli su: http://gitolite.com/git-pull--rebase




Requisiti:

  1. Tieni traccia dei cambiamenti locali così nessuno li perde mai.
  2. Rendere il repository locale corrispondente al repository di origine remoto.

Soluzione:

  1. Conserva le modifiche locali.
  2. Scarica con una pulizia di file e directory ignorando .gitignore e hard reset all'origine .

    git stash --include-untracked
    git fetch --all
    git clean -fdx
    git reset --hard origin/master
    



Il problema con tutte queste soluzioni è che sono tutte o troppo complesse, o, un problema ancora più grande, è che rimuovono tutti i file non tracciati dal server web, cosa che non vogliamo visto che ci sono sempre file di configurazione necessari che sono attivi il server e non nel repository Git.

Ecco la soluzione più pulita che stiamo usando:

# Fetch the newest code
git fetch

# Delete all files which are being added, so there
# are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    rm -f -- "$file"
done

# Checkout all files which were locally modified
for file in `git diff --name-status | awk '/^[CDMRTUX]/ {print $2}'`
do
    git checkout -- "$file"
done

# Finally pull all the changes
# (you could merge as well e.g. 'merge origin/master')
git pull
  • Il primo comando recupera i dati più recenti.

  • Il secondo comando controlla se ci sono file che vengono aggiunti al repository ed elimina quei file non tracciati dal repository locale che causerebbero conflitti.

  • Il terzo comando controlla tutti i file che sono stati modificati localmente.

  • Infine eseguiamo un pull per aggiornare la versione più recente, ma questa volta senza conflitti, poiché i file non tracciati che sono nel repository non esistono più e tutti i file modificati localmente sono già gli stessi del repository.




Ho avuto lo stesso problema. Nessuno mi ha dato questa soluzione, ma ha funzionato per me.

L'ho risolto da:

  1. Cancellare tutti i file. Lascia solo la directory .git.
  2. git reset --hard HEAD
  3. git pull
  4. git push

Ora funziona.




L'ho appena risolto da solo:

git checkout -b tmp # "tmp" or pick a better name for your local changes branch
git add -A
git commit -m 'tmp'
git pull
git checkout master # Or whatever branch you were on originally
git pull
git diff tmp

dove l'ultimo comando fornisce un elenco delle modifiche locali. Continua a modificare il ramo "tmp" finché non è accettabile e quindi unisci di nuovo a master con:

git checkout master && git merge tmp

Per la prossima volta, probabilmente puoi gestirlo in un modo più pulito cercando "git stash branch", anche se lo stash rischia di causare problemi nei primi tentativi, quindi fai il primo esperimento su un progetto non critico ...




Sembra che il modo migliore sia fare prima:

git clean

Per eliminare tutti i file non tracciati e quindi continuare con il solito git pull ...




Basta fare

git fetch origin branchname
git checkout -f origin/branchname // This will overwrite ONLY new included files
git checkout branchname
git merge origin/branchname

In questo modo si evitano tutti gli effetti collaterali indesiderati, come l'eliminazione di file o directory che si desidera conservare, ecc.




Links