2011-02-02 15 views
39

git status pokazuje kilka plików, które zostały zmodyfikowane, a niektóre zostały usunięte. Chcę najpierw zatwierdzić zmodyfikowane pliki, a następnie usunięte. Nie widzę żadnej opcji w git add, która umożliwia mi to zrobić. Jak mogę to zrobić?Jak zatwierdzać tylko zmodyfikowane (a nie nowe lub usunięte) pliki?

EDIT: Jak podkreślono, git add by nie wystawił usunięte pliki i tak, więc git add . zrobi. Ma jednak efekt uboczny włączenia plików, które nie były śledzone, a których również chciałbym uniknąć. Zmieniłem odpowiednio tytuł pytania.

Odpowiedz

58

Następujące polecenie powinno załatwić sprawę:

git commit -a 

lub

git commit -am "commit message" 

Z Pro Git książki:

Zapewnienie opcję -a do polecenia git commit powoduje Git automatycznie wykona każdy plik, który jest już śledzony przed wykonaniem zatwierdzenia

+0

Czy jest jakaś wada używania flag mutliple, aby dodać także wiadomość? np. git commit -am "zaktualizowane pliki" – sayth

+1

@sayth, w tym przypadku nie ma wad. Jest to kwestia preferencji - można chcieć użyć edytora tekstów do pisania wiadomości zatwierdzenia. – tokarev

+3

To nie odpowiada na pytanie. -a będzie zawierać zarówno zmodyfikowane, jak i usunięte pliki. Jest to całkowicie błędne i powinno zostać usunięte. –

3

I może być czegoś brakuje, ale git add nie zawiera usuniętych plików, trzeba użyć git rm do usunięcia tych:

mkdir git-test 
cd git-test 
git init 
touch a 
touch b 
touch c 
git add . 
git commit -m "Initial" 
echo "a" > a 
echo "b" > b 
rm c 
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) 
# 
#  modified: a 
#  modified: b 
#  deleted: c 
# 

git add . 

# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  modified: a 
#  modified: b 
# 
# 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: c 
# 

git commit -m "Changed" 
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: c 
# 

git rm c 
git commit -m "Deleted" 

Dziennik git pokazuje trzy zatwierdzenia.

+0

Masz rację, że 'git add' nie zainscenizowałby usuniętych plików (będąc bardzo nowym w git, jeszcze tego nie wiedziałem - dzięki). Ale "git add." Wydaje się dodawać niepotwierdzone pliki, co jest czymś, czego chciałbym uniknąć, więc odpowiedź 'xargs' nadal ma pewną przydatność. –

+0

Czy nadal chcesz dodać te nieskorowane pliki? Jeśli nie, możesz dodać je do pliku .gitignore. – Makis

+0

Nie wiedziałem o .gitignore, dziękuję. Moją obecną potrzebą jest po prostu uporządkowanie zatwierdzeń, tak aby odzwierciedlały one jedną operację atomową (np. "Naprawiony błąd" jest oddzielony od "dodanej funkcji"), więc pliki te zostaną zatwierdzone w pewnym momencie w przyszłości. –

0

Byłbym ostrożny z używaniem git commit -a - chyba że upewnił się, że plik .gitignore zawiera wszystkie pliki, które nie chcesz tam dodana

użyłem git commit -a wielokrotnie w obszarach, w których nie był to przypadek, a skończyło się na konieczności wyczyścić/usunąć pliki tymczasowe itp z repozytorium git

+2

Nie, to nie "git commit -a" kto to zrobił. 'git commit -a' robi * nie * dodaje nowe pliki, po prostu zatwierdza wszystkie zmiany do już zapisanych plików. Prawdopodobnie uruchomiłeś 'git add .', aby skończyć w tej sytuacji. –

13

można użyć:

git add -u 

na scenie już pliki, które zostały zmodyfikowane śledzone od ostatniego zatwierdzenia.

git-add Od strony człowieka:

-u
--update

pasuje tylko wobec już śledzone pliki w indeksie zamiast drzewa roboczego. Oznacza to, że nigdy nie przesunie nowych plików, ale że przejdzie zmodyfikowaną nową zawartość śledzonych plików i że usunie pliki z indeksu, jeśli odpowiednie pliki z drzewa roboczego zostały usunięte. Jeśli nie podano, domyślnie "."; innymi słowy, zaktualizuj wszystkie śledzone pliki w bieżącym katalogu i jego podkatalogach.

Nie wiem, kiedy funkcja została dodana.

+0

'git add' będzie' commit' plików ?! –

+0

@AlexisWilke Nie, ale doda pliki do obszaru przemieszczania, dzięki czemu będą gotowe do zatwierdzenia nowego zatwierdzenia w aktualnie wyrejestrowanym oddziale. Będziesz musiał zatwierdzić zmiany etapowe za pomocą 'git commit'. –

+2

'git add -u; git commit' jest zasadniczo równoznaczne z 'git commit -a'. Zatwierdzi usunięcie pliku, więc nie odpowiada na pytanie. –

Powiązane problemy