Как я могу перебазироваться в git без разрешения других конфликтов коммитов или удалить все мои коммиты, оставив нетронутыми чужие коммиты?

#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 or B или 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 коммита