W swoim domyślnym trybie, git pull jest skrótem dla git fetch, po którym następuje git merge FETCH_HEAD.
Kiedy robisz git pull origin master
,
git pull
wykonuje scalanie, co często tworzy zatwierdzenie scalające. Dlatego domyślnie ściąganie z pilota NIE jest nieszkodliwą operacją: może stworzyć nowy commit sha, który wcześniej nie istniał. Takie zachowanie może zmylić użytkownika, ponieważ to, co wydaje się być nieszkodliwą operacją pobierania, w rzeczywistości zmienia historię zatwierdzeń w nieprzewidywalny sposób.
Aby tego uniknąć, potrzebujesz
git pull --ff-only
(czy nie? czytaj dalej, aby zobaczyć, który z nich odpowiada Twoim potrzebom)
Dzięki git pull --ff-only
, Git zaktualizuje twoją gałąź tylko wtedy, gdy można ją „przewinąć do przodu” bez tworzenia nowych zatwierdzeń. Jeśli nie można tego zrobić, git pull --ff-only
po prostu przerywa pracę z komunikatem o błędzie.
Możesz skonfigurować swojego klienta Git tak, aby zawsze używał --ff-only
go domyślnie, więc otrzymujesz takie zachowanie, nawet jeśli zapomnisz flagi wiersza polecenia:
git config --global pull.ff only
Uwaga: --global
flaga stosuje zmianę do wszystkich repozytoriów na twoim komputerze. Jeśli chcesz, aby to zachowanie dotyczyło tylko repozytorium, w którym się znajdujesz, pomiń flagę.
Zaczerpnięte stąd
To ostrzeżenie zostało dodane w Git 2.27, jak wskazał Joe w swojej odpowiedzi.
Tak wygląda pełne ostrzeżenie:
Wyciąganie bez określania sposobu pogodzenia rozbieżnych gałęzi jest odradzane. Możesz zdusić tę wiadomość, uruchamiając jedną z następujących komend jakiś czas przed następnym wyciągnięciem:
git config pull.rebase false # merge (strategia domyślna)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
Możesz zamienić „git config” na „git config --global”, aby ustawić domyślne preferencje dla wszystkich repozytoriów. Możesz także przekazać --rebase, --no-rebase lub --ff-only w wierszu poleceń, aby przesłonić skonfigurowane domyślne dla każdego wywołania.
Ostrzeżenie przedstawia trzy polecenia jako opcje, wszystkie z nich pomijają ostrzeżenie. Ale służą różnym celom:
git config pull.rebase false # merge (the default strategy)
Zachowuje to domyślne zachowanie i pomija ostrzeżenie.
git config pull.rebase true # rebase
To faktycznie zatwierdza się na zdalnej gałęzi, utrzymując pojedynczą gałąź zarówno lokalnie, jak i zdalnie (w przeciwieństwie do domyślnego zachowania, w którym zaangażowane są dwie różne gałęzie - jedna lokalna, a druga zdalna - i aby połączyć te dwie, wykonywane jest scalanie ).
git config pull.ff only # fast-forward only
To wykonuje ściąganie tylko wtedy, gdy lokalną gałąź można przewinąć do przodu. Jeśli nie, po prostu przerywa pracę z komunikatem o błędzie (i nie tworzy żadnych zatwierdzeń).
Aktualizacja:
Jeśli masz Git 2.29
lub powyżej, można teraz ustawić pull.ff
na false
, true
lub only
pozbyć się ostrzeżenia.
git config pull.ff true
true
- To jest zachowanie domyślne. Pociągnięcie jest przewijane do przodu, jeśli to możliwe, w przeciwnym razie jest scalane.
git config pull.ff false
false
- Ciągnięcie nigdy nie jest przewijane do przodu, a scalanie jest zawsze tworzone.
git config pull.ff only
only
- Jeśli to możliwe, polecenie Pull jest przewijane do przodu, w przeciwnym razie operacja zostanie przerwana z komunikatem o błędzie.