Używając gitk log
, nie zauważyłem różnicy między nimi. Jak mogę zaobserwować różnicę (za pomocą polecenia git lub innego narzędzia)?
git
merge
fast-forward
użytkownik1162226
źródło
źródło
Odpowiedzi:
W
--no-ff
zapobiega flaggit merge
z wykonaniem „fast-forward”, jeśli wykryje, że prądHEAD
jest przodkiem commit próbujesz scalić. Szybkie przewijanie do przodu występuje, gdy zamiast konstruować zatwierdzenie scalania, git po prostu przesuwa wskaźnik gałęzi, aby wskazywał na przychodzące zatwierdzenie. Zdarza się to często, gdy wykonuje sięgit pull
bez żadnych lokalnych zmian.Czasami jednak chcesz zapobiec temu zachowaniu, zwykle dlatego, że chcesz zachować określoną topologię gałęzi (np. Łączysz się w gałęzi tematu i chcesz mieć pewność, że tak wygląda podczas czytania historii). W tym celu można przekazać
--no-ff
flagi igit merge
będzie zawsze skonstruować seryjnej zamiast szybkiego przewijania do przodu.Podobnie, jeśli chcesz wykonać a
git pull
lub użyćgit merge
, aby jawnie przewinąć do przodu i chcesz ratować się, jeśli nie można szybko przewinąć do przodu, możesz użyć--ff-only
flagi. W ten sposób możesz regularnie robić coś takiego,git pull --ff-only
bez zastanowienia, a następnie, jeśli wystąpi błąd, możesz wrócić i zdecydować, czy chcesz scalić, czy też dokonać zmiany bazy.źródło
gitk
albogit log --graph
że do przodu seryjnej nie stworzyć seryjnej commit, podczas gdy jeden non-fast-forward zrobił.--no-ff
z funkcji rozwijania lub rozwijania do opanowania jest podobne do scalania żądania pull?--no-ff
.Graficzna odpowiedź na to pytanie
Oto strona z jasnym wyjaśnieniem i graficzną ilustracją użycia
git merge --no-ff
:Dopóki tego nie zobaczyłem, byłem całkowicie zagubiony w git. Używanie
--no-ff
pozwala komuś przeglądając historię, aby wyraźnie zobaczyć gałąź, w której wypisałeś się do pracy. (ten link wskazuje narzędzie do wizualizacji „sieci” github) A oto kolejne świetne odniesienie z ilustracjami. Odniesienie to ładnie uzupełnia pierwsze z większym naciskiem na osoby mniej zaznajomione z git.Podstawowe informacje o newbs takich jak ja
Jeśli jesteś podobny do mnie, a nie do Git-guru, moja odpowiedź tutaj opisuje obsługę usuwania plików ze śledzenia gita bez usuwania ich z lokalnego systemu plików, co wydaje się słabo udokumentowane, ale często występuje. Kolejną nowością jest uzyskanie bieżącego kodu , który wciąż mi się wymyka.
Przykładowy przepływ pracy
Zaktualizowałem pakiet na mojej stronie internetowej i musiałem wrócić do notatek, aby zobaczyć przepływ pracy; Pomyślałem, że warto dodać przykład do tej odpowiedzi.
Mój obieg poleceń git:
Poniżej: faktyczne użycie wraz z objaśnieniami.
Uwaga: wynik poniżej jest wycinany; git jest dość gadatliwy.
Zauważ 3 rzeczy z góry:
1) W danych wyjściowych można zobaczyć zmiany wynikające z aktualizacji pakietu ECC, w tym dodanie nowych plików.
2) Zauważ też, że istnieją dwa pliki (nie w
/ecc
folderze), które usunąłem niezależnie od tej zmiany. Zamiast mylić usuwanie plików, utworzę późniejecc
innącleanup
gałąź, aby odzwierciedlić usunięcie tych plików.3) Nie śledziłem mojego przepływu pracy! Zapomniałem o git, kiedy próbowałem ponownie uruchomić ecc.
Poniżej: zamiast robić wszystko,
git commit -am "updated ecc package"
co zwykle robiłem, chciałem tylko dodać pliki w/ecc
folderze. Te usunięte pliki nie były specjalnie częścią mojegogit add
, ale ponieważ były już śledzone w git, muszę je usunąć z zatwierdzenia tej gałęzi:Skrypt do automatyzacji powyższego
Korzystając z tego procesu ponad 10 razy dziennie, zacząłem pisać skrypty wsadowe w celu wykonania poleceń, więc stworzyłem prawie właściwy
git_update.sh <branch> <"commit message">
skrypt do wykonania powyższych kroków. Oto źródło Gist dla tego skryptu.Zamiast
git commit -am
wybierać pliki z listy „zmodyfikowanej” utworzonej za pomocą,git status
a następnie wklejać je w tym skrypcie. Stało się tak, ponieważ wprowadziłem dziesiątki zmian, ale chciałem różnych nazw gałęzi, aby pomóc w grupowaniu zmian.źródło
--no-ff
opcją?Scal strategie
Jawne scalanie : Tworzy nowe zatwierdzenie scalania. (Oto, co dostaniesz, jeśli użyjesz
--no-ff
.)Szybkie przewijanie do przodu: Przewijaj szybko, bez tworzenia nowego zatwierdzenia:
Rebase : Ustanów nowy poziom podstawowy:
Squash: Zmiażdż lub ściśnij (coś) siłą, aby stał się płaski:
źródło
Ta
--no-ff
opcja zapewnia, że scalanie do przodu nie nastąpi, i że zawsze zostanie utworzony nowy obiekt zatwierdzenia . Może to być pożądane, jeśli chcesz, aby git utrzymywał historię gałęzi funkcji. Na powyższym obrazku lewa strona jest przykładem historii git po użyciu,git merge --no-ff
a prawa strona jest przykładem użycia,git merge
gdzie możliwe było scalenie ff.EDYCJA : Poprzednia wersja tego obrazu wskazywała tylko jednego rodzica dla zatwierdzenia scalania. Scalenia mają wiele zatwierdzeń nadrzędnych, których używa git do przechowywania historii „gałęzi funkcji” i oryginalnej gałęzi. Wiele linków nadrzędnych jest podświetlonych na zielono.
źródło
To stare pytanie, które zostało nieco subtelnie wspomniane w innych postach, ale wyjaśnienie, które sprawiło, że kliknąłem to dla mnie, jest to, że nie szybkie połączenia będą wymagały osobnego zatwierdzenia .
źródło
git merge --no-ff ecc
po prostu będziesz mieć dodatkowe zatwierdzenie korespondencji seryjnej dla wzorcagit log
gałęzi. Nie jest to technicznie potrzebne, jeśli master wskazuje bezpośredni przodek zatwierdzenia ecc, ale poprzez określenie opcji --no-ff wymusza się utworzenie zatwierdzenia scalania. Będzie miał tytuł:Merge branch 'ecc'
Flaga --no-ff powoduje, że scalanie zawsze tworzy nowy obiekt zatwierdzenia, nawet jeśli scalanie można wykonać za pomocą szybkiego przewijania do przodu. Pozwala to uniknąć utraty informacji o historycznym istnieniu gałęzi obiektów i grupuje wszystkie zatwierdzenia, które razem dodały obiekt
źródło