Błąd Git": gałąź 'x' nie jest w pełni scalona"

Oto polecenia, których użyłem z gałęzi master

git branch experiment
git checkout experiment

Potem wprowadziłem kilka zmian w moich plikach, zatwierdziłem zmiany i popchnąłem nową gałąź do Githuba.

git commit . -m 'changed files'
git push -u origin experiment

Później postanowiłem połączyć moją gałąź eksperymentu w gałąź master.

git checkout master
git merge experiment

W końcu przesunąłem zmiany na Githubie.

git push -u origin master

Wszystko poszło dobrze, dopóki nie próbowałem usunąć mojej gałęzi eksperymentu za pomocą

git branch -d experiment

Dostałem komunikat o błędzie:

Error: The branch "eksperyment" nie jest w pełni połączony.
Jeśli jesteś pewien, że chcesz go usunąć, Uruchom 'Git branch - d experiment'.

Jestem trochę nowy w git, i nie wiem, jak bardzo mógłbym jeszcze połączyć te dwie gałęzie. Co mi umyka?

Author: pkamb, 2011-09-25

12 answers

Uwaga sformułowanie zmienione w odpowiedzi na słowa. Dzięki @ slekse
To nie jest błąd, to Ostrzeżenie. Oznacza to, że gałąź, którą zamierzasz usunąć, zawiera zmiany, które nie są dostępne z żadnego z nich: jego gałąź upstream lub HEAD(aktualnie sprawdzona wersja). Innymi słowy, kiedy możesz stracić commity1.

W praktyce oznacza to, że prawdopodobnie zmieniasz, zmieniasz lub filtrujesz commity, a one nie wydają się identyczne.

Dlatego możesz uniknąć ostrzeżenia , sprawdzając gałąź, która zawiera commity, których dotyczy un-reference , usuwając tę inną gałąź.²

Będziesz chciał sprawdzić, czy w rzeczywistości nie brakuje ci żadnych ważnych commitów:

git log --graph --left-right --cherry-pick --oneline master...experiment

To da ci listę wszystkich niezarejestrowanych pomiędzy gałęziami. Jeśli jesteś ciekawy, może być różnica bez --cherry-pick i ta różnica może być powodem Ostrzeżenia otrzymujesz:

--cherry-pick

Pomiń commit, który wprowadza tę samą zmianę co inny commit po "drugiej stronie", gdy zestaw commitów jest ograniczony różnicą symetryczną. Na przykład, jeśli masz dwie gałęzie, A i B, zwyczajowym sposobem na wyświetlenie wszystkich commitów tylko z jednej strony jest opcja --left-right, jak w powyższym przykładzie w opisie tej opcji. Pokazuje jednak commity, które zostały pobrane z drugiej gałęzi (na przykład "3rd on b" może być pobrane z drugiej gałęzi z oddziału A). Dzięki tej opcji takie pary zatwierdzeń są wykluczone z wyjścia.


1 są tak naprawdę tylko śmieciami zbieranymi po pewnym czasie, domyślnie. Ponadto polecenie git-branch nie sprawdza drzewa rewizji wszystkich gałęzi. Ostrzeżenie ma na celu uniknięcie oczywistych błędów.

2 (moim preferowaniem jest po prostu wymusić usunięcie, ale możesz chcieć mieć dodatkowe zapewnienie).

 341
Author: sehe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Jak zauważył Drew Taylor, usunięcie gałęzi za pomocą-d uwzględnia tylko bieżącą głowicę w określaniu, czy gałąź jest "w pełni scalona". Będzie narzekać nawet jeśli gałąź jest połączona z inną gałąź. Komunikat o błędzie może być zdecydowanie jaśniejszy w tym zakresie... Możesz albo wymeldować scaloną gałąź przed usunięciem, albo po prostu użyć git branch-D. wielkie -D całkowicie nadpisze kontrolę.

 86
Author: drwowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-02 14:59:00

Próbowałem odpowiedzi sehe i nie zadziałało.

Aby znaleźć commity, które nie zostały połączone wystarczy użyć:

git log feature-branch ^master --no-merges
 17
Author: qwertzguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-04 02:56:37

Przytrafiło mi się to dzisiaj, gdy scalałem moją pierwszą gałąź fabularną z powrotem do master. Jak niektórzy mówili w innym wątku NA so, sztuczka była przełączanie z powrotem do master przed próbą usunięcia gałęzi. Raz w back in master, git z radością usunął gałąź bez żadnych ostrzeżeń.

 15
Author: Drew Taylor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 23:52:21

Najprostsze rozwiązanie z wyjaśnieniem (podwójnie sprawdzone rozwiązanie) (wcześniej rozwiązano problem)

Problem polega na tym, że:

1 - nie mogę usunąć gałęzi

2-terminal keep wyświetla komunikat ostrzegawczy, że istnieją pewne zmiany, które nie zostały jeszcze zatwierdzone

3-wiedząc, że sprawdziłem master i branch i są identyczne (aktualne)

Rozwiązanie:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

Wyjaśnienie:

Gdy twoja gałąź jest podłączona do zdalnej gałęzi (na Github, bitbucket lub cokolwiek), musisz scalić (wcisnąć) to do master, i musisz wcisnąć nowe zmiany (commity) do zdalnego repo (Github, bitbucket lub cokolwiek) z gałęzi,

W kodzie zrobiłem to, że przełączyłem się na master, następnie połączyłem gałąź z nią (aby upewnić się, że są identyczne na twojej lokalnej maszynie), a następnie przełączyłem się ponownie na gałąź i wcisnąłem aktualizacje lub zmiany do zdalnego repo online za pomocą "git push".

Potem przerzuciłem się na po tym, jak udało się usunąć gałąź, problem (komunikat ostrzegawczy) zniknął, a gałąź została pomyślnie usunięta

 8
Author: Elta3lab,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-14 08:39:21

Git ostrzega, że możesz stracić historię poprzez usunięcie tej gałęzi. Nawet jeśli nie usunie to od razu żadnych commitów, niektóre lub wszystkie commity z gałęzi staną się nieosiągalne, jeśli nie będą częścią innej gałęzi.

Aby gałąź experiment była "w pełni scalona" w inną gałąź, jej commit końcówki musi być przodkiem końcówki drugiej gałęzi, co czyni commity w experiment podzbiorem drugiej gałęzi. Dzięki temu można bezpiecznie usunąć experiment, ponieważ wszystkie zmiany pozostaną częścią historii repozytorium za pośrednictwem innej gałęzi. Musi być "w pełni" scalone, ponieważ może być już scalone kilka razy, ale teraz mają dodane commity od ostatniego scalenia, które nie są zawarte w innej gałęzi.

Git nie sprawdza jednak każdej gałęzi w repozytorium; tylko dwie:

  1. obecna gałąź (Głowa)
  2. odgałęzienie upstream, jeśli istnieje

"upstream branch" dla experiment, Jak w twoja sprawa, to prawdopodobnie origin/experiment. Jeśli experiment jest w pełni scalone w bieżącej gałęzi, to Git usuwa ją bez żadnych skarg. Jeśli nie jest, ale jest w pełni scalony w gałęzi upstream, to Git kontynuuje z ostrzeżeniem wyglądającym jak:

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

Gdzie xxxxxxxx wskazuje ID zatwierdzenia. Pełne połączenie w źródle oznacza, że commity w experiment zostały przeniesione do repozytorium origin, więc nawet jeśli stracisz je tutaj, mogą być przynajmniej zapisane w innym miejscu.

Ponieważ Git nie sprawdź inne gałęzie, może być bezpiecznie usunąć gałąź, ponieważ wiesz, że jest w pełni scalona z inną; możesz to zrobić za pomocą opcji -D, jak wskazano, lub przełączyć się na tę gałąź i pozwolić Gitowi potwierdzić status w pełni scalony.

 4
Author: troore,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 16:04:23

Aby zobaczyć zmiany, które nie są połączone, zrobiłem to:

git checkout experiment
git merge --no-commit master

git diff --cached

UWAGA: To pokazuje zmiany w master, które nie są w experiment.

Nie zapomnij:

git merge --abort
Kiedy skończysz szukać.
 3
Author: ThorSummoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-20 20:48:43

Możesz po prostu dowiedzieć się:

Git log -- Cherry master...experimental

--cherry opcja jest synonimem dla --right-only --cherry-mark --no-merges

Git-log strona man said

Przydatne jest ograniczenie wyjścia do commitów po naszej stronie i zaznaczenie tych, które zostały zastosowane do drugiej strony rozwidlonej historii za pomocą Git log --cherry upstream...mybranch, podobnie jak git cherry upstream mybranch.

Dla twojej wiadomości. --cherry-pick pomija równoważne commity, ale --cherry-marks nie. to przydatne do znalezienia rebase i wymusić zaktualizowane zmiany między upstream a coworkingową gałęzią publiczną

 3
Author: yongbin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-07-04 02:58:34

Nie miałem gałęzi upstream na moim lokalnym gitu. Stworzyłem lokalny oddział od mistrza, git checkout-B mybranch . Stworzyłem gałąź z interfejsem graficznym bitbucket na Git-u i popchnąłem do niej moją lokalną gałąź (mybranch). Gdy wykonałem git fetch na moim lokalnym git, aby pobrać gałąź upstream, mogłem zrobić Git branch-d mybranch.

 2
Author: edW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-31 15:05:24

Wierzę, że flaga --force jest tym, czego naprawdę szukasz. Wystarczy użyć git branch -d --force <branch_name>, Aby usunąć gałąź siłą.

 1
Author: Sergey Samoylenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-01 11:08:09
C:\inetpub\wwwroot\ember-roomviewer>git branch -d guided-furniture
warning: not deleting branch 'guided-furniture' that is not yet merged to
         'refs/remotes/origin/guided-furniture', even though it is merged to HEAD.
error: The branch 'guided-furniture' is not fully merged.
If you are sure you want to delete it, run 'git branch -D guided-furniture'.

Rozwiązaniem dla mnie było po prostu to, że gałąź funkcji musiała zostać przesunięta do pilota. Wtedy gdy biegłem:

git push origin guided-furniture
/* You might need to fetch here */
git branch -d guided-furniture

Deleted branch guided-furniture (was 1813496).
 0
Author: Epirocks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-25 11:03:47

Jeśli wykonałeś połączenie na Github i widzisz Błąd poniżej. Musisz pobrać (pobrać i zatwierdzić) zmiany ze zdalnego serwera, zanim rozpozna scalenie na twoim lokalnym. Po wykonaniu tej czynności, Git pozwoli Ci usunąć gałąź bez podania błędu.

Błąd: gałąź 'x' nie jest w pełni scalona. Jeśli jesteś pewien, że chcesz go usunąć, Uruchom 'Git branch-D 'x'.

 0
Author: Cameron Zabriskie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-10-16 16:33:35