2012-10-10 5 views
6

Próbowałem następujące polecenia w powłocegit checkout automatycznie łączy lokalne modyfikacje

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 teraz zawiera:

test1 
test2 

Po kasie oddziału test wszystkie lokalne modyfikacje od master się połączyły.

Dlaczego?

Spodziewałem się, że git odmówi zapłaty do test z powodu lokalnych zmian. Spodziewałem się, że git prosi o zatwierdzenie lub zmiany lokalne.

Edytuj: Użyłem skryptu basha do wykonania tych poleceń. Ja się następujące dane wyjściowe:

[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

Mam ten sam problem, dziwne jest to, że w przypadku niektórych repozytoriów nie mogę się wymeldować bez zobowiązania, inne się łączą. Sprawdziłem konfigurację i nie widzę żadnej różnicy. – jdborg

Odpowiedz

14

usilnie stara się nie stracić możliwie cennych danych. W tym przypadku nie jest to faktycznie łączenie oddziałów, ponieważ dane zmiany nie zostały zatwierdzone. Zamiast tego, gdy robisz numer git checkout, próbuje on zachować nowo wykonane, ale nie zatwierdzone, modyfikacje, więc sprawdza żądanie, o które prosisz, i dodaje niezatwierdzone zmiany. Jeśli naprawdę chcesz odrzucić niezatwierdzone zmiany, użyj git checkout -f lub git checkout, a następnie git reset --hard HEAD. Czasami, jeśli zmiany, które nie zostały jeszcze zatwierdzone, nie mogą zostać połączone z czystymi danymi, otrzymasz komunikat o błędzie, a zamówienie się nie powiedzie.

+1

Nie chcę niczego odrzucać. Ale nie sądzę, aby niezamierzone zmiany zostały automatycznie połączone. Jeśli popełnię coś w 'teście', następnie wprowadzę pewne niezamierzone zmiany i spróbuję ponownie się włączyć, git mówi, że nie może, ponieważ w rzeczywistości są niezamówione zmiany. Ale dlaczego git tego nie robi, jeśli nie ma żadnych zatwierdzeń w tej nowej gałęzi? Ponieważ gałąź 'master' i' test' mają to samo 'HEAD'? – Razer

+0

Jeśli popełniłeś coś w 'teście', to są zatwierdzenia w tym nowym oddziale, więc domyślam się, że nie podążam za twoim pytaniem ... Jeśli, wykonując powyższy przykład, popełniłeś zmianę' test2' na twoim ' gałąź testowa, a następnie wprowadzono więcej modyfikacji do 'testu.txt' i próbował wrócić do 'master' bez uprzedniego popełnienia, jest całkiem prawdopodobne, że niezatwierdzone zmiany nie mogą być czysto skopiowane, więc' checkout' zawiedzie, dopóki nie odrzucisz zmian lub nie użyjesz 'git stash'. – twalberg

+0

Dezorientacja polega na tym, że OP uważa, że ​​posiadanie linii test2 w pliku, gdy przejdzie do przetestowania gałęzi oznacza, że ​​są scalone. To nie jest poprawne: te zmiany nie są scalane z gałęzią testową, ale raczej zachowywane w katalogu roboczym. spróbuj zrobić git diff i status git w obu gałęziach, a zobaczysz, o czym mówię. –

0

Czy stosować dowolną opcję z poleceniem git checkout? Pytam, ponieważ zachowanie, które opisujesz, wydaje się podobne, gdy używasz "git checkout -f".

+0

Nie, skopiowałem te polecenia ze skryptu bash do testowania. – Razer

0

git checkoutZastępuje lokalnie zmienione pliki.

git mergełączy lokalnych & nadchodzące zmiany, alarmując do jakichkolwiek konfliktów.

Nie, jeśli te polecenia usuwają pliki lokalne, które nie istnieją w przychodzącym zatwierdzeniu.

Tylko git reset --hard spowoduje całkowite wymazanie lokalnych zmian.

+0

Wiem o tym. Ale dlaczego 'git checkout' scala lokalne zmiany z gałęzi' master' w gałąź 'test', chociaż nic nie popełniłem? – Razer

+0

Co to znaczy "łączy lokalne zmiany z mistrzem"? W rzeczywistości nie wykonuje "scalania". – Mars