Dlaczego polecenie „git commit” nie zapisuje moich zmian?

251

Zrobiłem coś git commit -m "message"takiego:

> git commit -m "save arezzo files"
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Ale potem, kiedy to robię git status, pokazuje te same zmodyfikowane pliki:

> git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   arezzo.txt
#       modified:   arezzo.jsp
#
no changes added to commit (use "git add" and/or "git commit -a")

Co ja robię źle?

arezzo
źródło
16
Służy git commit -am "save arezzo files"do automatycznego dodawania wszystkich zmian (wrt .gitignore). Możesz dodać tylko określone pliki / katalogi:git add file.src
mbx

Odpowiedzi:

400

Jak głosi komunikat:

nie dodano żadnych zmian do zatwierdzenia (użyj „git add” i / lub „git commit -a”)

Git ma „obszar przejściowy”, w którym pliki muszą zostać dodane przed zatwierdzeniem, możesz przeczytać wyjaśnienie tego tutaj .


W twoim konkretnym przykładzie możesz użyć:

git commit -am "save arezzo files"

(zwróć uwagę na dodatkowe aw flagach, można również zapisać jako git commit -a -m "message"- oba robią to samo)

Alternatywnie, jeśli chcesz być bardziej selektywny w kwestii tego, co dodajesz do zatwierdzenia, użyj polecenia git add, aby dodać odpowiednie pliki do obszaru przejściowego, a status git, aby wyświetlić podgląd tego, co ma zostać dodane (pamiętając, aby zwrócić uwagę na użyte sformułowanie).

Możesz również znaleźć ogólną dokumentację i samouczki dotyczące korzystania z git na stronie dokumentacji git, która poda więcej szczegółów na temat koncepcji przemieszczania / dodawania plików.


Kolejną ważną rzeczą, o której warto wiedzieć, jest interaktywne przemieszczanie - pozwala to dodawać części pliku do obszaru przemieszczania, więc jeśli wprowadziłeś trzy różne zmiany kodu (dla pokrewnych, ale różnych funkcji), możesz użyć trybu interaktywnego, aby podzielić zmienia i dodaje / zatwierdza każdą część po kolei. Pomocne mogą być takie mniejsze określone zatwierdzenia.

Peter Boughton
źródło
@PeterBoughton miałeś na myśli „dodawanie interaktywne” zamiast „dodawanie interaktywne”?
djb,
3
Nie, miałem na myśli interaktywne dodawanie.
Peter Boughton,
2
Lokalne repozytorium jest rodzajem obszaru przejściowego przed wypchnięciem kodu do zdalnego repozytorium. Po co dodawać kolejną „warstwę” przed zatwierdzeniem zmian, czy nie jest to trochę skomplikowane? Jestem nowy w Git, ale wyobrażam sobie, że 99,99% programistów zawsze używa commit -am, ponieważ i tak zmiany nie wychodzą poza ich lokalne środowisko.
PawelRoman
2
Myślę, że właśnie na to wpadłem, bo jestem przyzwyczajony do tego, że IDE się tym zajmuje. Nie jestem pewien, dlaczego jest to konieczny krok, ale z drugiej strony jest wiele rzeczy o git, których nie rozumiem ... Mam na myśli git ...
trpt4him
49

Nie dodałeś zmian. Dodaj je specjalnie

git add filename1 filename2

lub dodaj wszystkie zmiany (ze ścieżki katalogu głównego projektu)

git add .

lub użyj skrótu -apodczas zatwierdzania:

git commit -a -m "message".
Femaref
źródło
Ponadto zdecydowanie zachęcam użytkowników do korzystania z interaktywnego dodawania. Zwłaszcza, gdy próbujesz zrobić ładne małe zatwierdzenia, które można łatwo odwrócić.
jer
40

Powinieneś zrobić:

git commit . -m "save arezzo files"
Baptiste Pernet
źródło
4
To wydaje się być poprawną odpowiedzią na pytanie PO. Nie chciał „dodawać”, chciał zatwierdzić to, co zostało zmodyfikowane.
VectorVortec,
8

Skopiowałem mały podprojekt, który miałem pod kontrolą źródła Gita, do innego projektu i zapomniałem usunąć folder .git. Kiedy poszedłem zatwierdzić, dostałem ten sam komunikat jak powyżej i nie mogłem go wyczyścić, dopóki nie usunąłem .gitfolderu.

Jest to trochę głupie, ale warto sprawdzić, czy nie masz folderu .git w folderze, który się nie zatwierdza.

Simon Hutchison
źródło
7

Mogłeś zrobić:

git add -u -n

Aby sprawdzić, które pliki zmodyfikowałeś i które zostaną dodane (suchobieg: opcja -n), a następnie

git add -u

Aby dodać tylko zmodyfikowane pliki

Albert Vonpupp
źródło
4

Uważam ten problem pojawiający się podczas Zrobiłem git add .w podkatalogu poniżej gdzie moje .gitignoreżycie plików (katalog domowy z mojego repozytorium, że tak powiem). Spróbuj zmienić katalogi na najwyższy katalog, a git add .następnie uruchom git commit -m "my commit message".

jam99
źródło
4

Może to oczywista rzecz, ale ...

Jeśli masz problem z indeksem, użyj git-gui . Bardzo dobrze widzisz, jak faktycznie działa indeks (obszar pomostowy).

Innym źródłem informacji, które pomogły mi zrozumieć indeks, był Scott Chacons „Getting Git” strona 259 i dalej.

Zacząłem od wiersza poleceń, ponieważ większość dokumentacji pokazuje tylko, że ...

Myślę, że git-gui i gitk sprawiają, że pracuję szybciej, i pozbyłem się złych nawyków, takich jak na przykład „git pull”… Teraz zawsze ściągam najpierw… Zobacz, jakie naprawdę są nowe zmiany, zanim się połączę.

Jaskółka oknówka
źródło
3

Dzieje się tak dlatego, że masz folder, który jest już śledzony przez Git, w innym folderze, który jest również śledzony przez Git. Na przykład miałem projekt i dodałem do niego podfolder. Oba były śledzone przez Gita, zanim umieściłem jeden w drugim. Aby zatrzymać śledzenie tego w środku, znajdź go i usuń plik Git za pomocą:

rm -rf .git

W moim przypadku miałem aplikację WordPress, a folder, który dodałem, był motywem. Musiałem więc przejść do katalogu głównego motywu i usunąć plik Git, aby cały projekt był teraz śledzony przez rodzica, aplikację WordPress.

drjorgepolanco
źródło
1

jeśli masz więcej plików w moim przypadku, mam 7000 plików graficznych, kiedy próbuję dodać je z folderu trasy projektu, nie dodał ich, ale kiedy idę do folderu obrazów, wszystko jest w porządku. Przejdź do folderu docelowego i wykonaj polecenia jak w okach

git add .
git commit -am "image uploading"
git push origin master

git push origin master Wyliczanie obiektów: 6574, gotowe. Liczenie obiektów: 100% (6574/6574), gotowe. Kompresja delta z użyciem maksymalnie 4 wątków Kompresowanie obiektów: 100% (6347/6347), gotowe. Pisanie przedmiotów: 28% (1850/6569), 142,17 MiB | 414,00 KiB / s


źródło
0

Miałem problem, w którym działałem commit --amendnawet po wydaniu git add .i nadal nie działało. Okazało się, że wprowadziłem kilka .vimrcdostosowań, a mój edytor nie działał poprawnie. Naprawienie tych błędów, tak aby vimzwracał prawidłowy kod, rozwiązało problem.

Brennan Cheung
źródło
0

Miałem bardzo podobny problem z tym samym komunikatem o błędzie. „Zmiany nie są wystawiane dla zatwierdzenia”, ale kiedy robię diff, widać różnice. W końcu zorientowałem się, że jakiś czas temu zmieniłem skrzynkę katalogów. dawny. „PostgeSQL” na „postgresql”. Jak teraz pamiętam, git czasami zostawia plik lub dwa w starym katalogu sprawy. Następnie przekażesz nową wersję do nowej skrzynki.

Dlatego git nie wie, na którym polegać. Aby to rozwiązać, musiałem wejść na stronę github. Następnie możesz wyświetlić oba przypadki. Musisz usunąć wszystkie pliki z niepoprawnego katalogu ze skrzynkami. Upewnij się, że masz poprawną wersję zapisaną lub w odpowiednim katalogu z kopertami.

Po usunięciu wszystkich plików ze starego katalogu spraw cały katalog zniknie. Następnie wykonaj zatwierdzenie.

W tym momencie powinieneś być w stanie wykonać Pull na swoim komputerze lokalnym i nie widzieć już konfliktów. W ten sposób móc ponownie popełnić. :)

brianwaganer
źródło
0

jeśli masz podfolder, który został sklonowany z innego repozytorium git, najpierw musisz usunąć plik $ .git $ z repozytorium podrzędnego: rm -rf .git następnie możesz przejść do folderu nadrzędnego i użyć go git add -A.

Sam Toorchi
źródło