Сохранение ранней истории коммитов при подготовке к первоначальному выпуску - PullRequest
0 голосов
/ 04 октября 2019

Допустим, я начинаю новый проект и отслеживаю его в git. Я добавляю Feature 1, а затем фиксирую. Затем я добавляю Feature 2 и фиксирую. Наконец, после добавления Feature 3 я решаю, что хочу выпустить этот проект. Я создаю третий коммит с сообщением Initial Release. Я переименую текущую ветку master в dev. Теперь я хочу создать НОВУЮ основную ветку, история которой показывает ТОЛЬКО коммит Initial Release.

Я мог бы сделать

git checkout dev
git rebase -i --root

Это привело бы меня к одному коммиту, с котороголегко начать ребазинг на мою новую ветку master. Но что, если я хочу сохранить свои первые два коммита в ветке dev? Я хочу иметь возможность оглянуться на них, чтобы увидеть, как я создал приложение, но я хочу, чтобы ветка master имела чистую историю, которая НАЧИНАЕТСЯ с фиксации Initial Release.

Возможно ли это? Или моя ветка master должна показывать каждого общего предка вплоть до первого коммита?

Ответы [ 3 ]

1 голос
/ 05 октября 2019

Я бы сделал это так:

git checkout feature3 # or the revision that says "initial release"
git checkout -b new-master --orphan # new master, orphan, everything will be in index, no parent revisions
git commit -m "Initial release"
# if you like the result
git branch -f master # point master where we are
git checkout master
git branch -d new-master
1 голос
/ 04 октября 2019

Вы можете создать любой график коммитов с любым содержимым, которое вы хотите. Начните с этого пути:

git checkout -B dev               # dev is the old master, you already did this
git branch -f master $(           # switch master to a new commit I'm, about to build ...
        git commit-tree -m 'Initial release' dev:  # with the wanted content & message
        )

, который доставит вас от

A---B---C---D    master

до

A---B---C---D    dev

           D'    master

, где D 'содержит содержимое D.

Если вам не нужно объединяться из master в dev, если это ветвь истории релизов только для публикации, все готово. В следующий раз добавьте -p master в дерево коммитов, чтобы записать происхождение.

Если вы хотите объединиться с какой-либо разработкой, вам нужно дополнительно предоставить базу слияния из основной истории в devистория, я, вероятно, сделал бы это, переписав подсказку dev, чтобы включить нового предка, после создания нового мастер-наконечника

git checkout -B dev $(  # add a parent, keep existing message and tree:
        git show -s --pretty=%B dev | git commit-tree -p dev^ -p master dev:
        )

, выдающего

...C---D   dev
      /
    D'     master

Как всегда,при рефакторинге подобных вещей можно сэкономить душевную боль, если вы будете следить за тем, у кого есть ссылки на существующие коммиты и имена веток, первый шаг выше ничего не оставляет, но любой другой репо, имеющий ссылку origin/master в вашей истории, будетувидеть его на смену этой совершенно новой истории. Это не плохой сюрприз для всех, если, конечно, это так. Второй шаг, предоставляя себе базу для слияния, чтобы люди могли вставлять исправления и прочее, отказывается от существующего dev (оригинального master) совета, также не проблема, если вы делаете это как ритуал предварительной публикации, чтобы никто больше не виделстарая версия с одним родителем.

0 голосов
/ 05 октября 2019

(в основной ветке):

git checkout -b dev    #create new dev branch at master
git branch -D master   #delete master branch
git checkout --orphan master   #create new orphan master branch and switch to it
git commit             #commit current changes (which should be the "Initial Release")

Теперь у вас есть один коммит на мастере, и все оригинальные коммиты на dev

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