Kiedy muszę wykonać „git pull”, przed lub po „git add, git commit”?

93

Jaka jest właściwa droga?

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

Lub

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

Lub

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 adddo przygotowania śledzonego i zmodyfikowanego pliku. Nie dołączać zupełnie nowego pliku do repozytorium. Czy to zmienia kolejność poleceń?

Zielony
źródło
Powiązane pytanie: stackoverflow.com/questions/813822/ ...
leo9r

Odpowiedzi:

96

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

Zachowaj swoje lokalne zmiany:

git stash

Zaktualizuj gałąź do najnowszego kodu

git pull

Scal lokalne zmiany w najnowszym kodzie:

git stash apply

Dodaj, zatwierdź i prześlij swoje zmiany

git add
git commit
git push

Z mojego doświadczenia wynika, że ​​jest to droga do najmniejszego oporu w Git (zresztą w wierszu poleceń).

johnjo
źródło
4
Czy możesz wyjaśnić, dlaczego to jest lepsze? Jakich problemów to pozwala uniknąć? W szczególności, dlaczego jest to lepsze niż zwykłe zatwierdzenie> pociągnięcie> wypchnięcie? (Czuję się jak to może być najlepszą odpowiedź, ale nie ma wystarczająco dużo informacji, teraz nawet uznać za dobrą odpowiedź.)
Dallina
7
Być może było to zbyt anegdotyczne, ale zawsze uważałem to podejście (w wierszu poleceń, a nie z czymś w rodzaju drzewa źródłowego). Wykonanie zatwierdzenia, a następnie ściągnięcia, podczas pracy w dużym zespole, zawsze prowadzi do dużych konfliktów podczas łączenia, ponieważ git nie był zbyt dobry w scalaniu moich zmian w pliku z przychodzącym. Przechowywanie pozwoliło mi pobrać nowe zmiany, a następnie użyć zaktualizowanego kodu jako podstawy do dodania moich zmian do. Radzenie sobie z konfliktami było łatwiejsze, ponieważ były dla mnie jaśniejsze (ponieważ moje zmiany były teraz konfliktami). Z perspektywy czasu może to było po prostu łatwiejsze w mojej sytuacji.
johnjo
1
Więc to brzmi jak coś w rodzaju „Jak jesz słonia? Jeden kęs na raz”. tj. podzielenie procesu na kilka dodatkowych etapów, aby uprościć fuzje i wprowadzić mniej i być może wyraźniejszych zmian. Ma sens.
dallin
Czy git add jest tu konieczny? Jeśli wszystkie pliki są już dodane do przemieszczania!
Sharp Edge
A co jeśli nie używasz git stash?
Aaron Franke
76

pull = pobierz + scal.

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

Więc ciągnij po zatwierdzeniu.

Arnaud Denoyelle
źródło
8
Czy oznaczałoby to, że w końcu wykonasz dodatkowe zatwierdzenie za każde dokonane zatwierdzenie i sprawisz, że repozytorium będzie niechlujne? Również początkowy komunikat o zatwierdzeniu kończy się za każdym razem komentarzem scalającym. Jeśli tak, byłbym skłonny użyć metody skrytki wspomnianej poniżej przez @johnjo.
PoniedziałekPapier
3
@DanielM Tak, istnieje dodatkowe zatwierdzenie dla scalenia (z wyraźnym domyślnym komunikatem zatwierdzenia). Jest to jednak całkiem dobra rzecz, ponieważ umożliwia sprawdzenie ostatniego zatwierdzenia lub ostatniego zatwierdzenia kolegi lub zatwierdzenia scalającego. Jeśli chcesz tego uniknąć i jeśli chcesz umieścić swoje zmiany po zatwierdzeniach kolegi, możesz rebasezamiast tego merge. Możesz to zrobić za pomocą jednego git commit && git rebaselub drugiego git pull --rebase.
Arnaud Denoyelle
Dzięki za wskazówkę, @Arnaud. Po przeczytaniu wielu różnych pytań SO, ten komentarz się skończył. Moją preferowaną opcją, gdy koledzy pracują nad różnymi plikami, jest git pullumieszczenie moich zmian w fazie, ponieważ uważam to za najbardziej naturalne. Chociaż zdaję sobie sprawę, że działa wiele różnych przepływów pracy (skrytka też jest fajna), więc prawdopodobnie jest to kwestia gustu.
nephewtom
51

Sugerowałbym jak najczęstsze pobieranie ze zdalnej gałęzi, aby zminimalizować duże fuzje i możliwe konflikty.

Powiedziawszy to, wybrałbym pierwszą opcję:

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

Zatwierdź zmiany przed ściągnięciem, aby twoje zatwierdzenia zostały połączone ze zdalnymi zmianami podczas ściągania. Może to prowadzić do konfliktów, z którymi możesz zacząć sobie radzić, wiedząc, że Twój kod jest już zatwierdzony, gdyby coś poszło nie tak i musisz przerwać scalanie z dowolnego powodu.

Jestem pewien, że ktoś się ze mną nie zgodzi, nie sądzę, że jest jakiś właściwy sposób na wykonanie tego scalania, tylko to, co działa najlepiej dla ludzi.

Jasarien
źródło
1
Czy mógłbyś zobaczyć moją aktualizację pytania? Zapomniałem wyjaśnić, do czego git adddokładnie służy mój przykład.
Green
1
Nie powinno mieć znaczenia, czy był to nowy plik, czy śledzony / zmodyfikowany plik. Nadal popełniaj, a następnie ciągnij.
Jasarien
7

Myślę, że git pull --rebasejest to najczystszy sposób na ustawienie najnowszych lokalnych zatwierdzeń na zdalnych zatwierdzeniach, których w pewnym momencie nie masz.

W ten sposób nie musisz ciągnąć za każdym razem, gdy chcesz zacząć wprowadzać zmiany.

Mohyaddin Alaoddin
źródło
To też robię, ale tylko po to, aby zaznaczyć, że zdecydowanie istnieją dwie główne szkoły myślenia na ten temat (skupione wokół tego, czy najlepiej jest rozwiązywać konflikty między poszczególnymi zatwierdzeniami, czy też raz w zatwierdzaniu scalającym) z samym Linusem w obozie scalającym . Na szczęście samo narzędzie nie jest uparte, więc używaj go, ale działa najlepiej dla Ciebie i potrzeb Twojego projektu :-)
Luke Usherwood
3

Chcesz, aby zmiana została uwzględniona na szczycie bieżącego stanu zdalnej gałęzi. Więc prawdopodobnie chcesz wyciągnąć rękę, zanim się zobowiążesz. Następnie ponownie wprowadź zmiany.

„Brudne” pliki lokalne nie stanowią problemu, o ile nie występują konflikty ze zdalną gałęzią. Jeśli jednak wystąpią konflikty, scalanie zakończy się niepowodzeniem, więc nie ma żadnego ryzyka ani niebezpieczeństwa związanego z ściąganiem danych przed wprowadzeniem lokalnych zmian.

AlexE
źródło
1
Nie zadziała, jak wspomniał Arnaud, ściąganie wymaga, abyś najpierw zatwierdził zmiany.
Jasarien
Wydaje się, że mój dupek jest zadowolony z wielu lokalnych zmian. Oczywiście, jeśli te same pliki zostaną zmienione w zdalnej gałęzi, scalająca część ściągania nie powiedzie się. Aby stworzyć właściwy konflikt scalania, musiałbym najpierw zatwierdzić. Tak więc, jeśli zbiór plików zmienionych lokalnie i zdalnie jest rozłączny, ściąganie, a następnie zatwierdzanie jest w porządku. W przeciwnym razie git nie będzie ciągnąć. Próbując nie można nic zrobić.
AlexE,
To moja ulubiona opcja, gdy ludzie pracują nad różnymi plikami i uważam ją za najbardziej naturalną.
nephewtom