Errore durante il passaggio al ramo principale: le mie modifiche locali verrebbero sovrascritte dal checkout


128

Questa domanda è simile a questa , ma più specifica.

Ho un progetto con due rami ( staginge beta).

Sviluppo staginge utilizzo il masterramo per correggere i bug. Quindi, se sto lavorando allo staging e vedo un errore, cambio in masterbranch:

git checkout master

e fai le cose:

git add fileToAdd
git commit -m "bug fixed"

e poi mi unisco con entrambi i rami:

git checkout staging
git merge master
git checkout beta
git merge beta

E non importa se ci sono altri file sull'albero di lavoro.

Ma ora, quando provo a passare al masterramo, ricevo un errore :

error: Your local changes to the following files would be overwritten by checkout:
src/Pro/ConvocationBundle/Controller/DefaultController.php
Please, commit your changes or stash them before you can switch branches.
Aborting

Ho pensato di dover rimuovere il file dall'area di staging:

git reset HEAD src/Pro/ConvocationBundle/Controller/DefaultController.php

ma ricevo lo stesso errore. Se git statuslo ottengoNo changes to commit


4
Hai provato reset --hard? Se sei davvero sicuro di voler annullare le modifiche. Oppure usa la scorta se non lo fai.
keltar

@keltar - No. Non voglio annullare le mie modifiche. Tienili sull'albero funzionante per un successivo impegno
Manolo

1
Non penso che tu possa cambiare ramo mantenendo le modifiche non impegnate, ma potrei facilmente sbagliarmi, non proprio nel mio campo. Prova git add your-filee impegnati.
keltar

@keltar - Ho già lavorato in questo modo. Al momento non voglio apportare modifiche staging.
Manolo

Forse il tuo file in conflitto non è stato modificato quando lo hai provato prima. Hai delle modifiche, devi salvarle da qualche parte per ripristinarle in seguito. È molto improbabile che sia possibile senza commit. Ma se davvero non vuoi - usa la scorta, è esattamente il motivo per cui esiste.
keltar

Risposte:


128

Il tuo errore appare quando hai modificato un file e il ramo a cui stai passando ha modifiche anche per questo file (dall'ultimo punto di unione).

Le tue opzioni, per come la vedo io, sono: commit, e quindi modifica questo commit con modifiche extra (puoi modificare i commit in git, purché non siano modificati push); oppure - usa stash:

git stash save your-file-name
git checkout master
# do whatever you had to do with master
git checkout staging
git stash pop

git stash savecreerà uno stash che contiene le tue modifiche, ma non è associato a nessun commit o anche branch. git stash popapplicherà l'ultima voce di stash al tuo ramo attuale, ripristinando le modifiche salvate e rimuovendola dallo stash.


3
Grazie. Sei sicuro che questo non apporterà modifiche al mio albero di lavoro (non file aggiunti)? Non voglio perdere i miei cambiamenti: - /
Manolo

Oops, digitato male addquando è effettivamente save.. aggiornato. Intendi per altri file? git stash savesenza il parametro del nome del file salverà tutti i file modificati, se lo desideri (e li ripristinerà allo stato più recente). E avere una copia extra dell'albero delle directory non fa mai male, ma sono sempre paranoico al riguardo.
keltar

La cosa sarebbe salvare tutti i file modificati tranne quello che voglio aggiungere al masterramo. Inoltre, un'opzione sarebbe pople modifiche su un altro ramo?
Manolo

Non sono sicuro di cosa intendi. Sì, puoi applicare lo stash su un altro ramo, ma sostituirà semplicemente il contenuto dei file, non li unirà.
keltar

1
@ Miele non ha nulla a che fare con i rami, il problema sono le modifiche non impegnate. Checkout, per definizione, deve ripristinare i tuoi file allo stato di master, ma così facendo perderà il contenuto corrente e poiché questi contenuti non vengono salvati sarebbe impossibile tornare a questo stato in seguito, quindi un errore quindi tu non sarebbe arrabbiato per modifiche perse in seguito.
keltar

151

Ho riscontrato lo stesso problema e l'ho risolto

git checkout -f branch

e la sua specificazione è piuttosto chiara.

-f, --force

Quando si cambia ramo, procedere anche se l'indice o l'albero di lavoro è diverso da HEAD. Viene utilizzato per eliminare le modifiche locali.

Quando si estraggono i percorsi dall'indice, non fallire sulle voci non unite; invece, le voci non unite vengono ignorate.


7
Quando il mio git si è inceppato (nessuna modifica locale ma ancora quell'errore), questa soluzione mi ha aiutato!
Lukyer

6
Grazie, hai salvato il mio schermo dall'ottenere un pugno attraverso di esso.
Gufo

3
Ho perso le mie modifiche in quel modo
Jacek Dziurdzikowski

1
Sì, perderai le modifiche in questo modo, questo dovrebbe comportare un grande avvertimento.
Alexander Mills

Lo voglio al contrario. master è dietro il mio ramo e sono aggiornato con master ma non è ancora in grado di cambiare ramo. Deve essere un bug di Git.
jgmjgm

12

Puoi forzare il checkout del tuo ramo, se non desideri eseguire il commit delle modifiche locali.

git checkout -f branch_name

1
Non sudoè necessario, interromperà solo i permessi del file. È lo stesso comando git pubblicato da @kiki_yu un anno prima, ma è anche peggio.
kenorb

2
Ho perso le mie modifiche in quel modo
Jacek Dziurdzikowski

2
@ JacekDziurdzikowski Quindi hai perso le tue modifiche due volte (vedi il commento sulla risposta di kiki_yu), sia applicando soluzioni che menzionavano in modo molto esplicito che scartare le modifiche locali era lo scopo stesso . Il mio rilevatore di sarcasmo è rotto o ... dici sul serio?
RomainValeri

@RomainValeri Hmm, immagino che fosse il mio modo di avvertire gli altri che sono principianti con git (devono essere principianti se leggono questo post) per essere pronti a dire addio a qualsiasi modifica apportata. Ho pensato che il tempo in cui le modifiche apportate in un ramo dovrebbero rimanere su quel ramo fino a quando non lo avrò di nuovo verificato. Suggerimento per i nuovi arrivati ​​che la pensano in questo modo: usa git stash :)
Jacek Dziurdzikowski

Risposta duplicata, senza motivo. La prima risposta ha ancora più informazioni.
MAChitgarha

9

Ho riscontrato lo stesso problema e l'ho risolto

git checkout -f branch

Bene, stai attento con l' -finterruttore. Se utilizzi l'opzione, perderai tutte le modifiche non salvate -f. Sebbene possano esserci alcuni casi d'uso in cui è utile utilizzare -f, nella maggior parte dei casi potresti voler stashapportare le modifiche e poi i switchrami. La stashingprocedura è spiegata sopra.


0

Puoi eseguire il commit nel ramo corrente, effettuare il checkout in un altro ramo e infine selezionare il commit (al posto di merge).


Può essere più utile se fornisci più spiegazioni su questo.
MAChitgarha

-1

Se ottieni questo quando provi a controllare un ramo diverso:

my-mac:myGHProject ~$ git checkout other-branch
error: Your local changes to the following files would be overwritten by checkout:
    src/main/resources/reference.conf

Ciò significa che hai alcune modifiche che devi eseguire il commit sul ramo che hai estratto o che devi cancellarle o nasconderle come la maggior parte dei punti precedenti. 19 volte su 20 è molto più probabile che effettui solo le mie modifiche.

my-mac:myGHProject ~$ git branch
  * my-local-branch
  * develop    

my-mac:myGHProject ~$ git status
On branch my-local-branch
   Changes not staged for commit:
   (use "git add <file>..." to update what will be committed)
   (use "git checkout -- <file>..." to discard changes in working directory)
 modified:   src/main/resources/reference.conf

my-mac:myGHProject ~$ git add src/main/resources/reference.conf

my-mac:myGHProject ~$ git commit -m "updates on some config"
  [my-local-branch] updates on some config
  1 file changed, 131 insertions(+), 85 deletions(-)

Ora che lo hai fatto, puoi controllare l'altro ramo e passare avanti e indietro abbastanza facilmente.

my-mac:myGHProject ~$ git checkout other-branch

my-mac:myGHProject ~$ git status
  On branch other-branch

my-mac:myGHProject ~$ git checkout my-local-branch
  Switched to branch 'my-local-branch'

Assicurati solo di essere entrambi sul ramo giusto e di spingere al ramo giusto quando esegui il comando git push origin $ {branch}. Nota: se il tuo progetto è agganciato direttamente a Intellij, puoi vedere che hai cambiato il ramo nell'angolo in basso a destra della finestra principale.

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.