2013-08-30 12 views
49

Jaka jest właściwa droga?Kiedy muszę zrobić "git pull", przed lub po "git add, git commit"?

git add foo.js 
git commit foo.js -m "commit" 
git pull 
git push 

Albo

git pull 
git add foo.js 
git commit foo.js -m "commit" 
git push 

Albo

git add foo.js 
git pull 
git commit foo.js -m "commit" 
git push 

UPD:

Zapomniałem wspomnieć, że w tym przypadku używam git add aby wystawić śledzone i zmodyfikowany plik. Nie dołączać zupełnie nowego pliku do repozytorium. Czy zmienia to kolejność poleceń?

+0

Powiązane pytanie: http://stackoverflow.com/questions/813822/how-to-make-git-merge-handle-uncommitted-changes-to-my-working-tree – leo9r

Odpowiedz

49

pull = fetch + scalanie.

Musisz wykonać to, co zrobiłeś przed połączeniem.

Wyciągnij po zatwierdzeniu.

+4

Czy to oznacza, że ​​kończysz dodatkowe zatwierdzenie dla każdego zatwierdzenia, które popełniłeś, i zrób niechlujstwo repozytorium? Również twój początkowy komunikat zatwierdzenia kończy się, a za każdym razem pojawia się komentarz scalający. Jeśli tak, byłbym skłonny użyć metody skrytki wspomnianej poniżej przez @johnjo. –

+2

@ DanielM Tak, istnieje dodatkowe zatwierdzenie dla scalenia (z jawnym domyślnym komunikatem zatwierdzenia). Jest to całkiem dobra rzecz, ponieważ pozwala na sprawdzenie ostatniego zatwierdzenia lub ostatniego zatwierdzenia przez twojego kolegę lub zatwierdzenia scalenia. Jeśli chcesz tego uniknąć i chcesz umieścić swoje zatwierdzenia po zatwierdzeniu przez twojego kolegę, możesz 'rebase' zamiast' merge'. Możesz to zrobić za pomocą 'git commit && git rebase' lub' git pull --rebase'. –

+0

Dzięki za cynk, @Arnaud. Po przeczytaniu wielu różnych pytań SO, ten komentarz to zrobił. Moją preferowaną opcją, gdy koledzy pracują nad różnymi plikami, jest "git pull" po wystawieniu moich zmian, ponieważ uważam je za najbardziej naturalne. Chociaż zdaję sobie sprawę, że wiele różnych przepływów pracy (skrytka też jest dobra), więc prawdopodobnie jest to kwestia gustu. – nephewtom

36

Proponuję wycofywać się z oddziału zdalnego tak często, jak to możliwe, aby zminimalizować duże scalenia i możliwe konflikty.

Mimo, że pójdę z pierwszej opcji:

git add foo.js 
git commit foo.js -m "commit" 
git pull 
git push 

swoje zmiany przed wyciągnięciem tak, że rewizje są połączone z odległych zmian podczas ściągania. Może to spowodować konflikty, z którymi możesz zacząć się zajmować, wiedząc, że twój kod jest już popełniony, jeśli coś pójdzie nie tak i musisz przerwać scalanie z dowolnego powodu.

Jestem pewna, że ​​ktoś się ze mną nie zgodzi, ale nie sądzę, że istnieje jakiś sposób, aby zrobić taki przepływ, tylko to, co działa najlepiej dla ludzi.

+1

Czy możesz zobaczyć moją aktualizację pytania? Zapomniałem wyjaśnić, co dla 'git add' jest używane dokładnie w moim przykładzie. – Green

+0

Nie ma znaczenia, czy był to nowy plik, czy plik śledzony/zmodyfikowany. Wciąż zatwierdzaj, a następnie pociągnij. – Jasarien

3

Chcesz, aby zmiana była ustawiona na bieżący stan oddziału zdalnego. Prawdopodobnie chcesz się wycofać, zanim się zaangażujesz. Następnie ponownie wprowadź zmiany.

"Dirty" pliki lokalne nie stanowią problemu, o ile nie występują żadne konflikty z oddziałem zdalnym. Jeśli jednak dojdzie do konfliktów, scalanie zakończy się niepowodzeniem, więc nie pociąga za sobą ryzyka ani zagrożenia przed wprowadzeniem lokalnych zmian.

+1

Nie działa, jak powiedział Arnaud, ciągnięcie wymaga uprzedniego zatwierdzenia zmian. – Jasarien

+0

Mój git wydaje się być zadowolony z wielu lokalnych zmian. Oczywiście, jeśli te same pliki zostaną zmienione w oddziale zdalnym, część scalania pobierania nie powiedzie się. Aby utworzyć prawidłowy konflikt scalania, musiałbym się najpierw zobowiązać, na pewno. Tak więc, jeśli zbiór plików zmienionych lokalnie i zdalnie jest rozłączny, pociągnięcie i zatwierdzenie jest w porządku. W przeciwnym razie git nie będzie ciągnąć. Żadnych szkód, które można zrobić, próbując. – AlexE

+0

To jest moja preferowana opcja, gdy ludzie pracują nad różnymi plikami i uważam ją za najbardziej naturalną. – nephewtom

33

Myślę, że najlepszym sposobem na to jest:

Stash Twoje lokalne zmiany:

git stash 

Aktualizacja oddział do najnowszego kodu

git pull 

Scalanie lokalne zmiany w najnowszy kod:

git stash apply 

Dodaj, popełnić i popchnąć zmiany

git add 
git commit 
git push 

Z mojego doświadczenia jest to ścieżka do najmniejszego oporu z Git (w linii komend w każdym razie).

1

Myślę, że git pull --rebase to najczystszy sposób na ustawienie lokalnych ostatnich zatwierdzeń na zdalnym zatwierdzeniu, którego nie masz w określonym momencie.

W ten sposób nie musisz ciągnąć za każdym razem, gdy chcesz rozpocząć wprowadzanie zmian.