Помилка Git та "Гілка" x "не повністю об'єднана" Помилка


294

Ось команди, які я використав із гілки master

git branch experiment
git checkout experiment

Тоді я вніс деякі зміни у свої файли, вніс зміни та пересунув нову гілку до GitHub.

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

Пізніше я вирішив об'єднати свою експериментальну гілку в головну гілку.

git checkout master
git merge experiment

Нарешті я підштовхнув зміни до GitHub.

git push -u origin master

Все пройшло добре, поки я не спробував видалити свою гілку експерименту за допомогою

git branch -d experiment

Мені надійшло повідомлення про помилку, error: The branch 'experiment' is not fully merged.я трохи новачка в git, і не знаю, наскільки більше я могла би об'єднати дві гілки. Що я тут пропускаю?


2
Чи допомагає ця публікація? stackoverflow.com/questions/1710894 / ...
Chrisdigital

2
Це трапляється іноді, коли я робив цеgit commit --amend
Arcolye

12
Також майте на увазі, що це повідомлення з’явиться після squash: stackoverflow.com/q/41946475/109941
Джим Г.

Я думаю, що найпоширеніший сценарій полягає в тому, що вам просто потрібно витягнути свої щойно об’єднані зміни, перш ніж видалити гілку на місцевому рівні.
RaisinBranCrunch

Відповіді:


313

Примітка. Формулювання змінено у відповідь на зобов'язання. Дякую @slekse
Це не помилка, це попередження. Це означає, що гілка, яку ви збираєтеся видалити, містить комітети, які недоступні ні з одного: її гілки вгору за течією чи HEAD (наразі перевірена версія). Іншими словами, коли ви можете втратити зобов’язання¹.

На практиці це означає, що ви, ймовірно, змінювали, повторно базували чи фільтрували комісії, і вони не здаються однаковими.

Тому ви можете уникнути попередження , перевіривши гілку, яка містить комісії, про які ви не маєте посилання , видаливши цю іншу гілку.

Ви хочете переконатися, що ви насправді не пропускаєте жодних життєво важливих зобов'язань:

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

Це дасть вам список усіх нерозподілених між гілками. Якщо вам цікаво, може бути різниця без, --cherry-pickі ця різниця цілком може стати причиною попередження, яке ви отримуєте:

--cherry-pick

Пропустіть будь-який комітет, який вносить ту саму зміну, що й іншу комісію з "іншої сторони", коли набір комісій обмежений симетричною різницею. Наприклад, якщо у вас є дві гілки, A і B, звичайний спосіб переліку всіх комісій, що знаходяться лише на одній їх стороні, є --left-right, як приклад вище в описі цього параметра. Однак він показує комітети, які були вибрані з вишні з іншої гілки (наприклад, "3-й на b" може бути вишневий з гілки A). При такому варіанті такі пари комітетів виключаються з виводу.


¹ вони є лише сміттям, яке збирають через деякий час, за замовчуванням. Також git-branchкоманда не перевіряє дерево редагування всіх гілок . Попередження існує, щоб уникнути явних помилок.

² (Моя перевага тут - просто змусити видалення замість цього, але ви можете мати додаткове застереження).


24
Дякую. Ключовою фразою було "містить коміти, до яких не можна дістатись жодним іншим запитом". Незважаючи на те, що мені вже не потрібна гілка експерименту, і я вже об'єднав її в головний, і планував видалити її з початкового місця, git не був щасливий, поки я не підштовхнув зміни експерименту до походження. Я здогадуюсь, що це попередження було перевірки добросовісності.
mellowsoon

35
-1 "Це означає, що гілка, яку ви збираєтеся видалити, містить комітети, які недоступні для будь-якої іншої голови інформації." Це неправильно. Попередження означає, що гілка не є доступною ні від її верхньої течії (якщо вона є), ні від поточної HEAD. Див. Манжинг git-гілки.
sleske

3
@TachyonVortex Приємне посилання. Команда git гілка -vv дійсно уточнила, що для мене відбувається.
Джейсон Массі

11
@sleske Дякую за коментар - цю відповідь справді слід відредагувати. Прикро, що це дуже схвально, оскільки головне пояснювальне речення є неправильним. У мене просто виникала ця проблема і витрачав дратівливий довгий час, намагаючись з’ясувати, у чому проблема, і це було просто, що відділення віддаленого відстеження було видалено як частину запиту на виклик, і за час, коли я витягнув зміни від головного на місцевому відділенні. Єдина «проблема» полягала в пошуку віддаленої гілки відстеження, яку було видалено (і я намагався видалити локальну гілку з тієї ж причини).
ely

3
Так, це може статися лише при спробі видалити локальну гілку, якщо ви перебуваєте на іншій гілці, ніж на тій, на якій ви були, коли ви її створили. "Коміти, недоступні жодним іншим", невірно і без зайвих зусиль!
Амальговінус

80

Як вказував Дрю Тейлор, видалення гілки з -d розглядає лише поточну ГОЛОВУ при визначенні того, чи гілка "повністю об'єднана". Він буде скаржитися , навіть якщо галузь буде об'єднана з якою - або іншій галузі. Повідомлення про помилку, безумовно, може бути зрозумілішим у цьому відношенні ... Ви можете або перевірити об'єднану гілку перед видаленням, або просто використовувати гілку git -D. Столиця -D повністю скасує чек.


2
Частина про поточну ГОЛОВУ виправила це для мене. Мій господар відрізнявся від гілки функцій, з якої я створив суперечливу гілку: D
viki.omega9

1
Для когось, хто навчається git, слово "струм" видається зайвим з "HEAD"? Немає такого поняття, як поточна ГЛАВА - ГОЛОВА за визначенням - це поточна галузь. Я щось пропускаю? Я припускаю, що ви можете сказати "поточна гілка" або "ГОЛОВА", але не "поточна голова".
Марк Лаката

Чи є спосіб змінити / налаштувати це (наприклад, чи завжди це перевіряти origin/master?) Я вважаю, що origin/masterспочатку перевірка не є надто обтяжливою, але це просто схоже на якийсь дивний потік - чому мені потрібно перевірити origin/masterлокально тільки для вас, щоб переконатися, що мої зміни там об'єднані?
Алек

15

Я спробував відповідь sehe, і це не вийшло.

Щоб знайти об'єкти, які не були об'єднані, просто скористайтеся:

git log feature-branch ^master --no-merges

14

У мене це сталося сьогодні, коли я з’єднував свою першу гілку фільмів назад у майстер. Як дехто казав у потоці в іншому місці про SO, трюк був переключенням на головний, перш ніж намагатися видалити гілку. Знову повернувшись у майстер, git із задоволенням видалив гілку без будь-яких попереджень.


7
Не схоже, що це конкретна проблема тут, але я зіткнувся з проблемою, яку ви описуєте зараз, тож спасибі!
Даніель Бакмастер

4

Git попереджає, що ви можете втратити історію, видаливши цю гілку. Незважаючи на те, що фактично не було б видалено жодних комітетів, деякі або всі комісії гілки стануть недосяжними, якщо вони також не є частиною іншої гілки.

Щоб гілка experimentбула "повністю злита" в іншу гілку, її підказка повинна бути родоначальником кінця іншої гілки, вносячи коміти в experimentпідмножину іншої гілки. Це забезпечує безпечне видалення experiment, оскільки всі його зобов'язання залишаться частиною історії сховища через іншу гілку. Вона повинна бути "повністю" об'єднана, тому що вона, можливо, вже була об'єднана кілька разів, але тепер додано комісії з моменту останнього злиття, які не містяться в іншій галузі.

Git не перевіряє будь-яку іншу гілку в сховищі; всього два:

  1. Поточна галузь (HEAD)
  2. Гілка вище за течією, якщо така є

experimentМабуть, “гілка вгору” для , як і у вашому випадку origin/experiment. Якщо experimentповністю об'єднано в поточну гілку, то Git видаляє її без скарги. Якщо це не так, але він повністю об'єднаний у своїй верхній частині гілки, то Git продовжується з попередженням, схожим на:

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

Де xxxxxxxxвказує ідентифікатор фіксації. Повністю об'єднане у своєму потоці вказує на те, що комісії experimentбули висунуті до сховища початків, так що навіть якщо ви їх втратите тут, вони, принаймні, можуть бути збережені в іншому місці.

Оскільки Git не перевіряє інші гілки, ви можете видалити гілку, оскільки ви знаєте, що вона повністю об'єднана в іншу; ви можете зробити це за -Dвказаною опцією, або спочатку перейти до цієї гілки і дозволити Git підтвердити повністю об'єднаний стан для вас.


1
Ключ "повністю об'єднаний у поточну гілку". У мене була гілка X 'від X, повністю злилася назад у X і вже видалила походження / X'. Але коли я перевірив, я отримав це попередження. Коли я перевірив, XI зміг видалити X '. Дуже дурно, я думаю.
Лоуренс Дол

2
Ця відповідь плагіатується звідси без атрибуції chimera.labs.oreilly.com/books/1230000000561/…
Марк Лаката

3

щоб побачити зміни, які не об'єднуються, я зробив це:

git checkout experiment
git merge --no-commit master

git diff --cached

Примітка. Це показує зміни master, які не входять experiment.

Не забудьте:

git merge --abort

Коли ви закінчите, шукайте.


@IgorGanapolsky Незначно, хоча зазвичай man git-resetі команд скидання git достатньо, щоб оговтатися від державних проблем.
ThorSummoner

3

Найпростіше рішення з поясненням (подвійне перевірене рішення) (раніше стикалося з проблемою)

Проблема:

1- Я не можу видалити гілку

2- У терміналі постійно відображається попереджувальне повідомлення про те, що є деякі комітети, які ще не затверджені

3- знаючи, що я перевірив майстра та гілку, і вони однакові (на сьогоднішній день)

рішення:

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

Пояснення:

коли ваша гілка підключена до віддаленої гілки вище за течією (на Github, bitbucket або будь-якому іншому), вам потрібно об'єднати (проштовхнути) її в головний майстер, і вам потрібно натиснути нові зміни (коміти) на віддалений репо (Github, bitbucket або що завгодно) з гілки,

що я зробив у своєму коді, це те, що я перейшов до головного, потім об'єднати гілку в неї (щоб переконатися, що вони однакові на вашій локальній машині), потім я знову перейшов до гілки і перемістив оновлення чи зміни у віддалений онлайн репо за допомогою "git push".

після цього я знову перейшов до майстра і спробував видалити гілку, і проблема (попереджувальне повідомлення) зникла, і гілка успішно видалена


3

Ви можете просто зрозуміти:

git log - майстер розробки ... експериментальний

--cherry параметр є синонімом для --right-only --cherry-mark --no-merges

повідомила сторінка людини git-log

корисно обмежити вихід на коміти з нашої сторони та позначити ті, які застосовані до іншої сторони роздвоєної історії, за допомогою git log --cherry вгору ... mybranch, подібно до git cherry upstream mybranch.

FYI. --cherry-pickпропускає еквівалентні коміти, але --cherry-marksне робить. Корисно знайти базу даних і примусити оновити зміни між верхнім потоком та співпрацюючим громадським відділенням


1

У мене не було гілки вище за течією на моєму локальному ґіті. Я створив локальну філію з майстра, git checkout -b mybranch. Я створив гілку з графічним інтерфейсом bitbucket на upit git і перемістив свою локальну гілку (mybranch) на цю гілку вище. Після того, як я здійснив збір git для свого локального git, щоб отримати гілку вище, за течією, я міг зробити гіт-git -d mybranch.


0

Я вважаю, що прапор --force- це те, що ви справді шукаєте. Просто використовуйте git branch -d --force <branch_name>для примусового видалення гілки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.