Forza git stash a sovrascrivere i file aggiunti


223

Ho alcuni file che non sono stati tracciati in git. Ho apportato alcune modifiche e volevo impegnarle, ma ho capito che avevo dimenticato di controllare prima i file non modificati. Quindi ho nascosto i file, quindi ho aggiunto le versioni non modificate.

Quindi, quando applico lo stash al repository, ottengo conflitti dovuti al fatto che i file sono già stati aggiunti.

Come posso applicare lo stash e imporre che le versioni nello stash vengano utilizzate preferibilmente agli originali nel repository?

Grazie


7
Brutta soluzione fino a quando qualcuno non ne esce con una migliore: rimuovere i nuovi file usando git rmprima di farlo git stash apply.
Tom,

Non perderà la storia? Il motivo per l'aggiunta delle versioni non modificate è stato quello di mantenere la cronologia.
Stefan,

1
No, non perderà la storia. Se rimuovi un file, aggiungilo di nuovo con una piccola modifica e quindi esegui il commit, gitlo tratterà come una piccola modifica.
Tom,

Risposte:


365

Usa git checkoutinvece di git stash apply:

$ git checkout stash -- .
$ git commit

Ciò ripristinerà tutti i file nella directory corrente alla loro versione stash.


Se ci sono modifiche ad altri file nella directory di lavoro che dovrebbero essere mantenute, ecco un'alternativa meno pesante:

$ git merge --squash --strategy-option=theirs stash

Se ci sono cambiamenti nell'indice, o l'unione toccherà i file con le modifiche locali, git rifiuterà di unire. È possibile estrarre singoli file dallo stash utilizzando

$ git checkout stash -- <paths...>

o interattivamente con

$ git checkout -p stash

Nessuno di questi ha funzionato nel mio caso d'uso. I risultati e la mia soluzione sono qui stackoverflow.com/a/26685296/496046 - anche questo dovrebbe risolvere la tua situazione, @AlexanderBird
tremby

2
git checkout stash -- .Questo comando non ha letteralmente fatto nulla quando l'ho eseguito.
Rotsiser Mho,

3
@RotsiserMho Git non è molto bravo a fornire messaggi di conferma. Sei sicuro che non abbia fatto nulla? Ha funzionato bene per me.
Sinjai,

5
Ho dovuto correre git checkout stash -- .nella cartella principale più alta che conteneva le mie modifiche, altrimenti ha applicato solo le modifiche alla cartella da cui ho eseguito il comando.
Leo,

1
@Leo: Esatto, è perché .specifica la directory corrente (è possibile sostituirla con un percorso diverso invece di cambiare directory). Ho aggiornato la mia risposta per renderlo più chiaro.
tom

13

git stash show -p | git apply

e quindi git stash dropse si desidera eliminare gli oggetti nascosti.


2
Nota: dovresti trovarti nella radice del repository affinché funzioni correttamente, altrimenti otterrai questo .
Ruslan,

@PengheGeng Come puoi vedere, ho risposto circa un anno prima di NetEmmanuel
Hasan TBT

@Ruslan Lo sto ottenendo mentre nella radice del mio repository 🤔
Leo

6

Per forzare git stash popeseguire questo comando

git stash show -p | git apply && git stash drop

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

Versione lunga:

Questo errore viene visualizzato a causa delle modifiche non impegnate che si desidera sovrascrivere. Annulla queste modifiche con git checkout HEAD. È possibile annullare le modifiche a un file specifico con git checkout HEAD path/to/file. Dopo aver rimosso la causa del conflitto, puoi fare domanda come al solito.

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.