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)?
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)?
Odpowiedzi:
W --no-ff
zapobiega flag git merge
z wykonaniem „fast-forward”, jeśli wykryje, że prąd HEAD
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 i git 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.
gitk
albo git 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
.
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.
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.
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:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
Poniżej: faktyczne użycie wraz z objaśnieniami.
Uwaga: wynik poniżej jest wycinany; git jest dość gadatliwy.
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
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óźniej ecc
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ą mojego git add
, ale ponieważ były już śledzone w git, muszę je usunąć z zatwierdzenia tej gałęzi:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
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.
--no-ff
opcją?
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:
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.
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 .
git merge --no-ff ecc
po prostu będziesz mieć dodatkowe zatwierdzenie korespondencji seryjnej dla wzorca git 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