2012-10-31 14 views
5

Oczekuję, że git checkout <commit> będzie migać zarówno działające drzewo, jak i indeks do wersji <commit>. Jednak w niektórych przypadkach zachowa aktualne zmiany zarówno w drzewie roboczym, jak i indeksie. Na przykład:Git: git checkout ze zmodyfikowanym drzewem roboczym i indeksem

git branch br1 
git branch br2 
git checkout br1 
<make change M1 to file foo> 
git add foo 
<make change M2 to file foo> 
git checkout br2 

Teraz wszystkie zmiany drzewo/index robocze wykonane w branży br1 są przechowywane w branży br2, jak git status na br2 nie daje czystą wiadomość. Domyślam się, że to dlatego, że głowa br1 i br2 ma oryginalnie tę samą wersję pliku foo, a Git może to automatycznie wykryć.

Pytanie:

  • Kiedy Git zdecydować nie migać drzewo pracy i indeks? Czy są jakieś inne narożne przypadki?
+1

To nie jest przypadek narożny, chodzi o to, że przed podjęciem decyzji możesz zdecydować, czy chcesz podjąć zobowiązanie w nowym oddziale. Dopóki zmiana z jednej gałęzi na drugą nie zastąpi żadnych zmodyfikowanych plików/spowoduje problemy z git indeksu po prostu przejdzie do gałęzi. –

+0

@ X-Istence Ale jak git decyduje ** nie spowoduje problemów **? – Cyker

Odpowiedz

5

Komenda git checkout ma faktycznie dwa różne (wspólne) tryby pracy.

  1. Jeśli prowadzisz git checkout <branch>, wtedy przełączyć się rozgałęziać <branch>. Wszystkie zmiany w drzewie roboczym będą zachowane - a to działa, łącząc niezatwierdzone zmiany z gałęzią docelową, aby mogło zawieść. Zmiany w indeksie zostaną ukryte.

  2. Jeśli uruchomisz git checkout <path>, git usunie zmiany do <path> zarówno w indeksie, jak i kopii roboczej, pobierając je z bieżącego zatwierdzenia.

Więc celem git checkout <branch> jest w przypadku, gdy zdecyduje, że zmiany Robisz faktycznie należą na innym oddziale.

Powiązane problemy