2010-07-01 7 views
36

Jestem nowy dla git, pochodzący ze świata SVN. Do tej pory wydaje się o wiele bardziej przydatny, ale wciąż pracuję nad supłami.Czy muszę dodawać pliki do git za każdym razem, gdy chcę je zatwierdzić?

Obecnie mój workflow jest tak:

dokonać zmiany> git dodać. > git commit> wprowadź komunikat logu

Nie rozumiem, dlaczego wydaje mi się, że muszę dodać wszystkie moje pliki przed zatwierdzeniem. Są już pod kontrolą wersji? Dlaczego git commit mówi mi, że nie ma żadnych zmian dodanych do zatwierdzenia, ale także wskazuje, że mam zmodyfikowane pliki? Jest napisane "Zmieniono, ale nie zaktualizowano:". Co to znaczy??

Przepraszam, jeśli jest to łatwe, czuję, jak mi brakuje jakiegoś nadrzędnego punkt

+2

Świetne pytanie Stwierdziłem również, że jest to bardzo mylące.Nie widać, że nie "dodajesz" do projektu, dodajesz do zatwierdzenia! – Kokodoko

Odpowiedz

34

Pozwala to na oddzielenie zobowiązuje przez edycje. Jeśli chcesz tylko do popełnienia tych plików teraz pod jednym popełnić, a potem te kolejne pliki teraz, pod drugi popełnić, można zrobić:

git add files_under_one_topic 
git commit -m "this is about one thing" 

git add files_left_over_to_commit_about_a_completely_different_topic 
git commit -m "this is about another thing." 
+0

ah tak, to jest to! – Hamy

+3

To idzie furtką nawet ją. Używając 'git add -p' możesz wprowadzić zmiany w pliku, ale nie inne. – Novelocrat

+0

whoa. to naprawdę potężne. Dobrze wiedzieć, że jest to możliwe, najprawdopodobniej stanie się bardzo przydatne kilka razy, kiedy tego potrzebuję! – Hamy

11

Nie jesteś dodawania plików w tym sensie, że jesteś umieszczając je pod kontrolą git, ale dodajesz je do listy zmian. Niektóre inne SCM, takie jak Perforce, również to robią. Jest to przydatne do budowania odrębnych zestawów zmian, które nie są jeszcze gotowe do zatwierdzenia, ale chcesz je zatwierdzić w osobnych blokach.

Możesz popełnić bardziej subwersyjny sposób, po prostu robiąc git commit -a - który pokaże wszystko, co git wie o tym, co zostało zmienione, tak jak robi to svn commit.

(PS. Skoro przybywasz ze świata svn, wspomnę o innej osobie, która rzuciła mnie na chwilę w pętlę - gdy podasz git diff, zobaczysz tylko różnicę między twoim aktualnym stanem a co znajduje się w liście zmian, a nie w różnicy między twoim bieżącym stanem a ostatnim zatwierdzeniem.Jeśli uruchomisz git diff natychmiast po dodaniu wszystkich zmienionych plików (np. git add -u), zobaczysz puste różnice, nawet jeśli istnieją różnice, które zostaną zatwierdzone!)

+0

Ah, dzięki za PS! To zdecydowanie coś, z czym walczyłem! – Hamy

15

Git działa za pomocą obszaru "inscenizacji", w którym przygotowujesz to, co zamierzasz powiązać razem jako zatwierdzenie. Tak więc zdecydowałeś, jaki zestaw zmian chcesz zatwierdzić (np. Cały lub podzbiór), dodajesz je do obszaru przemieszczania, a następnie zatwierdzasz, co znajduje się w obszarze przemieszczania.

Gdy wywołasz "status git", pokazuje to, co zostało dodane do obszaru przemieszczania (np. "Zmiany, które mają zostać zatwierdzone"), co zostało zmienione w gitarze śledzonym przez pliki (np. Zmieniono, ale nie zaktualizowano ")) i wszystkie nowe pliki, których nigdy wcześniej nie dodałeś (np. pliki nietraktowane)

Jeśli chcesz po prostu zatwierdzić zmienione elementy, ale nie uwzględniaj nowo utworzonych plików, możesz użyć git commit -a - m "Komentarz do zmodyfikowanych plików już pod kontrolą kodu źródłowego."

+0

Awesome, thanks! – Hamy

+4

Należy również zauważyć, że zamiast "git add" można użyć "git stage", jeśli pomaga to utrzymać porządek w głowie. –

+0

Ah, fajnie!dzięki – Hamy