Po git pull origin master
chwili otrzymuję następujący komunikat:
warning: Pulling without specifying how to reconcile divergent branches is
discouraged. You can squelch this message by running one of the following
commands sometime before your next pull:
git config pull.rebase false # merge (the default strategy)
git config pull.rebase true # rebase
git config pull.ff only # fast-forward only
You can replace "git config" with "git config --global" to set a default
preference for all repositories. You can also pass --rebase, --no-rebase,
or --ff-only on the command line to override the configured default per
invocation.
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), 51.49 KiB | 850.00 KiB/s, done.
Następnie wyciąganie zostało zakończone pomyślnie. Mimo to mam wątpliwości co do tej wiadomości.
Co najlepiej zrobić w tym przypadku?
Odpowiedzi:
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
(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: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:
Ostrzeżenie przedstawia trzy polecenia jako opcje, wszystkie z nich pomijają ostrzeżenie. Ale służą różnym celom:
Zachowuje to domyślne zachowanie i pomija ostrzeżenie.
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 ).
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
nafalse
,true
lubonly
pozbyć się ostrzeżenia.true
- To jest zachowanie domyślne. Pociągnięcie jest przewijane do przodu, jeśli to możliwe, w przeciwnym razie jest scalane.false
- Ciągnięcie nigdy nie jest przewijane do przodu, a scalanie jest zawsze tworzone.only
- Jeśli to możliwe, polecenie Pull jest przewijane do przodu, w przeciwnym razie operacja zostanie przerwana z komunikatem o błędzie.źródło
git config --global pull.ff only
) tak .pull.rebase false
, ale nie działało zgodnie z opisem. To było zawsze tworząc scalającej, a nie fast-spedycja. Główną przyczyną było to, że miałemmerge.ff false
ustawienie. Po wyczyszczeniu tego ustawienia przewija do przodu, kiedy powinno. Dokumenty tutaj (prawie identyczne z dokumentami git pull )To jest nowe ostrzeżenie dodane w Git 2.27 :
Aby usunąć to ostrzeżenie, należy ustawić jedną z sugerowanych wartości do preferowanego domyślne zachowanie dla
git pull
jeśli nie określają zachowanie w wierszu poleceń (za pomocą--ff
,--no-ff
,--ff-only
,--rebase
). We wszystkich przypadkach, jeśli to możliwe ,git
spróbuje przeprowadzić szybkie przewijanie do przodu ( Co to jest git fast-forwarding? ). Ustawienia kontrolują, co się dzieje, gdy w oddziale są zmiany, ale nie ma ich w oddziale zdalnym.To jest istniejące domyślne zachowanie; ustaw to bez ostrzeżenia i bez zmiany zachowania;
git
połączy zdalną gałąź z lokalną.Tutaj
git
spróbuje ponownie bazować na twoich zmianach na zdalnej gałęzi. Zobacz Kiedy należy używać git pull --rebase? aby uzyskać więcej informacji, dlaczego możesz tego chcieć.Jeśli szybkie scalanie nie jest możliwe,
git
odmówi kontynuowania. Jako różnica między git pull --rebase i git pull --ff-only cudzysłowy:źródło
pull.rebase = true
ibranch.autoSetupRebase = always
?git config pull.ff only
lub równoważniegit pull --ff-only
jest najbezpieczniejszy. Powodem jest to, że rebase może nadpisać historię i może spowodować utratę zatwierdzeń, jeśli inny programista wymusił przesunięcie do tej samej gałęzi.Ale wszystkie z nich są ważne.
źródło
Uwaga: Wcześniej nauczyliśmy „
git pull
” ( man ), aby ostrzegał, gdy użytkownik nie mówi, że historie muszą zostać scalone, ponownie oparte lub akceptuje tylko przewijanie do przodu, ale ostrzeżenie jest wyzwalane dla tych, którzy ustawilipull.ff
zmienną konfiguracyjną.Tak już nie jest (co oznacza: koniec z ostrzeżeniami ) w Git 2.29 (Q4 2020).
Zobacz zatwierdzenie 54200ce (24 września 2020) autorstwa Alexa Henrie (
alexhenrie
) .(Scalone przez Junio C Hamano -
gitster
- w zobowiązaniu 299deea , 29 września 2020 r.)Przed Git 2.31 (Q1 2021), gdy użytkownik nie mówi "
git pull
" ( man ), aby użył rebase lub merge, polecenie wydaje głośny komunikat informujący użytkownika o wyborze między rebase a merge, ale i tak tworzy scalanie, zmuszając użytkowników, którzy chcieliby chcesz zmienić bazę, aby powtórzyć operację.Zobacz commit 7539fdc , commit b044db9 (14 grudnia 2020) autorstwa Junio C Hamano (
gitster
) .Zobacz commit c525de3 , commit 278f4be , commit 77a7ec6 (12 grudnia 2020) autorstwa Felipe Contreras (
felipec
) .(Scalone przez Junio C Hamano -
gitster
- w zatwierdzeniu d3fa84d , 6 stycznia 2021 r.)źródło