Для справки, я полагаю, что вы можете "жестко вырезать" коммиты из вашей текущей ветки не только с помощью git reset --hard, но и с помощью следующей команды:
git checkout -B <branch-name> <SHA>
Фактически, еслиВы не заботитесь о проверке, вы можете установить ветку на что хотите:
git branch -f <branch-name> <SHA>
Это будет программный способ удаления коммитов из ветки, например, для копирования новойфиксирует его (используя rebase).
Предположим, у вас есть ветка, которая отключена от мастера, потому что вы взяли источники из какого-то другого места и сбросили его в ветку.
Теперь у вас естьветвь, в которой вы применили изменения, давайте назовем ее «темой».
Теперь вы создадите дубликат вашей ветки тем и затем перенесете ее на дамп исходного кода, который находится в ветке «dump»:
git branch topic_duplicate topic
git rebase --onto dump master topic_duplicate
Теперь ваши изменения повторно применяются в ветке topic_duplicate, основываясь на начальной точке "dump", но только на тех фиксациях, которые произошли после "master".Таким образом, ваши изменения, так как master теперь повторно применяются поверх «dump», но результат заканчивается в «topic_duplicate».
Затем вы можете заменить «dump» на «topic_duplicate», выполнив:
git branch -f dump topic_duplicate
git branch -D topic_duplicate
Или с помощью
git branch -M topic_duplicate dump
Или просто путем сброса дампа
git branch -D dump
Возможно, вы также можете просто выбрать вишню после очистки текущего "topic_duplicate".
Я пытаюсь сказать, что если вы хотите обновить текущую «дублирующую» ветку на основе другого предка, вы должны сначала удалить ранее «выбранные вишни» коммиты, выполнив git reset --hard <last-commit-to-retain>
или git branch -f topic_duplicate <last-commit-to-retain>
, а затем скопировавдругие коммиты (из основной ветки темы) перебазируют или выбирают вишню.
Перебазирование работает только на ветку, в которой уже есть коммиты, поэтому вам нужно дублировать ветку темы каждый раз, когда вы хотите сделатьчто.
Cherrypicking гораздо проще:
git cherry-pick master..topic
Таким образом, вся последовательность будет сводиться к:
git reset --hard <latest-commit-to-keep>
git cherry-pick master..topic
Когда ваша ветвь-дубликат темы имеет bEen проверил.Это позволит удалить ранее выбранные коммиты из текущего дубликата и просто повторно применить все изменения, происходящие в «топике» поверх вашего текущего «дампа» (другого предка).Кажется, это достаточно удобный способ, чтобы основывать свою разработку на «реальном» ведущем мастере, используя другой «нижестоящий» мастер, чтобы проверить, применимы ли ваши локальные изменения к этому.В качестве альтернативы вы можете просто сгенерировать diff и затем применить его за пределами любого исходного дерева Git.Но таким образом вы можете сохранить обновленную модифицированную (исправленную) версию, основанную на версии вашего дистрибутива, в то время как ваша фактическая разработка идет вразрез с реальным основным выпуском.
Так что просто продемонстрируйте:
- Сброс приведет к тому, что ваша ветвь будет указывать на другой коммит (--hard также проверяет предыдущий коммит, --soft сохраняет добавленные файлы в индексе (который будет зафиксирован при повторном коммите) и значение по умолчанию (--mixed) не будет извлекать предыдущий коммит (стирая ваши локальные изменения), но очистит индекс (еще ничего не было добавлено для коммита)
- вы можете просто заставить ветку указывать на другой коммит
- вы можете сделать это одновременно с немедленной проверкой этого коммита
- перебазирование работает с коммитами, присутствующими в вашей текущей ветке
- cherry-picking означает копирование из другой ветки
Надеюсь, это кому-нибудь поможет. Я хотел переписать это, но сейчас не могу справиться. С уважением.