#git #github #merge #squash
#мерзавец #github #слияние #сквош
Вопрос:
---A---
/
---main--------
---B--- A------/
-------C-?
Выше примерно описана ситуация с репо моей команды. Функция А — это гигантская ветвь, которую я абсолютно должен оставить в покое. Я отделился от B, но периодически извлекал из него, что означает, что у меня есть все изменения A и я в курсе main в ветке C. Это также означает, что между моим первым и последним коммитом на C есть десятки коммитов плюс гигантское слияние с A. Мое репозиторий требует, чтобы каждое нажатие на main было подавлено, и я хотел бы избежать повторной проверки работы всех остальных как моей собственной, что является результатом, если я делаю git reset --soft
to прямо перед моим первым коммитом C, и git rebase -i
заставляет меня разрешать каждый отдельный конфликт, даже те, которые не являются моими собственными коммит.
Как я могу «сбросить» и отменить все мои коммиты прямо перед началом работы над C без необходимости разрешать конфликты каждой другой ветки или подтверждать каждый коммит как свой собственный?
Обновление: я не совсем уверен, как, но использование git reset --soft
коммита в середине истории C на самом деле сделало именно то, что я хотел, объединив все мои изменения в одно изменение спереди. Мне любопытно, что пошло не так в прошлый раз, когда я попробовал это сделать. Оттуда я проверил B и использовал git merge --squash C
Комментарии:
1. Один из способов извлечь изменения из ветки, чтобы затем вы могли удалить все изменения, — это сделать это : .
git merge some-branch; (finish the merge if there are conflicts... when the new merge revision is done:) git reset --soft some-branch; git commit -m "single revision, no hassle"
Но у вас какая-то запутанная история ветвей, поэтому я не совсем понимаю, что вы должны объединить в какой ветке. В любом случае, надеюсь, что трюк позволит вам двигаться вперед.2. Почему вы сделали слияния, которые вы уже сделали? От какой работы в истории
A
orB
илиmain
or зависит ваша работа? Вам придется как-то определить это, потому что это то, что должно быть сохранено при вашем обратном слиянии с main .3. что вы подразумеваете под разрешением других конфликтов? ваш график выглядит так, как будто A и B объединены в main, так что остались только ваши конфликты, верно? кроме того , что мешает вам это сделать
git merge --squash
?4. Почему A существует на B? Тем более , что похоже, что A уже объединен в
main
! И был ли B также объединен сmain
, включая в него A?5. @ian Если бы я попытался использовать
git rebase -i
и объединить все свои коммиты в один, все еще используяpick
флаг для всех остальных коммитов с момента создания C до сих пор, то в итоге мне пришлось бы разрешать конфликты для каждого «выбранного» коммита в этой операции перебазирования
Ответ №1:
Создайте новую ветку из main. Используйте git cherry-pick для получения коммитов B и C.
используйте git rebase -i HEAD ~ 4, чтобы удалить последние 4 коммита