Dlaczego git ciągle pokazuje moje zmiany, kiedy przełączam gałęzie (zmodyfikowane, dodane, usunięte pliki), bez względu na to, czy uruchomię git add, czy nie?

115

Jestem naprawdę nowy w git i próbowałem zrozumieć, dlaczego git ciągle pokazuje wszystko, co zmieniłem w jednej gałęzi w innej, kiedy uruchamiam git checkout, aby przełączać się między gałęziami. Najpierw próbowałem nie używać git add i nie działało. Jednak próbowałem wtedy użyć git add, ale nie rozwiązałem problemu. Nie używam jeszcze git commit.

Oto co robię:

$ git clone <a_repository>  
$ git branch  
* master  
$ git branch testing  
$ git checkout testing  
...edit a file, add a new one, delete...  
$ git status  
    # On branch testing  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  
$ git branch  
  master  
* testing  
$ git checkout master  
D       file1.txt  
Switched to branch 'master'  
$ git status  
    # On branch master  
    # Changed but not updated:  
    #   (use "git add/rm <file>..." to update what will be committed)  
    #   (use "git checkout -- <file>..." to discard changes in working directory)  
    #  
    #       deleted:    file1.txt  
    #  
    # Untracked files:  
    #   (use "git add <file>..." to include in what will be committed)  
    #  
    #       file2.txt  
no changes added to commit (use "git add" and/or "git commit -a")  

Pomyślałem, że podczas korzystania z gałęzi, cokolwiek robisz w jednej gałęzi, jest to niewidoczne dla wszystkich innych gałęzi. Czy to nie jest powód tworzenia oddziałów?

Próbowałem użyć "git add", ale zmiany są widoczne w obu gałęziach. Czy muszę uruchomić „git commit” przed przełączeniem się między gałęziami, aby tego uniknąć?

JPZ
źródło

Odpowiedzi:

142

Zmiana oddziałów pociąga za sobą niezatwierdzone zmiany. Zatwierdź najpierw, uruchom, git checkout .aby je cofnąć lub uruchom git stashprzed przełączeniem. (Możesz odzyskać swoje zmiany za pomocą git stash apply)

Sean Clark Hess
źródło
10
git stash pop jest lepszy, chyba że chcesz zgromadzić ogromny stos skrytek.
siride
7
@JPZ: git stash zajmuje się tylko śledzonymi plikami; nowe pliki nie są śledzone, więc nie zostaną ukryte.
siride
2
@JPZ: Jeśli chcesz ukryć niezatwierdzone pliki, musisz git addje zrobić przed przechowywaniem. To powiedziawszy, nie jestem pewien, czy naprawdę chcesz się tutaj ukryć - jeśli zamierzasz, aby te zmiany były częścią gałęzi, z której odchodzisz, zatwierdź je. (Jeśli zamierzasz wrócić do tej gałęzi i popracować nad zmianami przed ich stashzatwierdzeniem , może to być odpowiednie narzędzie do tego zadania.)
Cascabel
16
„Zmiana gałęzi pociąga za sobą niezatwierdzone zmiany” - to ma sens i być może najgorszy pomysł na projekt. Jaki jest sens posiadania oddziałów, jeśli nie możesz pracować w izolacji? !!!
nehem
1
W moim przypadku mam jedną gałąź funkcji z gałęzi deweloperskiej. Zaakceptowałem w gałęzi funkcji, ale pokazuje ona również zmiany, gdy sprawdzam gałąź deweloperską.
Hitesh Garg
31

Krótka odpowiedź: tak, musisz się zaangażować. Upewnij się jednak, że robisz to na właściwej gałęzi!

Gałąź jest wskaźnikiem do zatwierdzenia. Kiedy zatwierdzasz z wypisaną gałęzią, gałąź przechodzi do przodu, aby wskazać nowe zatwierdzenie. Kiedy sprawdzasz gałąź, sprawdzasz zatwierdzenie, na które wskazuje. (Możesz myśleć o zatwierdzeniach jako o migawkach twojego drzewa roboczego.)

Tak więc, jeśli masz zmiany, których nie zatwierdziłeś, zmiana oddziałów nie wpłynie na nie. Oczywiście, jeśli przełączanie oddziałów jest niezgodne z twoimi zmianami, git checkoutpo prostu odmówi.

git addjest poleceniem do przemieszczania zmian, które następnie zatwierdzasz. Nie rejestruje tych zmian w historii repozytorium. Po prostu umieszcza je w strefie przejściowej (indeksie); git commitnastępnie używa zawartości tego obszaru przemieszczania do tworzenia zatwierdzeń.

Cascabel
źródło