Oto polecenia, których użyłem z gałęzi master
git branch experiment
git checkout experiment
Następnie wprowadziłem kilka zmian w moich plikach, zatwierdziłem zmiany i przekazałem nowy oddział do GitHub.
git commit . -m 'changed files'
git push -u origin experiment
Później postanowiłem połączyć gałąź eksperymentu z gałęzią master.
git checkout master
git merge experiment
W końcu wprowadziłem zmiany do GitHub.
git push -u origin master
Wszystko poszło dobrze, dopóki nie spróbowałem usunąć mojej gałęzi eksperymentu za pomocą
git branch -d experiment
Dostałem komunikat o błędzie, error: The branch 'experiment' is not fully merged.
że jestem trochę nowy w git i nie wiem, o ile więcej mógłbym połączyć te dwie gałęzie. Czego tu brakuje?
git
git-branch
łagodny
źródło
źródło
git commit --amend
squash
: stackoverflow.com/q/41946475/109941Odpowiedzi:
Uwaga Sformułowanie zmieniło się w odpowiedzi na przykazania. Dzięki @slekse
To nie jest błąd, to ostrzeżenie. Oznacza to, że gałąź, którą zamierzasz usunąć, zawiera zatwierdzenia, które nie są dostępne z żadnego z: jej odgałęzienia lub HEAD (obecnie sprawdzona wersja). Innymi słowy, kiedy możesz stracić zatwierdzenia¹.
W praktyce oznacza to, że prawdopodobnie poprawiłeś, przebudowałeś lub przefiltrowałeś zatwierdzenia i nie wydają się one identyczne.
Dlatego możesz uniknąć ostrzeżenia , sprawdzając gałąź, która zawiera zatwierdzenia, których nie chcesz odwoływać , usuwając ten drugi oddział .²
Będziesz chciał sprawdzić, czy w rzeczywistości nie brakuje Ci żadnych istotnych zmian:
To da ci listę wszelkich nieudostępnionych między oddziałami. Jeśli jesteś ciekawy, może istnieć
--cherry-pick
różnica, która może być przyczyną ostrzeżenia, które otrzymasz:¹ Domyślnie są to tak naprawdę śmieci po pewnym czasie. Ponadto
git-branch
polecenie nie sprawdza drzewa zmian wszystkich gałęzi . Ostrzeżenie ma na celu uniknięcie oczywistych błędów.² (W tym przypadku wolę wymusić usunięcie, ale możesz potrzebować dodatkowego zabezpieczenia).
źródło
Jak Drew Taylor podkreślił, usuwanie gałęzi z -d uważa tylko obecną głowę w określaniu, czy oddział jest „w pełni scalone”. Będzie narzekać, nawet jeśli oddział zostanie połączony z innym oddziałem. Komunikat o błędzie może być zdecydowanie wyraźniejszy w tym względzie ... Możesz usunąć połączoną gałąź przed usunięciem lub po prostu użyć gałęzi git -D. Wielka-D całkowicie zastąpi czek.
źródło
origin/master
?). Wydaje mi się, żeorigin/master
najpierw sprawdzenie nie jest zbyt uciążliwe, ale wydaje się, że to dziwny przepływ - dlaczego muszę to sprawdzićorigin/master
lokalnie tylko po to, aby sprawdzić, czy moje zmiany zostały tam scalone?Próbowałem sprawdzić odpowiedź i to nie zadziałało.
Aby znaleźć zatwierdzenia, które nie zostały scalone, wystarczy użyć:
źródło
Zdarzyło mi się to dzisiaj, kiedy połączyłem moją pierwszą gałąź funkcji z powrotem w master. Jak niektórzy powiedzieli w wątku w innym miejscu na SO, sztuczka polegała na przełączeniu się z powrotem na master przed próbą usunięcia gałęzi. Po powrocie do master git chętnie usunął gałąź bez ostrzeżeń.
źródło
Git ostrzega, że możesz utracić historię, usuwając tę gałąź. Mimo że tak naprawdę nie usuwałby od razu żadnych zatwierdzeń, niektóre lub wszystkie zatwierdzenia w oddziale stałyby się nieosiągalne, gdyby nie były również częścią innego oddziału.
Aby gałąź
experiment
została „w pełni scalona” z inną gałęzią, zatwierdzanie jej końcówki musi być przodkiem końcówki drugiej gałęzi, co powoduje, że zatwierdzeniaexperiment
są podzbiorem drugiej gałęzi. Dzięki temu można go bezpiecznie usunąćexperiment
, ponieważ wszystkie jego zatwierdzenia pozostaną częścią historii repozytorium za pośrednictwem drugiego oddziału. Musi być „całkowicie” scalony, ponieważ mógł być już kilkakrotnie scalony, ale teraz dodano zatwierdzenia od ostatniego scalenia, które nie są zawarte w drugiej gałęzi.Git nie sprawdza jednak co drugiej gałęzi w repozytorium; tylko dwa:
Prawdopodobnie „odgałęzienie” dla
experiment
, jak w twoim przypadku, jestorigin/experiment
. Jeśliexperiment
jest w pełni scalony w bieżącym oddziale, to Git usuwa go bez reklamacji. Jeśli nie jest, ale jest w pełni scalony w swoim odgałęzieniu, Git kontynuuje z ostrzeżeniem wyglądającym jak:Gdzie
xxxxxxxx
wskazuje identyfikator zatwierdzenia. Bycie w pełni zintegrowanym w jego górnej części oznacza, że zatwierdzeniaexperiment
zostały wypchnięte do repozytorium źródłowego, więc nawet jeśli je zgubisz tutaj, można je przynajmniej zapisać gdzie indziej.Ponieważ Git nie sprawdza innych gałęzi, bezpieczne może być usunięcie gałęzi, ponieważ wiesz, że jest ona w pełni połączona z inną gałęzią; możesz to zrobić z
-D
opcją, jak wskazano, lub przełączyć się najpierw na ten oddział i pozwolić Gitowi potwierdzić w pełni scalony status.źródło
aby zobaczyć zmiany, które nie zostały scalone, zrobiłem to:
Uwaga: pokazuje zmiany
master
, których nie ma wexperiment
.Nie zapomnij:
Kiedy skończysz, spójrz.
źródło
man git-reset
i polecenia resetowania git wystarczą, aby wyjść z problemów ze stanem.Najłatwiejsze rozwiązanie z wyjaśnieniem (rozwiązanie dwukrotnie sprawdzone) (wcześniej napotkano problem)
Rzecz w tym:
1- Nie mogę usunąć gałęzi
2 - Terminal wyświetla komunikat ostrzegawczy, że niektóre zatwierdzenia nie zostały jeszcze zatwierdzone
3- wiedząc, że sprawdziłem master i oddział i są one identyczne (aktualne)
rozwiązanie:
Wyjaśnienie:
kiedy twoja gałąź jest połączona z odgałęzieniem zdalnym odgałęzienia (na Github, bitbucket lub cokolwiek), musisz scalić (wypchnąć) to do master, i musisz wypchnąć nowe zmiany (zatwierdzenia) do zdalnego repozytorium (Github, bitbucket lub cokolwiek) z oddziału,
w kodzie zrobiłem to, że przełączyłem się na master, a następnie scaliłem z nim gałąź (aby upewnić się, że są one identyczne na twoim komputerze lokalnym), następnie ponownie przełączyłem się na gałąź i wrzuciłem aktualizacje lub zmiany do zdalnego online repo przy użyciu „git push”.
potem ponownie przełączyłem się na master i próbowałem usunąć gałąź, a problem (komunikat ostrzegawczy) zniknął, a gałąź usunięta pomyślnie
źródło
Możesz po prostu dowiedzieć się:
--cherry
opcja jest synonimem--right-only --cherry-mark --no-merges
Powiedziała strona git-log
Do Twojej wiadomości
--cherry-pick
pomija równoważne zatwierdzenia, ale--cherry-marks
nie robi. Przydatne jest znajdowanie bazy i wymuszanie zaktualizowanych zmian między upstream a współpracującym oddziałem publicznymźródło
Nie miałem oddziału upstream na moim lokalnym git. Utworzyłem lokalny oddział z master, git checkout -b mybranch. Utworzyłem gałąź z GUI bitbucket na gitie upstream i przekazałem moją gałąź lokalną (mybranch) do tej gałęzi upstream. Kiedy zrobiłem pobieranie git na moim lokalnym git, aby pobrać gałąź upstream, mogłem zrobić gałąź git -d mybranch.
źródło
Wierzę, że flaga
--force
jest tym, czego naprawdę szukasz. Wystarczy użyć,git branch -d --force <branch_name>
aby wymusić usunięcie gałęzi.źródło