Я ищу последовательность команд 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.
Если вы хотите, чтобы тема A была хотя бы на данный момент абсолютно идентична теме B, сделайте их одним и тем же коммитом. Предполагая, что темаA уже существует:
git switch topicA
git reset --hard topicB
Это удалит все коммиты, уже сделанные в теме A, и снова запустит тему A там, где сейчас находится тема B.
Я всегда использую checkout, checkout -B
, но это кажется лучше. Например, он может не удалить записанный вышестоящий трекер.
Хорошо, я понимаю, откуда вы пришли с этим ответом, но я не думаю, что это то, чего я хочу, поскольку мне нужно иметь возможность просматривать изменения, которые в настоящее время находятся в TopicA, чтобы пересматривать изменения TopicB, и, возможно, это не было ясно в моем вопросе, я выделил жирным шрифтом, где мне нужно адаптировать изменения, которые в настоящее время находятся в TopicA, в TopicB без редактирования TopicB. [Насколько я понимаю, возникнут проблемы с объединением локальной темы TopicA и удаленной темы TopicA, если одна из них будет TopicB, а другая — нет при реализации изменений A в извлеченных изменениях B]
Я ничего не понял из этого комментария, извините. У вас могут быть копии одних и тех же коммитов в разных ветках, но это не то, что показано на диаграмме. Вот почему я спросил вас, действительно ли вы имеете в виду то, что говорите.
Хорошо, это мой плохой. Как я могу прояснить, что это необходимо? Я думал, что ясно выразился, сказав, что мне не нравится подход удаления ветки, переименования скопированной ветки из-за необходимости адаптировать некоторые изменения от A к B ... путем добавления коммитов к диаграммам, чтобы показать различия?
Теперь это яснее?
Я не вижу трудности. В моем решении обе ветки на данный момент идентичны. Ничто в моем решении не мешает вам добавить фиксацию в тему A и другую фиксацию в тему B; оттуда они могут нормально "расти". Проблема в том, что вы не понимаете, что такое ветка? Потому что, если так, я могу предложить некоторые чтения... :)
С другой стороны, мне кажется, что диаграммы теперь настолько отличаются от тех, какими я их помню, когда писал этот ответ, что это уже совсем не тот же вопрос.
Предлагаемая вами команда
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
см. ответ Мэтта здесь.
И помните, почти все непоправимо. Так что не бойтесь.