Git Merge сообщает "Уже в курсе", хотя есть разница - PullRequest
230 голосов
/ 11 марта 2009

У меня есть git-репозиторий с 2 ​​ветками: master и test.

Существуют различия между основной и тестовой ветками.

В обеих ветвях зафиксированы все изменения.

Если я это сделаю:

git checkout master<br>
git diff test

Появится полный экран изменений, показывающий различия. Я хочу объединить изменения в тестовой ветке и также:

git merge test

Но получите сообщение "Уже актуально"

Однако проверка файлов в каждой отдельной ветке четко показывает различия.

В чем здесь проблема и как мне ее решить?

Ответы [ 14 ]

117 голосов
/ 11 марта 2009

Сообщение «Уже обновлено» означает, что все изменения в филиале, который вы пытаетесь объединить, уже объединены с филиалом, в котором вы находитесь. В частности, это означает, что ветвь, которую вы пытаетесь объединить , является родительской для вашей текущей ветки . Поздравляю, это самое легкое слияние, которое ты когда-либо делал. :)

Используйте gitk, чтобы взглянуть на ваш репозиторий. Метка для «тестовой» ветви должна быть где-то ниже вашей «основной» ветки.

Ваш филиал обновлен относительно своего родителя. Согласно слиянию нет никаких новых изменений в родительском элементе с момента последнего слияния. Это не означает, что ветки одинаковы, потому что вы можете иметь множество изменений в вашей рабочей ветке, и это звучит так же, как и вы.

109 голосов
/ 23 ноября 2013

Это часто случается со мной, когда я знаю, что на удаленном мастере есть изменения, поэтому я пытаюсь объединить их, используя git merge master. Однако это не объединяется с удаленным мастером, а с вашим локальным мастером.

Итак, перед выполнением слияния проверьте мастер, а затем git pull. Тогда вы сможете объединить новые изменения в свою ветку.

35 голосов
/ 07 января 2015

Скажем, у вас есть ветка master со следующей историей коммитов:

A -- B -- C -- D

Теперь вы создаете тест ветки, работаете над ним и делаете 4 коммита:


                 E -- F -- G -- H
                /
A -- B -- C -- D
Голова

master указывает на D, а голова test указывает на H.

Сообщение «Уже обновлено» появляется, когда HEAD ветви, в которую вы объединяетесь, является родителем цепочки коммитов ветви, которую вы хотите объединить. Это тот случай, здесь: D является родителем E.

Нечего объединять с test до master, поскольку с master с тех пор ничего не изменилось. То, что вы хотите сделать здесь, это буквально сказать Git, чтобы голова master указывала на H, поэтому ветвь master имеет следующую историю коммитов:

A -- B -- C -- D -- E -- F -- G -- H

Это задание для команды Git reset. Вы также хотите, чтобы рабочий каталог отражал это изменение, поэтому вы выполните hard reset:

git reset --hard H
6 голосов
/ 02 ноября 2017

Что работает для меня, скажем, у вас есть branch1, и вы хотите объединить его в branch2.

Вы открываете командную строку git, идите в корневую папку branch2 и набираете:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

Если у вас есть конфликты, вам не нужно делать git push, но сначала разрешите конфликты, а затем нажмите.

6 голосов
/ 11 марта 2009

Слияние всегда происходит между текущим HEAD и одним или несколькими коммитами (обычно это заголовок ветви или тег),
и индексный файл должен соответствовать дереву коммита HEAD (то есть содержимому последнего коммита), когда он начинается.
Другими словами, git diff --cached HEAD не должен сообщать об изменениях.

Объединенный коммит уже содержится в HEAD. Это самый простой случай, который называется «Уже в курсе».

Это должно означать, что коммиты в тесте уже объединены в master, но, поскольку другие коммиты выполняются на master, git diff test все равно будет давать некоторые различия.

5 голосов
/ 19 апреля 2018

Это происходит потому, что ваша локальная копия филиала, который вы хотите объединить, устарела. У меня есть моя ветка, названная MyBranch, и я хочу объединить ее в ProjectMaster.

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

Но Я знаю , что есть изменения, которые необходимо объединить!

Вот в чем дело, когда я набираю git merge ProjectMaster, git просматривает мою локальную копию этой ветви, которая может быть не текущей . Чтобы проверить, так ли это, я сначала говорю Git проверить, не устарели ли мои ветки, и извлечь какие-либо изменения, если это так, используя, fetch. Затем я прыгаю в ветку, которую хочу объединить, чтобы посмотреть, что там происходит ...

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

Ах-ха! Моя локальная копия устарела на 85 коммитов, это все объясняет! Теперь я Pull внесу изменения, которые мне не хватает, затем прыгну на MyBranch и снова попробую объединить.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

А теперь у меня есть еще одна проблема, которую нужно исправить ...

4 голосов
/ 26 октября 2014

Это случилось со мной, потому что странно GIT думал, что локальный филиал отличается от удаленного филиала. Это было видно на графике веток: он отображал две разные ветви: remotes / origin / branch_name и branch_name.

Решением было просто удалить локальное хранилище и повторно клонировать его с удаленного компьютера. Таким образом, GIT будет понимать, что remotes / origin / branch_name> и branch_name действительно одинаковы, и я мог бы выдать git merge branch_name.

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>
3 голосов
/ 10 октября 2016

произошло со мной и было отправлено на эту страницу, не уверен, что у меня был такой же сценарий, но мой я пытался "объединить" эту "тестовую" ветку.

Итак, я ранее слил его, но я намеренно исключаю некоторые конкретные изменения во время этого слияния, поэтому он явно имеет некоторые различия между ветвями. Затем я пытался повторно объединить его, потому что я осознал / забыл, что должен был и хотел добавить конкретное изменение / файл, который я ранее исключил, и я надеялся, что если я сделаю объединение снова, то покажет все изменения, которые я исключил ранее , но я ошибся и вместо этого получаю сообщение «Уже обновлено».

Прочитав комментарий / ответ @ Bombe, он прав, и я думаю, что git ведет себя так, поэтому я сделал резервное копирование файлов в тестовой ветви, затем извлек мастер-ветку и вручную вставил файлы в и зафиксируйте, как если бы это были новые изменения.

Я не уверен, что это правильный путь или может помочь другим, имеющим такую ​​же проблему, но это дало решение моего конкретного случая.

2 голосов
/ 18 июля 2018

git merge origin/master вместо git merge master работал для меня. Таким образом, чтобы объединить мастер в ветку функций, вы можете использовать:

git checkout feature_branch
git merge origin/master
2 голосов
/ 16 апреля 2015

Столкнулся с этим сценарием, используя Git Bash.

Наш репозиторий имеет несколько ветвей, и у каждой ветви свой цикл фиксации, и слияние происходит время от времени. Old_Branch использовался как родитель для New_Branch

Old_Branch был обновлен с некоторыми изменениями, которые необходимо объединить с New_Branch

Использовал приведенную ниже команду pull без какой-либо ветви, чтобы получить все источники из всех ветвей.

git pull origin

Странно, но это не вытягивает все коммиты из всех веток. Думал так, как указано, показывает почти все ветки и метки.

Итак, чтобы исправить это, проверил, что Old_Branch вытащил последнюю версию, используя

git checkout Old_Branch

git pull origin Old_Branch

Теперь проверено New_Branch

git checkout New_Branch

потянул, чтобы быть уверенным

git pull origin New_Branch

git merge Old_Branch

И альт получил конфликты для исправления от Old_Branch к New_Branch :), что и ожидалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...