Git: как обновить ветку сделанную слиянием базы - PullRequest
0 голосов
/ 22 мая 2018

Предположим, что у меня есть 2 ветви: v1.0 и development.Наш процесс заключается в создании локальной ветки с использованием:

git merge-base v1.0 development
git checkout <commit-hash>
git checkout -b <new-branch-name>

Предположим, что один из моих коллег следовал тому же процессу и недавно внес изменения:

git checkout v1.0
git merge <his-local-branch-name>
git push
git checkout development
git merge <his-local-branch-name>
git push

Мой вопрос, как я могулегко обновить мою локальную ветвь с его недавними изменениями?

Что я сделал, так это создал другую ветку с недавними изменениями с использованием merge-base и слил ее с моими изменениями, сделанными локально.

Но существует ли какой-то простой способ?Я думал о чем-то вроде git merge <last-commit-hash>, но это порождает множество конфликтов.

Ответы [ 2 ]

0 голосов
/ 19 мая 2019

Что я сделал, так это создал еще одну ветку с последними изменениями, используя merge-base, и слил ее с моими изменениями, сделанными локально.

Это один подход ( Марк иллюстрирует подход перебазирования в своем ответе )

Но не так, с Git 2.22 (Q22019), вам не нужно делать:

git merge-base v1.0 development
git checkout <commit-hash>
git checkout -b <new-branch-name>

Вместо этого вы должны сделать:

git checkout -b <new-branch-name> v1.0...development

См. commit e3d6539 , commit 27434bf (27 апреля 2019 г.) Дентон Лю (Denton-L) .
Помощник: Джунио С Хамано (gitster) .
(Объединено с Junio ​​C Hamano - gitster - в коммит 4ac8371 , 19 мая 2019 г.)

branch:make create_branch принять базовую версию слияния rev

Когда мы запустим что-то вроде

$ git checkout -b test master...

, произойдет сбой с сообщением

fatal: Not a valid object name: 'master...'.

Это было вызвано вызовомв create_branch, где start_name, как ожидается, будет действительной версией.
Однако, git checkout позволяет ветви быть действительной базой слияния rev (то есть с "...")так что можно было передать недопустимую версию.

Заставить create_branch принять базовую версию слияния, чтобы этоcase не выдает ошибку.

В качестве побочного эффекта научите git-branch также обрабатывать базовые обороты слияния.

0 голосов
/ 22 мая 2018

Хорошо ... звучит так, что development - это долгоживущая ветвь, представляющая предыдущий выпуск (и) - очень похоже на master в gitflow.

И похоже, что v1.0 - этодолгоживущая ветвь, в которой вы собираете следующий выпуск, очень похоже на develop в gitflow.

И данная локальная ветвь может быть похожа на ветвь функций (в этом случае вы объедините ее с v1.0) или как исправление (в этом случае вы объедините его с v1.0 и development).Странно то, что вы, кажется, всегда создаете локальные ветви, чтобы они могли быть объединены с обоими.(Так что вы не знаете, во время создания ветки, будете ли вы сливаться с development? Потому что, если это не так, каждая ветвь «запускается заново» на базе слияния кажется, что она имеет некоторые ненужные затраты на разрешение слияния... но я отвлекся.)

Давайте рассмотрим ваш сценарий с картинками.Вы начинаете с

A -- x <--(development)
 \
  Z <--(v1.0)

и создаете локальную ветку

A -- x <--(development)
|\
| Z <--(v1.0)
 \
  B -- C <--(feature)

, а ваш коллега создает локальную ветку

A -- x <--(development)
|\
| x -- O <--(hotfix)
|\
| Z <--(v1.0)
 \
  B -- C <--(feature)

(потерпите меня здесь; яПоймите, что никогда не может быть одного репо со всеми этими ветками, но давайте все равно посмотрим на «большую картину» ...)

Так что ваш коллега сливается с обеими долгоживущими ветвями

A -- x -- M <--(development)
|\       /
| x --- O <--(hotfix)
|\       \
| Z ----- M <--(v1.0)
 \
  B -- C <--(feature)

Обратите внимание, что с этого момента O является базой слияния для development и v1.0.Но ваша ветвь была создана, когда база слияния была A, поэтому теперь мы подошли к вашему вопросу: как получить hotfix в вашу ветку.

К настоящему времени hotfix является неотъемлемой частью общей историитак что вы, вероятно, не хотите делать что-либо, что переписывает и / или дублирует изменения из его коммитов.

Скорее всего, вы не хотите сливать v1.0 в свою ветку, потому что микширование Z вкажется, что ваша ветвь работает против структуры создания ветви на базе слияния.

Так что вы действительно просто хотите объединить O в свою ветку.Теперь давайте немного переключимся и посмотрим, как может выглядеть ваше локальное репо, если я буду понимать ваш термин «локальные филиалы» буквально (то есть у вас нет ветви hotfix):

A -- x -- M <--(development)
|\       /
| x --- O
|\       \
| Z ----- M <--(v1.0)
 \
  B -- C <--(feature)

Теперь, учитывая, что feature является также локальным (присутствует только в вашем репо), один из вариантов - перенести его в новую базу слияния - и похоже, что он остается в духе вашего рабочего процесса.

git rebase $(git merge-base development v1.0) feature

даст вам

A -- x -- M <--(development)
|\       /
| x --- O -- B' -- C' <--(feature)
 \       \
  Z ----- M <--(v1.0)

В этот момент B' и C' являются непроверенными состояниями кода.В идеале вы должны протестировать оба из них и решить любые проблемы (хотя, если в B' есть проблемы, которые легче сказать, чем сделать), чтобы у вас все еще была чистая история.

Другой вариант, которыйпозволит избежать проблемы «непроверенных коммитов», но создать более «грязную» (хотя и, возможно, более точную) историю - это просто слить базу слияния в вашу ветку.

git checkout feature
git merge $(git merge-base v1.0 development)

, которая дает вам что-то вроде

A -- x -- M <--(development)
|\       /
| x --- O -----------
|\       \           \
| Z ----- M <--(v1.0) \
 \                     \
  B -- C -------------- M <--(feature)

Что, после долгих слов сказать «почему», означает, что мы сделали по сути то, что вы уже сделали, за исключением пропуска этапа создания ветви для слияния, поскольку мы можем просто обратиться к базе слияниянапрямую.

И это имеет смысл.Вы уже выяснили, какие изменения нужно объединить с вашей веткой - вы на самом деле не хотите изменить коммит, который вы объединяете.Поэтому лучшее, что мы можем сделать, - это найти более простой способ обратиться к этим изменениям.

...