Git - Как повторять сквош слияния с мастер веткой - PullRequest
0 голосов
/ 29 октября 2019

У меня есть две ветви:

  1. личная ветка, которую я фиксирую несколько раз в день.
  2. ветка "dev", которую я иногда хочу объединить со своей личной веткойизменяется на, но с раздавленными сообщениями о фиксации.

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

С svn это довольно легко сделать, не получая никаких конфликтов слияния.

  1. совершить несколько изменений в личной ветке
  2. Слить изменения в ветке dev, которая запишетсообщение об одиночной фиксации
  3. Слияние изменений из шага 2 обратно в персональную ветвь, но «только запись информации о слиянии», чтобы оно не сливало никакого контента.
  4. Повторите шаг 1.

Теперь ветка dev знает, что у нее есть из личной ветки, а моя личная ветка знает, что в ней есть все из основной ветки.

С помощью git я пытался использовать git merge --squash для перехода из личной ветви в ветку разработки, которая отлично работала в первый раз. Но во второй раз я получаю кучу конфликтов. Поскольку merge --squash не объединяет исходные коммиты, а создает новый коммит, который не связан с исходными коммитами, git не понимает, что я уже слил кучу контента из моей личной ветки в ветку dev.

Есть ли какое-нибудь решение этого рабочего процесса в git? Кажется, если я merge --squash ветвь, я должен сделать новую ветку в следующий раз.

Ответы [ 3 ]

2 голосов
/ 29 октября 2019

Хотите, чтобы сжатые ревизии были на стороне dev? Мол, одна версия сквоша за другой? Если это так, вы можете сделать:

git checkout --detach my-branch
git reset --soft the-previous-squash-commit
git commit -m "A new squash operation that covers revisions x, y and z"
git checkout dev
git merge -m "Merging a new squash commit" HEAD@{1} # given that I didn't have a branch set up for the squashed revision

Я думаю, что там не должно быть никаких конфликтов.

1 голос
/ 02 ноября 2019

После git merge --squash ветвь не должна использоваться для дальнейшего слияния.

Если вы настаиваете на использовании сквош-слияния, вы можете использовать этот поток:

git checkout dev
git merge --squash personal
git tag personal_1_0 personal  #optional to save old personal branch
git checkout -B personal

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

1 голос
/ 29 октября 2019

Первое, что нужно понять, это то, что способ, которым вы описываете желаемое поведение (слияние с целевой записью только 1 коммит), - это именно то, как работают слияния по умолчанию.

Причина, по которой может показаться иначе, состоит в том, что многие gitПо умолчанию команды следуют за всеми ветвями, которые входят в слияние. Вы можете изменить это, задав опцию --first-parent команде

git log --first-parent

. Как обычные слияния, так и "слияния в сквош" записывают ровно один новый коммит и помещают его в целевую ветвь (т. Е. Ветвь, извлеченная привы даете команду).

Разница в том, что слияния сквоша делают вид, что не пишут слияние, то есть родительский элемент only нового коммита - это предыдущий совет целевой ветви. У обычного слияния есть 2-й родитель - независимо от того, в какую ветвь вы сливаете - и, как вы заметили, это необходимо, если вы хотите, чтобы последующее слияние работало правильно.

Вы можете перепрыгнуть через обручи, чтобы заново изобрести колесо. Например, eftshift0 дал вам возможность в любое время заставить dev соответствовать кончику вашей другой ветви - что-то вроде слияния независимо от базы слияния, при условии, что нет нигде, кроме вашей ветви, которая когда-либо вносит вклад в dev. И если вы будете искать SO, вы даже сможете найти более общие решения.

Но то, что объединяет все эти решения, заключается в том, что они работают вопреки принципам работы git. На самом деле намного проще использовать git по назначению - то есть просто объединить вашу ветку с dev, если вы хотите перенести эти изменения, и если вы хотите вывод, который не следует использованию боковой ветви first-parent.

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