Как сделать чистую ветку с одним коммитом - PullRequest
0 голосов
/ 17 июня 2019

У меня следующая структура git: enter image description here

Красная ветвь - это основная ветвь, тогда существует множество более мелких ветвей и коммитов.

Я хотел бы сделать следующее => enter image description here

Некоторые коммиты в другой ветке (кроме красной) именования и прочее не годятся.

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

Это как будто я выталкиваю все вещи с нуляна красной ветке, не редактируя его раньше.

Я знаю, что это возможно, но я не помню, как.

Спасибо

Ответы [ 2 ]

4 голосов
/ 17 июня 2019

Я не совсем уверен, что вы хотите сделать, но когда я читаю ваш вопрос, это один из следующих случаев:

  • Вы хотите включить все изменения от blue и green до red в отдельном коммите?
    • Когда на ветке red, используйте git merge --squash green. Это объединит все изменения, сделанные в ветке blue и green, но будет только один коммит, который вы можете назвать по своему усмотрению (то есть v0.1).
  • Хотите ли вы включить изменения из одного коммита без слияния других изменений из blue и green?
    • Создать новую ветку из red (при извлечении red используйте git checkout -b newBranch)
    • Cherry - выбрать коммит, изменения которого вы хотите включить (git cherry-pick <commit-id>)
    • Объединить новую ветку с red (оформить заказ red, затем git merge newBranch). Вуаля: в ветку red будут добавлены только изменения из выбранного вишнёвого коммита.
2 голосов
/ 17 июня 2019

Надеюсь, я правильно понял ваш вопрос:

Некоторые коммиты в другой ветке (кроме красной) с именами и прочим не годятся.

Итак, я предполагаю, что красная ветка хороша, а некоторые коммиты на зеленой ветке хороши, а некоторые плохи. То же самое касается других (не красных) веток. Ветви относительно короткие (имеют 1-2-3 коммита, но не сотни).

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

Хорошо, сначала создайте ветку из красной ветки, что хорошо:

git checkout red-branch

git checkout -b my-clean-branch

Теперь, если вы войдете в эту ветку (например, git merge green), my-clean-branch будет также загрязнен плохими коммитами. Таким образом, вы можете cherry-pick только хорошие коммиты из зеленой ветки:

git log green-branch 
// identify good commits, lets say, commits 123 and 456 are good, and commit 789 is not

// while being on my-clean-branch
git cherry-pick 123
git cherry-pick 456 // or in one command as you with

На этом этапе убедитесь, что my-clean-branch подходит для продолжения. Вы можете пометить его как v1.0, если хотите (проверьте команду git tag)

Это как будто я помещаю весь материал с нуля на красную ветку, не редактируя его раньше.

Предполагая, что my-clean-branch это хорошо, вы можете просто внести изменения в red-branch:

git checkout red-branch
git merge my-clean-branch // or rebase if you want
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...