Могу ли я удалить историю и сохранить последние изменения в git? - PullRequest
1 голос
/ 02 ноября 2019

У меня есть 4-летнее хранилище, которое реально не требует больше года истории.

В основном предполагаю, что хеши моего дерева выглядят как I, и я хочу, логически, II:

I)   0-1-2-3-4-5-6-7-8-9-a-b-c-d-e-f
II)  a-b-c-d-e-f

Я видел совет обрезать историю примерно так:

git log --after="2018-12-28" --until="2018-12-31" #finding a good quiet period
git checkout --orphan trunc 4bf6824d4
git commit -m "Truncated history to 2019-12-29: a low activity point"
git fetch --all
git rebase --onto trunc 4bf6824d4 upstream/master
#OR
git cherry-pick 4bf6824d4..upstream/master

Затем удалите вышестоящий мастер и замените его на trunc, переименованный в мастер. Или заставить толкнуть. Я запустил этот сценарий, и вместо этого получился III, но я подумал, что могу хотя бы приблизительно получить IV.

III) g-h-i-j-k-l (h-l are b'-c'-d'-e'-f')
IV)  g-b-c-d-e-f (like editing the parent of b only)

Разве это невозможно, потому что вы не можете редактировать какую-либо линию SHA?
Как я могу сделать так, чтобы все выполняемые работы, вероятно, слились с веткой замены ... Им всем придется вытянуть новую ветку и переназначить на нее диапазон своей работы?
Кроме того, почемуперебазирование дает мне несколько моментов, когда возникали конфликты, и мне приходилось сливаться с theirs?

1 Ответ

2 голосов
/ 02 ноября 2019

Короткий ответ - нет.

В разделе База данных объектов в Руководстве пользователя поясняется.

Фактически,вся информация, необходимая для представления истории проекта, хранится в объектах с такими именами. В каждом случае имя вычисляется путем взятия SHA-1 хеша содержимого объекта. Хэш SHA-1 - это криптографическая хеш-функция…

  • Объект «коммит» связывает такие иерархии каталогов вместе в направленный ациклический граф ревизий - каждый коммит содержит имя объекта ровно одного дерева, обозначающегоиерархия каталогов во время фиксации. Кроме того, коммит относится к «родительским» объектам коммитов, которые описывают историю того, как мы пришли к этой иерархии каталогов.

Путем изменения a коммита на корневой коммит, т.е. , изменяя его родителя с 9 на ноль, вы обязательно и неизбежно меняете его хеш или имя объекта, которое является функцией дерева коммитов, родителя или родителей, автора, коммиттера и сообщения коммита, как определенов разделе Commit Object Руководства пользователя Git.

Как видите, фиксация определяется следующим образом:

  • aдерево: имя SHA-1 объекта дерева (как определено ниже), представляющее содержимое каталога в определенный момент времени.

  • parent (s): SHA-1 имя (я) некоторого числа коммитов, которые представляют непосредственно предыдущий шаг (и) в истории проекта. Пример выше имеет одного родителя;Коммиты слияния могут иметь более одного. Коммит без родителей называется «корневым» коммитом и представляет собой первоначальную ревизию проекта. Каждый проект должен иметь как минимум один корень. Проект также может иметь несколько корней, хотя это не является распространенным (или обязательно хорошей идеей).

  • автор: Имя лица, ответственного за это изменение, вместе с егоdate.

  • коммиттер: имя человека, который фактически создал коммит, с датой его выполнения. Это может отличаться от автора, например, если автор был кем-то, кто написал патч и отправил его по электронной почте человеку, который использовал его для создания коммита.

  • комментарий, описывающий этоcommit.

Изменение a на a' опрокидывает первое домино в цепочке, которая заставляет b', c', d', e'и f', потому что родитель каждого из них изменился.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...