Как git перебазировать ветку темы из другой ветки темы?

Я ищу последовательность команд git для получения изменений, которые пытаются сделать что-то похожее на мои изменения, но не от master/main, а от другого участника ветки репо.

Обычно я бы использовал следующее при перебазировании с мастера:

git checkout TopicA
git rebase master
git push origin TopicA
git push --set-upstream origin TopicA

Настройка для репо в настоящее время:

                F"---G"---H"---I TopicB
                |
A---B---C---D---E  master
                |
                F'---G'---H'---J   TopicA
                                

Мне нужно заменить изменения o в TopicA на изменения o в TopicB.

ETA: Итак, желаемый макет:

               F"---G"---H"---I TopicB
               |
A---B---C---D--E  master
               |
               F"---G"---H"---J  TopicA
                               

Мой инстинкт состоит в том, чтобы заменить «мастер» на «ТемаБ» в моей последовательности, но это не то впечатление, которое я получил из документации по перебазированию.

Другой моей мыслью было бы создать новую ветку (TopicC), разветвленную от TopicB, а затем удалить TopicA и затем переименовать TopicC в TopicA.

Мне не нравится последний подход, потому что мне нужно адаптировать некоторые изменения из TopicA к изменениям, присутствующим в TopicB.

До сих пор я прочитал справочную страницу git-rebase(1), и я немного смущен и озадачен этим, и не хочу пробовать слишком много вещей, которые могут повредить репо или мою ветку TopicA или Ветка ТемаБ.

мне интересно, если

git rebase--onto TopicB 

будет все, что мне нужно, особенно после просмотра Объединение изменений из ветки, основанной на тематической ветке, в другую ветку темы в git, хотя я немного не понимаю, совпадают ли этот случай и мой случай.

Другой предложенный вопрос: Git rebase на другую ветку при исключении определенной ветки не показался полезным.

Я использую Git Bash для обработки моих команд git. У меня также есть TortoiseGit, но я предпочитаю Git Bash.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
0
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите, чтобы тема A была хотя бы на данный момент абсолютно идентична теме B, сделайте их одним и тем же коммитом. Предполагая, что темаA уже существует:

git switch topicA
git reset --hard topicB

Это удалит все коммиты, уже сделанные в теме A, и снова запустит тему A там, где сейчас находится тема B.

И помните, почти все непоправимо. Так что не бойтесь.

matt 06.02.2023 20:10

Я всегда использую checkout, checkout -B, но это кажется лучше. Например, он может не удалить записанный вышестоящий трекер.

konsolebox 06.02.2023 20:12

Хорошо, я понимаю, откуда вы пришли с этим ответом, но я не думаю, что это то, чего я хочу, поскольку мне нужно иметь возможность просматривать изменения, которые в настоящее время находятся в TopicA, чтобы пересматривать изменения TopicB, и, возможно, это не было ясно в моем вопросе, я выделил жирным шрифтом, где мне нужно адаптировать изменения, которые в настоящее время находятся в TopicA, в TopicB без редактирования TopicB. [Насколько я понимаю, возникнут проблемы с объединением локальной темы TopicA и удаленной темы TopicA, если одна из них будет TopicB, а другая — нет при реализации изменений A в извлеченных изменениях B]

bartCharon 06.02.2023 20:31

Я ничего не понял из этого комментария, извините. У вас могут быть копии одних и тех же коммитов в разных ветках, но это не то, что показано на диаграмме. Вот почему я спросил вас, действительно ли вы имеете в виду то, что говорите.

matt 06.02.2023 20:52

Хорошо, это мой плохой. Как я могу прояснить, что это необходимо? Я думал, что ясно выразился, сказав, что мне не нравится подход удаления ветки, переименования скопированной ветки из-за необходимости адаптировать некоторые изменения от A к B ... путем добавления коммитов к диаграммам, чтобы показать различия?

bartCharon 06.02.2023 21:02

Теперь это яснее?

bartCharon 06.02.2023 21:34

Я не вижу трудности. В моем решении обе ветки на данный момент идентичны. Ничто в моем решении не мешает вам добавить фиксацию в тему A и другую фиксацию в тему B; оттуда они могут нормально "расти". Проблема в том, что вы не понимаете, что такое ветка? Потому что, если так, я могу предложить некоторые чтения... :)

matt 06.02.2023 21:45

С другой стороны, мне кажется, что диаграммы теперь настолько отличаются от тех, какими я их помню, когда писал этот ответ, что это уже совсем не тот же вопрос.

matt 06.02.2023 22:04
Ответ принят как подходящий

Предлагаемая вами команда

git rebase --onto TopicB 

приведет к

A---B---C---D---E---F"---G"---H"---I---F'---G'---H'---J TopicA

Вы хотите

git rebase --onto H" H'

H" — последний коммит, который вы хотите взять из TopicB, а H' — последний коммит, который вам не нужен из TopicA. Запустите это, пока находитесь на ветке TopicA. Вы можете получить идентификаторы коммитов для H" and H' из TortoiseGit, как объяснено этим ответом.


Обратите внимание, что, поскольку вы беспокоитесь о повреждении своего репозитория, вы можете сначала создать новую ветку из TopicA

git branch TopicA-backup

Затем, если вы решите, что вам не нравится состояние TopicA, вы можете восстановить его с помощью

git reset TopicA-backup

и удалите резервную ветку с помощью

git branch -d TopicA-backup

Подробнее о синтаксисе команды rebase см. ответ Мэтта здесь.

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