2012-10-10 20 views
6

Cercai seguenti comandi sul gusciocassa git unisce automaticamente modifiche locali

git init 

echo "test1" > test1.txt 
git add test1.txt 
git commit -a -m "test1" 

echo "test2" >> test1.txt 

git branch test 
git checkout test 

text.txt ora contiene:

test1 
test2 

Dopo cassa diramare test tutte le modifiche locali da master ottenere fuse.

Perché?

Mi aspettavo che git rifiuti il ​​checkout a test a causa delle modifiche locali. Mi aspettavo che git chiedesse un commit o stash le modifiche locali.

Modifica: Ho usato uno script di bash per eseguire questi comandi. Ottengo l'output seguente:

[email protected]:/tmp/test$ ./createrepo 
Initialized empty Git repository in /tmp/test/.git/ 
[master (root-commit) 0407f5b] test1 
1 file changed, 1 insertion(+) 
create mode 100644 test1.txt 
M  test1.txt 
Switched to branch 'test' 
+0

Ho lo stesso problema, la cosa strana è che, per alcuni repository, non posso effettuare il checkout senza commetterlo, altri si fondono. Ho guardato nella configurazione e non vedo alcuna differenza. – jdborg

risposta

14

git prova a non perdere dati potenzialmente preziosi. In questo caso, in realtà non si uniscono rami, poiché le modifiche in questione non sono state commesse. Piuttosto, quando esegui lo git checkout, tenta di conservare le modifiche appena apportate ma non ancora impegnate, quindi controlla il commit che stai richiedendo e aggiunge le modifiche non salvate. Se si desidera veramente eliminare le modifiche senza commit, utilizzare git checkout -f o git checkout seguito da git reset --hard HEAD. A volte, se le modifiche non ancora eseguite non possono essere unite in quello che stai verificando in modo pulito, riceverai un messaggio di errore e il checkout fallirà.

+1

Non voglio scartare nulla. Ma non voglio che le modifiche non modificate vengano unite automaticamente. Se commetto qualcosa in 'test', quindi apporto alcune modifiche non modificate e provo a cambiare di nuovo, git dice che non è possibile perché in realtà ci sono cambiamenti non modificati. Ma perché git non lo fa se non ci sono commit in questo nuovo ramo? Perché il ramo 'master' e' test' hanno lo stesso 'HEAD'? – Razer

+0

Se hai commesso qualcosa in 'test', allora ci sono commit su questo nuovo ramo, quindi suppongo che non sto seguendo la tua domanda ... Se, seguendo l'esempio sopra, hai commesso il cambio' test2' sul tuo ' test' branch, quindi apportato ulteriori modifiche a 'test.txt' e ho provato a tornare a 'master' senza prima eseguire commit, è molto probabile che le modifiche non salvate non possano essere copiate in modo pulito, quindi' checkout' fallirà fino a quando non scarti le modifiche o usi 'git stash'. – twalberg

+0

La confusione qui è nel fatto che OP pensa che avere la riga test2 nel file quando si ritira per testare il ramo significa che sono uniti. Questo non è corretto: quelle modifiche non sono unite nel ramo di test, ma piuttosto conservate nella directory di lavoro. prova a fare git diff e git status in entrambi i rami e vedrai di cosa sto parlando. –

0

Avete usato qualche opzione con il comando git checkout? Chiedo perché il comportamento che stai descrivendo sembra quando viene usato "git checkout -f".

+0

No, ho copiato questi comandi da uno script bash per il test. – Razer

0

git checkoutsostituisce file modificati localmente.

git mergeunisce locale & modifiche in entrata, avvisando di eventuali conflitti.

Né se questi comandi rimuoveranno file locali che non esistono nel commit in entrata.

Solo git reset --hard cancellerà completamente le modifiche locali.

+0

Lo so. Ma perché 'git checkout' unisce le modifiche locali dal ramo' master' al ramo 'test' anche se non ho commesso nulla? – Razer

+0

Cosa intendi con "unisce le modifiche locali dal master"? In realtà non sta eseguendo un 'unione'. – Mars

Problemi correlati