Я хотел бы удалить выбранные записи журнала фиксации из линейного дерева фиксации, чтобы записи не отображались в журнале фиксации.
Мое дерево коммитов выглядит примерно так:
R--A--B--C--D--E--HEAD
Я хотел бы удалить записи B и C, чтобы они не отображались в журнале фиксации, но изменения от A до D следует сохранить. Может быть, введя один коммит, чтобы B и C стали BC, а дерево выглядит так.
R--A--BC--D--E--HEAD
Или, в идеале, после A следует D напрямую. D 'представляет изменения от A к B, B к C и C к D.
R--A--D'--E--HEAD
Это возможно? если да, то как?
Это довольно новый проект, поэтому на данный момент не имеет ответвлений, поэтому также не объединяется.
rebase
может удалить старые / создать новые коммиты. Я не знаю, что означает «фиксировать записи в журнале».git log
показывает "журнал регистрации" git-scm.com/docs/git-log . И я хотел избавиться от двух записей из этого журнала - не изменений.Ответы:
git-rebase (1) делает именно это.
git awsome-ness [git rebase --interactive] содержит пример.
git-rebase
для публичных (удаленных) коммитов.commit
илиstash
ваши текущие изменения).$EDITOR
.pick
доC
иD
наsquash
. Он объединит C и D в B. Если вы хотите удалить коммит, просто удалите его строку.Если вы потерялись, введите:
источник
git rebase -i D [A]
?push -f
твои изменения. Не делай этого, если ты не работаешь один.git-rebase
руководство пользователя и машину обратного хода для поста в блоге.источник
Вот способ удалить конкретный идентификатор фиксации, зная только идентификатор фиксации, который вы хотели бы удалить.
Обратите внимание, что это на самом деле удаляет изменения, внесенные коммитом.
источник
Чтобы расширить ответ Дж. Ф. Себастьяна:
Вы можете использовать git-rebase, чтобы легко вносить всевозможные изменения в историю коммитов.
После запуска git rebase --interactive в вашем $ EDITOR вы получите следующее:
Вы можете перемещать строки, чтобы изменить порядок коммитов, и удалять строки, чтобы удалить этот коммит. Или вы можете добавить команду для объединения (сквоша) двух коммитов в один коммит (предыдущий коммит - вышеупомянутый коммит), редактировать коммиты (что было изменено) или перефразировать сообщения коммитов.
Я думаю, что выбор просто означает, что вы хотите оставить этот коммит один.
(Пример отсюда )
источник
Вы можете неинтерактивно удалять B и C в вашем примере с помощью:
или символически,
Обратите внимание, что изменения в B и C не будут в D; они исчезнут .
источник
Еще один способ,
выберите хеш, который вы хотите использовать в качестве базы, и приведенная выше команда должна сделать его интерактивным, чтобы вы могли раздавить все верхние сообщения (вам нужно оставить самое старое)
источник
Я считаю, что этот процесс намного безопаснее и проще для понимания, создав еще одну ветку из SHA1 в A и выбрав нужные изменения, чтобы убедиться, что я удовлетворен тем, как выглядит эта новая ветка. После этого легко удалить старую ветку и переименовать новую.
источник
Просто собрал ответы всех людей: (я новичок в git plz, использую его только для справки)
git rebase для удаления любых коммитов
мерзавец
git rebase -i HEAD ~ 1
Тогда экран будет выглядеть примерно так:
Здесь измените первую строку в соответствии с вашими потребностями (используя команды, перечисленные выше, например, «drop» для удаления коммита и т. Д.) После завершения редактирования нажмите «: x», чтобы сохранить и выйти из редактора (это только для редактора vim)
А потом
мерзавец
Если это показывает проблему, то вам нужно принудительно отправить изменения на удаленное устройство (ЕГО ОЧЕНЬ КРИТИЧЕСКОЕ: не вызывайте принудительно, если вы работаете в команде)
git push -f origin
источник
Вы можете использовать git cherry-pick для этого. 'cherry-pick' применит коммит к вашей ветке сейчас.
тогда делай
затем примените коммиты D и E.
Это пропустит коммиты B и C. Сказав, что может быть невозможно применить коммит D к ветви без B, так что YMMV.
источник
reset --hard
, а неrebase --hard
(что не существует)