2014-07-19 14 views
8

Podczas pracy nad innym plikiem edytowałem README.md, a następnie uruchomiłem git add README.md. Podczas wykonywania zatwierdzenia git widzę, że README.md jest zarówno w "Zmiany do zatwierdzenia" i "Zmiany nie są wystawiane na zatwierdzenie".Czy plik może być zarówno wystawiony, jak i niezaszyfrowany w Git?

Czy to ma sens? Gdzie w .git mogę sprawdzić autorytatywny stan tego pliku?

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: README.md 
#  modified: utils/arrterm 
# 
# 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: README.md 
+1

można myśleć o tym w ten sposób: po zmianie 10 linii. Za pomocą 'git add -p' dodajesz tylko pierwszych 5 zmian. Teraz twój plik jest również wystawiony i nie wystawiony. – RedX

Odpowiedz

10

Oznacza to, że część wprowadzonych zmian jest wystawiana na zatwierdzenie, a część nie.

Można sprawdzić co jest wystawiane po uruchomieniu

git diff --staged -- README.md 

i sprawdzić, co jest Unstaged uruchamiając

git diff -- README.md 

większość systemów kontroli wersji zwykle tylko zapisać zmiany pomiędzy dwoma stanami. Sposób działania git, gdy wprowadzasz wiele zmian do pliku, będziesz musiał dodać/oznaczyć każdą z nich jako część jednego zestawu zmian a.k.a a commit. Podczas korzystania z git add odbywa się to automatycznie.

Jednak nie jest to jedyny sposób, w jaki można dodać wszystkie indywidualne zmiany (porcje) do "indeksu". Można na przykład wprowadzić wiele zmian w tym samym pliku i zatwierdzić je w różnych zatwierdzeniach lub dodać tylko określone zmiany do zatwierdzenia. Na przykład. aby jawnie dodać pewne zmiany do twojego "indeksu", ale nie do innych, możesz to zrobić, używając git add -p, aby dodać tylko "porcje" (grupy) zmian zamiast całej listy samych zmian.

Co działo się tutaj to, że zmiany dokonane na README.mdprzed inscenizacji (git add) pokaże w inscenizacji i wszelkie zmiany dokonane po inscenizacji README.md pokaże jak Unstaged jak masz powyżej.

+1

Ważne jest, aby wiedzieć, że git stage i zatwierdza linie treści, a nie pliki. Może to być bardzo przydatne, np. Do zatwierdzenia niektórych zmian w pliku, pozostawiając pozostałe do przyszłego zatwierdzenia. Ponadto git gui ułatwi dostrzeżenie i zmianę części pliku. – Jerry101

+0

@ Jerry101: "treść linii, nie pliki" --- Powiedziałbym "zmiany". Ponieważ: usunięcie pliku nie zawiera linii. To samo dotyczy zmiany uprawnień – zerkms

+1

@zerkms tak, ale jeśli zmienisz, które części pliku są inscenizowane/niezamknięte, robi to w "porcjach", które wydają się być jednym lub więcej wierszem dla plików tekstowych. Popraw mnie, jeśli się mylę. – Jerry101

7

Gdzie w .git mogę sprawdzić stan autorytetu tego pliku?

Zastosowanie git diff:

  • git diff -- yourFile daje zmiany jeszcze nie zainscenizowane (jeszcze dodane do indeksu)
  • git diff --cached -- yourFile daje zmiany już dodane do indeksu.

Zobacz więcej w "Changes, not files":

Większość systemów kontroli wersji pracować z plikami. Dodajesz plik do kontroli źródła, a system śledzi zmiany od tego momentu.

Git koncentruje się na zmianach w pliku, a nie samym pliku.
Polecenie git add file nie mówi git, aby dodać plik do repozytorium, ale aby zanotować bieżący stan pliku, aby mógł zostać zatwierdzony później.

Patrz także "git add -p: The most powerful git feature you're not using yet"


Zauważ, że git status -v -v wkrótce (Git 2.3.4, Q2 2015) pokazuje zarówno dyferencjału (wystawionego i Unstaged), możliwe lista różnych różnic dla tego samego pliku.

Zobacz "Show both staged & working tree in git diff?".

+0

Dziękuję, rozumiem pomysł zmian.Jestem bardziej zainteresowany zrozumieniem, dlaczego README.md pokazywał się dwa razy w statusie. –

+0

@MarkHarrison ponieważ dodałeś zmianę przed, a następnie zrobiłem nowy – VonC

+0

Ah, dzięki, to sprawia, że ​​jest bardzo jasne. –

1

Właściwie państwo widzicie jest bardzo łatwo odtworzyć:

git init 
touch test 
git add test  #1 
echo 42 > test #2 
git status  #3 

w # 1 my etapie pusty plik testowy. # 2 zmienia zawartość pliku. Zmiany te nie zostaną przeprowadzone (ponieważ musisz jednoznacznie wprowadzić zmiany w wersji przy użyciu git add). Dane wyjściowe z git status w punkcie 3 dokładnie to pokazują.

Aby zobaczyć, które zmiany zostały zainscenizowane, uruchom git diff --cached. Aby sprawdzić, które zmiany w plikach kopii roboczej nie zostały przetestowane, uruchom polecenie git diff.

W swoim pytaniu powiedz, że prowadziłeś git commit. Z Twojego wyjścia git status wydaje się, że zatwierdzenie nie zostało utworzone, prawdopodobnie dlatego, że nie wprowadziłeś komunikatu zatwierdzenia. Sprawdź wyjście git commit, git prawdopodobnie powiedział ci, co poszło nie tak podczas próby utworzenia commit!

1

Odpowiedz "Czy to ma sens?"

To ma sens tylko wtedy, gdy rozumiesz, że git nie przechowuje różnic, które przechowuje migawki.

W opisywanym przykładzie w twoich zmianach są dwie wersje pliku README.md. Wersja zainscenizowana jest wersją, z której aktualnie jesteś zadowolony, i ostatecznie stanie się najnowszą migawką pliku, jeśli zdecydujesz się go zatwierdzić. Wersja niezaangażowana to potencjalna migawka, która zastąpi aktualnie wystawioną wersję, jeśli zdecydujesz się ją wystawić.

Przeczytaj sekcję „Snapshots nie Różnice” w poniższy link aby uzyskać więcej zrozumienia, w jaki sposób git działa:

http://git-scm.com/book/en/Getting-Started-Git-Basics

również spojrzeć na poniższy link do dalszego wyjaśnienia sytuacji, że” już uwzględnione w swoim pytaniu (w szczególności rozdział „Staging zmodyfikowane pliki”):

http://git-scm.com/book/en/Git-Basics-Recording-Changes-to-the-Repository