Зафиксировать беспорядок в истории после раздавливания в master

У меня есть две ветки в репо: master и dev.

Состояние dev

- A - S1 - S2 - ... - SN - B - C

Состояние master

- A - S

Где S фиксация является результатом «сквоша и слияния» S1, ..., SN от dev до master.

Теперь, когда я сравниваю ветки, git показывает много изменений, но на самом деле это B и C.

  1. Как лучше всего синхронизировать ветки?
  2. Каков правильный рабочий процесс, чтобы избежать таких ситуаций?

как у тебя работает дифф? git diff dev..master? git diff dev...master? Можете ли вы включить это в вопрос?

eftshift0 18.03.2022 14:44

Об общих вопросах: если вы не знаете, что делаете, раздавливание и слияние не будут работать, если вы хотите иметь какую-то связь между ветвями, потому что git нет может видеть, как ветки связаны между собой в прошлом A (потому что вы не создаете общую историю между ними). Для git S — это просто ревизия поверх A с никакого отношения к S1..SN.

eftshift0 18.03.2022 14:47

Я столкнулся с проблемой, пытаясь объединить dev в main. Я сравнивать ветки как main...dev на github. Настоящие изменения в dev (помеченные как B - C в вопросах) совершает с 17 февраля (шесть последних коммитов в dev).

Stepan Zakharov 18.03.2022 15:44

@eftshift0, я могу найти коммиты (B и C), которые на самом деле являются изменениями поверх S. Можно ли «отсоединить» -B-C цепочку и объединить в main только эту цепочку?

Stepan Zakharov 18.03.2022 15:56

Вы можете выбрать B и C на main, но если dev — долгоживущая ветвь, лучше сделать обычное слияние. Сквош-слияния полезны для недолговечных ветвей, которые вы удаляете после слияния, а не для долгоживущих.

joanis 18.03.2022 17:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо .... ваши комментарии объясняют, что происходит. Таким образом, github будет использовать тройные точки при выполнении сравнения. Итак, если бы вы попробовали git diff master..dev, вы бы увидели только то, что представили B и C. А вот github будет использовать master...dev (или наоборот, неважно). Попробуйте использовать git с тройной точкой, и вы увидите, что он также будет включать изменения, внесенные S, и это потому, что когда вы делаете master...dev, git не будет просто сравнивает master и dev. Сначала он найдет последнего общего предка между ними (A), а затем git diff A..dev, который будет включать изменения, внесенные S1..SN... то же самое, если вы попытались dev...master. В конечном итоге это сделает git diff A..master (что будет включать изменения от S). И это потому, что когда вы раздавили/слили, настоящего слияния не было.

Чтобы снова заставить это работать, нужно установить dev, чтобы B и C были поверх мастера Текущий:

git rebase --onto master SN dev

Это должно дать вам то, что вы хотите, но вы потеряете историю S1~..SN. Другим способом было бы правильно объединить это... но немного взломать, чтобы вам не пришлось переделывать себя (скажем, вам приходилось решать конфликты и прочее? Я не знаю.... Итак), вы можете попробовать это:

git commit-tree -p A -p SN -m "Merging S" S^{tree}
# this will create a new _merge_ revision having A and SN as parents
# the content of the files will be the same as S
# the command will print the ID of a revision
# take that revision ID and let's call it X
# branch dev can live on the way it is.... we just need to put master where X is
git checkout master # if you are not in master already
# make sure you have no changes uncommitted as the next command will destroy those changes
git reset --hard X 
# now master is on top of X, the way it should have been

Теперь нет когда-нибудь еще раз попытается сжать/объединить если вы не знаете, что делаете.

Спасибо за продуктивный ответ и обсуждение!

Stepan Zakharov 19.03.2022 12:35

После некоторого тестирования я придумал это решение, но заметил, что мой репозиторий небольшой и поддерживается в основном мной. Так. Локально я сделал ветку dev_local из dev и перебазировал локальную ветку как git rebase -r --onto master SN dev_local (-r вариант). Затем я создал удаленную ветку dev_new из master и слил локально dev_local в dev_new. После этого я удалил dev в репо и переименовал dev_new в dev.

Stepan Zakharov 21.03.2022 10:18

Другие вопросы по теме