Come faccio a risolvere git dicendo "Commetti le modifiche o nascondile prima di poterle unire"?


763

Ho effettuato alcuni aggiornamenti sul mio computer locale, li ho trasferiti in un repository remoto e ora sto provando a eseguire il pull delle modifiche sul server e ricevo il messaggio;

errore: le modifiche locali ai seguenti file verrebbero sovrascritte dall'unione:

wp-content / W3TC-config / master.php

Per favore, commetti le modifiche o nascondile prima di poterle unire.

Quindi ho corso

git checkout -- wp-content/w3tc-config/master.php

e riprovato e ricevo lo stesso messaggio. Suppongo che abbia w3tccambiato qualcosa nel file di configurazione sul server. Non mi importa se la copia locale o remota va sul server (suppongo che quella remota sia la migliore), voglio solo essere in grado di unire il resto delle mie modifiche (aggiornamenti del plugin).

Qualche idea?



11
Questa è una domanda più esplicita con più dettagli e una risposta migliore. Penso che sia utile tenerlo in giro. Sì, l'altro è stato tecnicamente chiesto per primo, ma rimuovere questo renderebbe più difficile per le persone trovare le risposte che stanno cercando.
Jo Sprague,

Risposte:


1301

Non puoi unirti a modifiche locali. Git ti protegge dalla perdita di modifiche potenzialmente importanti.

Hai tre opzioni:

  • Conferma la modifica utilizzando

    git commit -m "My message"
    
  • Stash.

    Lo stashing funge da stack, in cui è possibile inviare le modifiche e le pop in ordine inverso.

    Per riporre, digitare

    git stash
    

    Fai l'unione e poi tira la scorta:

    git stash pop
    
  • Annulla le modifiche locali

    usando git reset --hard
    ogit checkout -t -f remote/branch

    Oppure: Annulla le modifiche locali per un file specifico

    utilizzando git checkout filename


104
Puoi anche annullare le modifiche locali per un file specifico eseguendo: git checkout nomefile
ckb

6
Grazie. Vorrei aggiungere a questo, se lo fai git reset --hardpotresti anche voler eliminare i file non tracciati congit clean -dfx
Jo Sprague,

13
Per impostazione predefinita git stash, non verranno archiviati i file per i quali non esiste alcuna cronologia. Quindi se hai file che non hai ancora aggiunto ma che verrebbero sovrascritti o "creati" dall'unione, allora l'unione si bloccherà comunque. In tale situazione, è possibile utilizzare anche git stash -uper archiviare file non impegnati. Oppure puoi semplicemente cancellarli!
joeytwiddle,

25
correre git clean -dfxera un'idea terribile. Rimossi alcuni file .gitignored di cui avevo realmente bisogno.
ezuk,

5
Ho riscontrato una situazione in cui un utente, dopo averlo fatto git reset --hard, aveva ancora modifiche immerse!
Amedee Van Gasse,

83
git stash
git pull <remote name> <remote branch name> (or) switch branch
git stash apply --index

Il primo comando memorizza temporaneamente le modifiche nello stash e le rimuove dalla directory di lavoro.

Il secondo comando cambia i rami.

Il terzo comando ripristina le modifiche che sono state memorizzate nella scorta (l' --indexopzione è utile per assicurarsi che i file gestiti siano ancora messi in scena).



2
per spiegare il punto di @ vikramvi: possiamo anche usare al git stash popposto di git stash apply. Il primo lo rimuove dalla scorta mentre il secondo lo mantiene ancora lì
Anupam il

27

Puoi provare uno dei seguenti metodi:

rebase

Per modifiche semplici, prova a eseguire nuovamente la reimpostazione su di esso mentre esegui le modifiche, ad es

git pull origin master -r

Quindi applicherà il tuo ramo corrente sopra il ramo a monte dopo il recupero.

Questo è equivalente a: checkout master, fetche rebase origin/mastercomandi git.

Questa è una modalità operativa potenzialmente pericolosa. Riscrive la cronologia, il che non fa ben sperare quando hai già pubblicato quella cronologia. Non utilizzare questa opzione se non hai letto git-rebase(1)attentamente.


check-out

Se non ti interessano le modifiche locali, puoi passare temporaneamente a un'altra filiale (con la forza) e ripristinarla, ad es

git checkout origin/master -f
git checkout master -f

Ripristina

Se non ti interessano le modifiche locali, prova a ripristinarlo su HEAD (stato originale), ad es

git reset HEAD --hard

Se sopra non aiuta, potrebbero essere delle regole nel tuo file di normalizzazione git ( .gitattributes), quindi è meglio impegnare ciò che dice. Oppure il tuo file system non supporta le autorizzazioni, quindi devi disabilitarlo filemodenella tua configurazione di git.

Correlati: Come imposto "git pull" per sovrascrivere i file locali?


1
Non funziona: ricevo ancora lo stesso messaggio come "nascondi prima le modifiche". Quando scrivo "git stash" e poi "git pull" -> "errore: hai modifiche non salvate .. esegui prima una scorta".
Poco

@ trinity420 Potrebbero essere i tuoi permessi sui file, controlla git statusquali modifiche hai dopo lo stash. Se nessuna risposta aiuta, considera l'aggiunta di una nuova domanda.
Kenorb,

grazie ma il mio problema è stato risolto, ho provato di tutto qui, niente ha funzionato, quindi ho fatto clic su "esegui modifiche" "unisci" in PHPStorm e poi ho rimosso le modifiche e ha funzionato ..
trinity420


13

Quindi la situazione in cui mi sono imbattuto era la seguente:

errore: le modifiche locali ai seguenti file verrebbero sovrascritte da merge: wp-content / w3tc-config / master.php Per favore, commetti le modifiche o nascondile prima di poterle unire.

tranne, proprio prima, era remoto: quindi in realtà questo:

remote: errore: le modifiche locali ai seguenti file verrebbero sovrascritte da merge: some / file.ext Per favore, commetti le modifiche o nascondile prima di poterle unire.

Quello che stava succedendo era (penso, non positivo al 100%) che l'hook hook di ricezione git stava iniziando a funzionare e rovinarsi a causa dei cambiamenti di movimento nel repository del server remoto, che in teoria non avrebbe dovuto essere toccato.

Quindi quello che ho finito per rintracciare l'hook post-ricezione e trovarlo, era dover andare al repository remoto sul server e c'era il cambiamento (che non era sul mio repository locale, che, in effetti, ha detto che corrispondeva, nessuna modifica, niente da impegnare, aggiornato, ecc.) Quindi, mentre sul locale, non c'erano cambiamenti, sul server, allora ho fatto un git checkout -- some/file.exte poi i repository locali e remoti effettivamente abbinati e potevo continuare a lavorare e distribuire. Non sono del tutto sicuro di come si sia verificata questa situazione, anche se un paio di dozzine di sviluppatori più le modifiche dell'IT potrebbero averne a che fare.


2
È una domanda o una risposta?
stdcall,

2
@stdcall - Un po 'di entrambi. Quando mi sono imbattuto in questa situazione come descritto nella domanda, questo è quello che dovevo fare per risolverlo. Decisamente non si trattava di una normale soluzione git e, dalla domanda, sembra che potrebbe essere la stessa situazione anomala (ovvero, configurare le modifiche sul server, ma il locale non ha modifiche). Se qualcuno ha più idea del perché (o di come) sia successo, sarei felice di avere un'idea.
Mike,

7

ATTENZIONE: questo eliminerà i file non tracciati, quindi non è un'ottima risposta a questa domanda.

Nel mio caso, non volevo conservare i file, quindi questo ha funzionato per me:

Git 2.11 e successivi:

git clean  -d  -fx .

Git precedente:

git clean  -d  -fx ""

Riferimento: http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

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

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

  • -f è necessario per forzare l'esecuzione.


4

Per tenere traccia dei file appena creati durante la risoluzione di questo problema:

Se sono stati appena creati file , è possibile creare una patch di modifiche locali, estrarre le fusioni remote e applicare la patch locale dopo che l'unione remota è stata completata come definito passo dopo passo:

  1. Metti in scena le tue modifiche locali. (non impegnarti). La gestione temporanea è necessaria per creare patch di nuovi file creati (in quanto non ancora tracciati)

git add .

  1. Crea una patch per tenere traccia

git diff --cached > mypatch.patch

  1. Annulla le modifiche locali ed elimina i nuovi file locali

git reset --hard

  1. Tirare le modifiche

git pull

  1. Applica la tua patch

git apply mypatch.patch

Git unirà le modifiche e creerà file .rej per le modifiche che non vengono unite.

Come suggerito da Anu, se hai problemi con l'applicazione della patch, prova:

git apply --reject --whitespace=fix mypatch.patch Questa risposta git: patch non applica le discussioni in dettaglio su questo problema

Goditi il ​​tuo lavoro continuo sulla tua funzione e, una volta terminato, esegui il commit delle modifiche locali.


Volevo spingere una parte di codice con nuove modifiche, così ho fatto: 1. ho creato una patch dal mio ramo di sviluppo locale 2. ha fatto il reset hardware 3. ha portato le nuove modifiche da master a dev (per evitare conflitti di unione) 4 error: patch failed: yourfile.py:33 error: yourfile.py: patch does not applyha apportato una piccola modifica al mio sviluppatore locale 5. è stato trasferito allo sviluppatore remoto 6. patch applicata indietro -> Errore ottenuto :, ho ancora il mypatch.patch, ma non so perché non viene applicato e ho perso le modifiche !
Anu,

Ho capito, il comando corretto è stato git apply --reject --whitespace=fix mypatch.patch, ho ricevuto le mie modifiche, accidenti !!! [Grazie a] ( stackoverflow.com/a/15375869/6484358 )
Anu,

1
Anu, il comando git apply mypatch.patch è corretto per applicare la patch, questo è quello che uso sempre, potrebbe esserci qualche problema con la patch creata stessa e non perderai mai le modifiche se hai la patch in mano, contiene tutte le modifiche consolidate.
Manpreet,

2

Chiedere il commit prima di tirare

  • git stash
  • git pull origin << branchname >>

Se necessario :

  • git stash si applica

1
Utilizzare git stash quando si desidera registrare lo stato corrente della directory di lavoro e l'indice, ma si desidera tornare a una directory di lavoro pulita. Il comando salva le modifiche locali e ripristina la directory di lavoro in modo che corrisponda al commit HEAD.
Pushpak Sharma,

2

Per me ha git reset --hardfunzionato solo .

Commettere non era un'opzione, poiché non c'era nulla da impegnare.

Lo stashing non era un'opzione perché non c'era nulla da riporre.

Sembra che avrebbe potuto provenire da file esclusi .git/info/excludee aver modificato git update-index --assume-unchanged <file>alcuni file.


0

Nel mio caso, ho eseguito il backup e quindi eliminato il file di cui Git si stava lamentando, impegnato, quindi sono stato finalmente in grado di controllare un altro ramo.

Ho quindi sostituito il file, copiato nuovamente nel contenuto e continuato come se non fosse successo nulla.



0

Ho provato la prima risposta: git stashcon il punteggio più alto ma il messaggio di errore è ancora apparso, e poi ho trovato questo articolo per eseguire il commit delle modifiche invece di nascondere " Commuct Reluctant"

e il messaggio di errore è finalmente scomparso:

1: git add .

2: git commit -m "this is an additional commit"

3: git checkout the-other-file-name

poi ha funzionato. spero che questa risposta aiuti. :)


0

Se stai usando le estensioni di Git dovresti essere in grado di trovare le tue modifiche locali Working directorycome mostrato di seguito:

inserisci qui la descrizione dell'immagine

Se non vedi alcuna modifica, probabilmente è perché sei su un sottomodulo sbagliato. Quindi controlla tutti gli elementi con un'icona sottomarina come mostrato di seguito:

inserisci qui la descrizione dell'immagine

Quando hai trovato alcune modifiche non impegnate:

Seleziona la linea con Working directory, vai alla scheda Diff , fai clic con il pulsante destro del mouse sulle righe con un'icona a forma di matita (o +o -), scegli Ripristina per eseguire prima il commit o il commit o lo stash o qualunque cosa tu voglia fare con esso.


0

Per me questo ha funzionato:

git reset --hard

e poi

git pull origin <*current branch>

dopo di che

git checkout <*branch>


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.