У меня есть git-репозиторий с 2 ветками: master и test.
Существуют различия между основной и тестовой ветками.
Обе ветви имеют все зафиксированные изменения.
Если я сделаю:
мастер проверки
тест на git diff
Появится экран, полный изменений, показывающий различия. Я хочу объединить изменения в тестовой ветке и так:
Git Merge Test
Но получите сообщение "Уже в курсе"
Тем не менее, проверка файлов в каждой отдельной ветви четко показывает различия.
В чем здесь проблема и как мне ее решить?
Ответы:
Сообщение «Уже обновлено» означает, что все изменения из ветви, которую вы пытаетесь объединить, уже объединены с веткой, в которой вы находитесь. Более конкретно, это означает, что ветвь, которую вы пытаетесь объединить, является родителем вашей текущей ветки . Поздравляю, это самое легкое слияние, которое ты когда-либо делал. :)
Используйте,
gitk
чтобы взглянуть на ваш репозиторий. Метка для «тестовой» ветви должна быть где-то ниже вашей «основной» ветки.Ваш филиал обновлен по отношению к своему родителю. Согласно слиянию нет никаких новых изменений в родительском с момента последнего слияния. Это не означает, что ветки одинаковы, потому что вы можете иметь множество изменений в вашей рабочей ветке, и это звучит так же, как и вы.
Изменить 10/12/2019:
Согласно Чарльзу Дрейку в комментарии к этому ответу, одним из решений этой проблемы является:
Это возвращает его к уровню «теста».
Затем сделайте:
чтобы заставить изменения вернуться к центральному репо.
источник
Это часто случается со мной, когда я знаю, что на удаленном мастере есть изменения, поэтому я пытаюсь объединить их, используя
git merge master
. Однако это не сливается с удаленным мастером, а с вашим локальным мастером.Поэтому, прежде чем делать слияние, проверьте мастер, а затем
git pull
там. Тогда вы сможете объединить новые изменения в свою ветку.источник
git fetch
что обновит главную ветку, даже если я в настоящее время нахожусь на другом. Оказывается, это не так. Спасибо! Я почти уверен, что есть опцияfetch
, позволяющая вам указать, какую ветку получить.git fetch --all
, но это только выбирает ветви, но не тянет их.git fetch --all && git merge origin/master
. Нет необходимости обновлять ваш локальный,master
чтобы объединить удаленные изменения.git merge master
и 1 сgit merge origin/master
. Я также проверилmaster
иgit pull
до обновления 2 ветки. Несмотря на то, что они использовали один и тот же контент, создание пиара между двумя ветвями показало некоторые файлы различий. Я исправилgit pull
целевую ветвь в ветке Feature, которая показала:Already up to date! Merge made by the 'recursive' strategy.
это привело к коммиту слияния без изменений, но удалил неожиданные файлы diff из PR. Любая идея, почему существует разница между объединением "эквивалентных" локальных и удаленных филиалов?Допустим, у вас есть ветка
master
со следующей историей коммитов:Теперь вы создаете тест ветки, работаете над ним и делаете 4 коммита:
master
голова указывает на D, аtest
голова указывает на H.Сообщение «Уже обновлено» появляется, когда HEAD ветви, с которой вы объединяетесь, является родителем цепочки коммитов ветви, которую вы хотите объединить. Это тот случай, здесь:
D
является родителемE
.Там нет ничего слияния с
test
кmaster
, так как ничего не изменилось поmaster
с тех пор. То, что вы хотите сделать здесь, это буквально сказать Git, чтобыmaster
голова указывала на H, поэтому ветвь master имеет следующую историю коммитов:Это работа для команды Git
reset
. Вы также хотите, чтобы рабочий каталог отражал это изменение, поэтому вы сделаете полный сброс:источник
git reset --hard
довольно радикально, может ли оно потерять коммиты? Есть ли более безопасный способ внесения этих изменений или опасностьgit reset --hard
завышена?--hard
опции, - это то, что она фактически изменяет ваш рабочий каталог, и, как следствие, вы теряете незафиксированные изменения. Лично я делаюgit status
до и после каждой запускаемой вручную команды git, чтобы убедиться, что мое репо чистое или находится в ожидаемом состоянии.--hard
выборе? Я был в этой ситуации пару раз сейчас и всегда сбрасывал без--hard
. Это работало просто отлично без риска потерять любые незафиксированные изменения.Что работает для меня, скажем, у вас есть branch1, и вы хотите объединить его в branch2.
Вы открываете командную строку git, идете в корневую папку branch2 и набираете:
Если у вас есть конфликты, вам не нужно делать git push, но сначала решите конфликты, а затем нажмите.
источник
Это должно означать, что коммиты в тесте уже объединены с мастером, но, поскольку другие коммиты выполняются на мастере,
git diff test
все равно будут иметь некоторые различия.источник
Это происходит потому, что ваша локальная копия ветви, которую вы хотите объединить, устарела. Я получил свою ветку, позвонил
MyBranch
и хочу слить ееProjectMaster
.Но я знаю, что есть изменения, которые необходимо объединить!
Вот что, когда я
git merge ProjectMaster
печатаю, git просматривает мою локальную копию этой ветви, которая может быть не текущей . Чтобы увидеть, так ли это, я сначала говорю Git проверить и проверить, не устарели ли мои ветки, и извлечь какие-либо изменения, если это так, используяfetch
. Затем я прыгаю в ветку, которую хочу объединить, чтобы посмотреть, что там происходит ...Ах-ха! Моя локальная копия устарела на 85 коммитов, это все объясняет! Теперь я
Pull
внесу изменения, которые мне не хватает, затем перепрыгиваюMyBranch
и пытаюсь снова объединиться.И теперь у меня есть еще одна проблема, чтобы исправить ...
источник
Это случилось со мной, потому что странно GIT думал, что локальный филиал отличается от удаленного филиала. Это было видно на графике ветвей: он отображал две разные ветви: remotes / origin / branch_name и branch_name.
Решение состояло в том, чтобы просто удалить локальное хранилище и повторно клонировать его из удаленного. Таким образом, GIT поймет, что remotes / origin / branch_name> и branch_name действительно одинаковы, и я могу выдать
git merge branch_name
.источник
git merge origin/master
вместо этогоgit merge master
работал для меня. Таким образом, чтобы объединить мастер в ветку функций, вы можете использовать:источник
Обязательно сначала извлеките ветку, которую хотите объединить, а затем извлеките ее (чтобы ваша локальная версия соответствовала удаленной версии).
Затем вернитесь в свою ветку, на которой вы хотите выполнить слияние, и ваш git merge должен работать.
источник
git pull
А в «ветви»случилось со мной и был отправлен на эту страницу, не уверенный, был ли у меня такой же сценарий, но мой я пытался «объединить» эту «тестовую» ветку.
Поэтому я ранее слил его, но я намеренно исключил некоторые конкретные изменения во время этого слияния, поэтому он явно имеет некоторые различия между ветвями. Затем я пытался повторно объединить его, потому что я осознал / забыл, что должен был и хотел добавить конкретное изменение / файл, который я ранее исключил, и я надеялся, что при повторном слиянии все изменения, которые я исключил ранее, будут показаны. , но я ошибся и вместо этого получаю сообщение «Уже обновлено».
Прочитав комментарий / ответ @ Bombe, он прав, и я думаю, что git ведет себя так, поэтому я сделал резервное копирование файлов в тестовой ветви, затем извлек мастер-ветку, вручную вставил в нее файлы и зафиксировал это как если бы это были новые изменения.
Я не уверен, что это правильный путь или может помочь другим людям, имеющим такую же проблему, но это дало решение моего конкретного случая.
источник
git checkout srcBranch -- path/to/file
. Можно использовать файловые глобусы тоже.checkout srcBranch -- *
а затем посмотрел на свои различияЕсли при слиянии ветви A с веткой B появляется сообщение «Уже в курсе», обратное не всегда верно. Это верно только в том случае, если ветвь B является потомком ветви A, в противном случае ветвь B просто может иметь изменения, которых нет в A.
Пример:
На этом этапе слияние от А до Б сообщает «Уже в курсе», но ветви отличаются, потому что ветвь В имеет обновления от главного, а ветвь А - нет.
источник
Столкнулся с этим сценарием, используя Git Bash.
Наш репозиторий имеет несколько ветвей, и у каждой ветви свой цикл фиксации, и слияние происходит время от времени. Old_Branch использовался как родитель для New_Branch
Old_Branch был обновлен с некоторыми изменениями, которые необходимо объединить с New_Branch
Использовал приведенную ниже команду pull без какой-либо ветви, чтобы получить все источники из всех ветвей.
Странно, но это не вытягивает все коммиты из всех веток. Думал так, как указано, показывает почти все ветки и метки.
Таким образом, чтобы исправить это проверил Old_Branch вытащил последние использования
Сейчас проверил New_Branch
Вытащил это, чтобы быть уверенным
И альт получил конфликты, чтобы исправить из Old_Branch в New_Branch :), что и ожидалось
источник
То же самое случилось со мной. Но сценарий был немного другой, у меня была основная ветка, и я вырезал release_1 (скажем) из него. Сделал некоторые изменения в ветке release_1 и объединил ее в origin. затем я сделал ssh и на удаленном сервере я снова извлекаю release_1 с помощью команды git checkout -b release_1 - которая фактически создает новую ветку release_! от мастера, а не проверять уже существующую ветку release_1 из источника. Решил проблему, убрав переключатель "-b"
источник
У меня такая же проблема. У меня были изменения в пульте, и он все еще показывал «Уже в курсе». Перемещение репозитория устранило проблему для меня.
источник
Глупо, но это может случиться. Предположим, что перед именем вашей ветки стоит ссылка на проблему (например
#91-fix-html-markup
), если вы выполните это слияние:он не будет работать так, как задумано, потому что все после
#
игнорируется, потому что#
начинается встроенный комментарий.В этом случае вы можете переименовать ветку Опуская
#
или использовать одиночные кавычки , чтобы окружить имя ветви:git merge '#91-fix-html-markup'
.источник