Как мне набрать sh определенный диапазон истории в git? (Эксперт) - PullRequest
1 голос
/ 05 апреля 2020

Я пытался понять это часами, но, похоже, не могу найти решение.

Итак, допустим, у меня есть такой репозиторий: AB- C -DEFG ( master) (в хранилище много слияний и тысяч коммитов, так что это просто для упрощения).

Я хочу, чтобы это выглядело так: A * -FG (master)

Где A * - сдавленный коммит коммитов A, B, C, D и E (примерно в первые 2000 коммитов).

Я пытался раздавить коммиты с помощью интерактивной перебазировки но по какой-то причине я получаю некоторые странные ошибки, такие как строки, которые уже закомментированы с #, и ошибки "не применяются", даже если я не делаю изменений. Кроме того, я получаю меньше коммитов в интерактивном ребазе, чем я считаю с git log? Почему это происходит?

В любом случае я делаю это сейчас:

git branch new-branch

git reset --hard E

git reset --soft A

git commit --amend

, в этот момент я нахожусь в A * - хранилище с одним коммитом.

Как мне go отсюда добавить коммиты -FG , существующие в new-branch в A *?

Ответы [ 2 ]

1 голос
/ 06 апреля 2020

Git - это набор инструментов.

Какие инструменты вам нужны для создания книжного шкафа или бюро? Возможно, подойдут настольная пила, молоток и гвозди, особенно если у вас есть несколько головок для настольной пилы, чтобы сделать хорошую канавку. Или вы можете использовать какой-то другой тип s aws, маршрутизатор для изготовления столярных изделий (ласточкин хвост!), Дрель для направляющих отверстий, винты и отвертку. Это было бы лучше?

Что если вы хотите какую-нибудь необычную прокрутку на передней части вашей мебели? Вы хотите ленточную пилу, лобзик, рашпили, файлы? Может быть, зубило? Не могли бы вы использовать отвертку в качестве долота?

Git - это достаточно полный набор инструментов. Вы можете использовать любой из тех, которые вам нравятся, при условии, что вы получите желаемый конечный результат. Какие из них делают это самым легким ... ну, это зависит от того, что вам кажется легким Если обрабатывать несколько коммитов, подойдет любой из различных ручных инструментов, таких как git rebase -i --root или git checkout --orphan, за которыми следуют определенные операции. Ваш примерный метод тоже подойдет: просто выберите из последних двух коммитов вишню, используя старое имя ветви, чтобы найти их, а затем отмените старое имя ветви, если оно вам больше не нужно.

Не забудьте обновить любые теги, которые вы хотите обновить, тоже. Обычно это плохая идея обновить тег, но вы в основном говорите всем, у кого есть клон исходного репозитория, выбрасывать весь их клон, в пользу этого нового, который вы создаете - ни один из коммитов не sh Идентификаторы будут совпадать на всех; новая история совершенно не связана с исходной историей.

Метод, описанный jthill в комментарии - это тоже простой способ выполнить задание: вставить трансплантат root, используя git replace в точке, где вы хотите усечь историю; затем выполните git filter-branch без фильтров (но с --all --tag-name-filter cat), чтобы закрепить трансплантат на месте. Это инструментальный подход.

0 голосов
/ 06 апреля 2020

Существует метод обрезания истории, описанный в книге Pro Git. Позволяет вам пересобрать историю позже, если вам это нужно для обвинения или пополам, и оставляет инструкции в root новой истории, как это сделать.

Усекать историю в E

  1. Pu sh F к репо истории
  2. $ echo 'Instructions to get the history...' | git commit-tree E^{tree}
    new root sha (R)
    
  3. git rebase --onto R E
    
G <- master     rebase     G* <- master
|              -------->   |
F <- history               F*
|                          |
E                          R instructions
|
D
|
.
.

Восстановление истории

  1. История выборки
  2. git replace F* F
    
G* <- master
 \_____________
               \
     replace    \
F* ------------> F <- history
|                |
R instructions   E
                 |
                 D
                 |
                 .
                 .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...