Git сплит коммит перед веткой - PullRequest
2 голосов
/ 21 января 2020

Предположим, у вас есть следующая история:

         D———G feature1.1
        /
...A-B-C-E-F  feature1

Теперь я хочу разделить B на два коммита, чтобы получить:

             D———G feature1.1
            /
...A-B1-B2-C-E-F  feature1

Вы не можете просто сделать git rebase -i ... и затем выберите edit, потому что вы получите

     B-C-D-G feature1.1
    /
...A-B1-B2-C'-E'-F'  feature1

, но это быстро исправлено с помощью git rebase --onto C 'C feature1.1.

Теперь для более конкретного c варианта использования. Как бы вы это сделали, если вместо feature1 была ваша основная ветвь, A - ваш начальный коммит, и вы хотите разделить A. Та же техника не работает, потому что после ребазинга у них больше нет общей истории.

1 Ответ

1 голос
/ 21 января 2020

Основная хирургия предков - это git filter-branch территория, с любыми инструментами, удобными для внесения любых изменений в контент. Иногда это проще всего сделать «пока вы там», во фрагменте ветки фильтра, но здесь проще настроить контент заранее и просто использовать ветвь фильтра для переписывания его предков. Материал, который вы можете сделать без переписывания существующего предка, это сделать A---B1---B2, для начала выполните

git checkout B
git reset A

, и ваше рабочее дерево теперь является содержимым B, ваш индекс - содержимым A, и HEAD, т. е. родитель вашего следующего коммита A, поэтому добавьте контент B1, однако наиболее удобно:

git add files whose changes all belong in B1
git add --patch files whose changes partially belong in B1
git reset --patch any hunks you added by mistake
git commit   # this makes B1
git add .    # everything that remains belongs in B2, so add everything
git commit   # this makes B2

, и теперь единственное, что осталось, - это переписать родословную, никаких изменений контента не требуется. Выполните только локальную перемонтацию, затем используйте git filter-branch, чтобы переписать локальную историю, чтобы переписать всю переписанную историю, которая зависит от нее:

git replace --graft C B2
git filter-branch -- --all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...