1

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

Подробнее:

В мастере находится один файл index.php в котором всего лишь одна функция index().Так же есть ветка в которой работаю в ней тот же файл index.php но содержит 3 функции. one() two() tree(). После этого я хочу сделать merge мастера в текущую ветку.После данного слияния все функции в рабочей ветке затираются и остается только функция index().

Nick Volynkin
  • 34,094
quaresma89
  • 2,207
  • 2
    Опишите поэтапно порядок ваших действий, при котором ваш код оказывается затёрт. –  Aug 15 '15 at 20:25
  • Делаю сперва Pull на локальный мастер,после чего переключаюсь на другую ветку в которой работаю и делаю слияение мастера в текущую ветку,после чего в ветке остается только код мастера,все над чем работал затирается. – quaresma89 Aug 15 '15 at 21:35
  • Я так понимаю, вы делаете это через SourceTree? Если сделать это из командной строки, git выведет отчёт, что он сделал и почему. Да, я всё ещё не понимаю, что именно вы сделали и как так вышло. Приложите эту последовательность в вопрос. По возможности, и граф последних коммитов. И совсем в идеале, отчёт о тех же действиях в командной строке. –  Aug 15 '15 at 21:53
  • Да работаю через SourTree.Крастко для примера попытаюсь объяснить что и как.В мастере находится один файл index.php в котором всего лишь одна функция index().Так же есть ветка в которой работаю в ней тот же файл index.php но содержит 3 функции. one() two() tree(). После этого я хочу сделать merge мастера в текущую ветку.После данного слияния все функции в рабочей ветке затираются и остается только функция index(). – quaresma89 Aug 15 '15 at 22:35
  • Всю связанную с вопросом информацию дописывайте в вопрос. Вы сейчас не дали никакой новой информации. Как расположены коммиты от точки ветвления? –  Aug 16 '15 at 12:57
  • 2
  • Лучше всего сделать слияние вручную, через командную строку. Еще добавьте в вопрос результат, выводимый командой git log --oneline --graph --all --decorate – Nick Volynkin Aug 16 '15 at 18:40
  • @quaresma89 эти функции one/two/three были дописаны вами в вашей ветке? если нет - то может быть кто-то удалил их в master, мерж проходит корректно, и вливает изменения из мастера в вашу ветку (включая удаление функций) –  Aug 16 '15 at 18:42
  • слишком длинная переписка :) // cc @quaresma89 –  Aug 16 '15 at 18:45

3 Answers3

1

Допустим, вы работаете в ветке dev. Также у вас есть локальная ветка master и удалённая ветка origin/master. И допустим, удалённый репозиторий подключён как origin (так обычно бывает).

Тогда надо сделать так:

git checkout master
git pull origin master
git checkout dev
git merge master

Если после этого в вашей ветке dev остался файл в том виде, в котором он у вас в master-е, то, вероятно, мастер «ушёл дальше», опережает вашу рабочую ветку и в master эти функции (one() и two()) были удалены теми коммитами, которых нет в dev.

Nick Volynkin
  • 34,094
installero
  • 1,076
  • Так и есть я из мастера удалил эти функции чтобы посмотреть каков будет результат! – quaresma89 Aug 16 '15 at 20:57
  • Пояивился еще вопрос.Допустим я сделал слияние мастера в рабочую ветку,и решил удалить все функции и слить еще раз в нее мастер,почему при повтором слиянии функции которые есть в мастере не переносятся в рабочую ветку? – quaresma89 Aug 16 '15 at 21:08
  • @quaresma89: Пожалуйста, задайте этот вопрос как новый вопрос – Nick Volynkin Aug 16 '15 at 21:27
  • @quaresma89: ответ я уже знаю, пока его как раз напишу ) Ответьте мне, как опубликуете вопрос ) – Nick Volynkin Aug 16 '15 at 21:27
  • Опубликовал. Скинуть ссылку на вопрос или как поступить? – quaresma89 Aug 16 '15 at 21:32
1

Прошел весь этот путь на Atlassian Sourcetree с тестовым репозиторием.

https://github.com/NickVolynkin/git-merge-test

Вот у нас есть две ветки, обе расходятся с момента коммита. В обеих изменен один и тот же файл (в данном случае это index.php).

введите сюда описание изображения

Выбираем ту ветку в которую будем мерджить и жмем кнопочку.

введите сюда описание изображения

Появляется диалог, в котором нужно выбрать коммит, который мы будем мерджить в нашу ветку. Выбираем master.

введите сюда описание изображения

Появляется сообщение о том, что есть конфликты слияния и нам придется их разрешать. Если у вас такого сообщения не было — это подтверждает гипотезу PashaPash о том, что функции one() two() three() были удалены в одном из коммитов, прямым предком которых является ваша рабочая ветка.

введите сюда описание изображения

Теперь конфликты нужно разрешить, вручную поправив документ. Подробнее: https://ru.stackoverflow.com/a/437458/181472

Когда они разрешены, починенный файл нужно добавить кнопкой ADD:

введите сюда описание изображения

А потом сделать коммит.

введите сюда описание изображения

Вам предложат написать сообщение коммита.

введите сюда описание изображения

Готово, слияние выполнено.

введите сюда описание изображения

Nick Volynkin
  • 34,094
0

http://pcottle.github.io/learnGitBranching/ очень наглядно, думаю многие вопросы с git исчезнут

Anser
  • 174
  • Уже много статей читал и вроде разобрался,но на практике вот такое происходит. – quaresma89 Aug 15 '15 at 21:36