Git - возьми код, разветви его и нажми частично - PullRequest
3 голосов
/ 02 августа 2011

У меня огромная база кода, со многими изменениями, я хочу ее разветвить и перенести в удаленную новую ветку, но чтобы перенести только наборы изменений за последний месяц, сделайте так, чтобы первое изменение месяца выглядело каксоздание хранилища, то есть меня не волнуют предыдущие изменения.Я уверен, что это возможно, просто не знаю, как это называется и как это сделать.

Ответы [ 4 ]

2 голосов
/ 02 августа 2011

Во-первых, давайте предположим, что вы нашли коммит примерно месяц назад, которым вы хотите стать новым первым коммитом, возможно, с git show HEAD@{1.month.ago} или просто просмотрев git log.Допустим, этот коммит f414f31.Предположим также, что имя ветки, над которой вы работаете, называется dev.

. Вы говорите, что хотите, чтобы это выглядело так, что более поздний коммит был первым в репозитории, поэтому реальногоСуть в том, чтобы хранить эту ветку в одном и том же хранилище - истории вообще не будет.Итак, давайте создадим новый пустой репозиторий, чтобы начать с чистого листа:

 mkdir squashed-repository
 cd squashed-repository
 git init

Теперь давайте добавим удаленный, который ссылается на ваш старый репозиторий, и извлекаем все ветви оттуда как ветви с удаленным отслеживанием.в вашем новом хранилище.

git remote add previous /home/whoever/original-repository/
git fetch previous

Теперь обновите ваше рабочее дерево и индекс из фиксации в начале месяца:

git checkout f414f31 .

(Обратите внимание на . в концеэтой строки.)

Теперь создайте коммит из состояния индекса:

git commit -m 'A new start.'

Теперь вы используете git rebase, чтобы воспроизвести все коммиты после f414f31 до ивключая previous/dev поверх вашего нового master, который в настоящее время имеет только один коммит.

git rebase --onto master b1cbc10e84bb2e2 previous/master

Возможно, вам придется исправить некоторые конфликты во время этой перезагрузки.По умолчанию git rebase будет линеаризовать историю при повторном применении изменений, внесенных этими коммитами - вы можете попросить его попытаться сохранить их с помощью -p, но это может не сработать.

Теперь master ветка в этом новом репозитории должна быть такой, как вы хотите, чтобы вы могли удалить созданный нами удаленный пульт:

git remote rm previous

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

1 голос
/ 31 августа 2012

Если я правильно получу ваш запрос , вы захотите создать новый репозиторий, начиная с определенной точки вашего текущего репозитория. Почему ?Потому что вы хотите сохранить его в чистоте и устранить каждую историю, стоящую за этим конкретным моментом.Теперь, скорее всего, хорошая идея, и вот ссылка на лучший ответ .

Ключевой термин здесь: сквош или фильтр-филиал .Вам просто нужно сначала создать резервную копию .

Прежде всего, вы запрашиваете очень конкретную вещь, которую нужно сделать в GitExtensions .Это не делает это.По правде говоря, он не делает многих вещей ... Вот почему он даже дает вам кнопку для командной строки .

Она вам понадобится.Вам понадобится настройка командной строки.Если вам не удобно это делать, то вам не повезло.Я не знаю инструментов git gui, которые будут выполнять эту работу за вас.

Ниже приведена лишь часть моего предыдущего (теперь уже унаследованного) ответа до нового комментария опа о его истинных намерениях.

Если это не так, давайте предположим, что есть веская причина для «взятия кода, его ветвления и частичного нажатия».Затем все, что вам нужно сделать, это следовать указаниям Марка, прямо в другом ответе .

Или, допустим, это для резервного копирования .Тогда это плохой способ сделать это.Вместо этого получите инструмент резервного копирования и используйте его .Просто как это .GIT не предназначен для резервного копирования и не должен использоваться для таких целей, , несмотря на многочисленные попытки .Я настоятельно рекомендую использовать CrashPlan или даже Dropbox (моя реферальная ссылка) .

1 голос
/ 03 августа 2011

Существует метод git checkout --orphan, который может создать независимую ветвь, которую можно использовать аналогичным образом, которая может сохранить некоторые нажатия клавиш.

Очевидно (?), Как подразумевают другие, вещи будутбудет проще, если вы выбрали в качестве базовой линии простую линейную часть истории.

Редактировать: шаг клонирования подробно описан в как клонировать одну ветвь в git

0 голосов
/ 02 августа 2011

Одним из возможных решений было бы использование запроса filter-branch , чтобы изолировать соответствующие коммиты (один месяц или меньше) в своем собственном репо.

Но это означает подталкивание кновый репо, не выдвигая новую ветку в существующем репо.
Если только вы не создаете непересекающуюся ветвь (новый корневой коммит), без общей истории.Смотрите « Добавление старых версий кода в git repo ».
В этом случае вы действительно добавите новую ветку на основе результата filter-branch (который служит для разделения истории репо и изоляцииизменения, которые вы хотите).

...