Как повторно применить коммиты поверх несвязанной ветки? - PullRequest
10 голосов
/ 01 февраля 2012

У меня есть простой репозиторий с линейной историей коммитов, например:

[A] -> [B] -> [C] -> [D] -> [E] ...

Мне нужно удалить коммиты A и B, поэтому я решил создать новый репозиторий и хотел бы получить что-то вроде:

[X] -> [C] -> [D] -> [E] ...

Итак, я создал новый репозиторий, создал вручную коммит X, в котором хранятся соответствующие данные из A и B, и теперь мне нужна команда, которая доставит коммиты C, D, E и т. Д. Из исходного репозитория и поместит его поверх. моего нового коммита X.

Как это сделать?

Редактировать: У меня есть две проблемы с предложенным методом выбора вишни:

  1. Переданные коммиты потеряли свои даты. Есть ли способ сохранить даты коммитов?
  2. Когда я выбрал мастер из исходного репозитория (и этот удаленный мастер не имеет ничего общего с новым репозиторием), у меня возникают проблемы при удалении этих извлеченных коммитов. Когда я делаю git branch -D myoriginalrepo/master, он говорит, что такой ветки не существует, хотя я ясно вижу эти коммиты в своем инструменте с графическим интерфейсом.

Ответы [ 3 ]

16 голосов
/ 01 февраля 2012

Не уверен, почему вам нужна дата фиксации, чтобы остаться прежней, но здесь идет речь:

git rebase B E --onto X --committer-date-is-author-date

Если B..E не находятся в том же хранилище, что и X (так как они могут быть если вы создаете новый старт на месте ), вам нужно сначала получить их:

git fetch <path_to_old_repos>

Конечно, B, E иX здесь означают их идентификаторы коммитов, если вы на самом деле не помечали / не разветвляли их.

Вы также можете сделать что-то подобное (хотя дата принятия не будет сохранена), перебрав из A в исходном хранилище и вставив на него B:

git rebase -i `A`

# change "pick b" to "squash b"

Youу вас будет возможность изменить сообщение коммита, после чего вы сможете сделать его X.

3 голосов
/ 01 февраля 2012

Вы можете использовать git cherry-pick. В вашем случае:

git cherry-pick C D E

пока Х твоя голова должна это сделать.

1 голос
/ 01 февраля 2012

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

Попробуйте что-то вроде

git checkout -b freshstart A
# modify the state of the system until it reflects your desired new beginning X
git commit --amend
git cherry-pick C D E

Теперь у вас есть ветвь с именем freshstart, у которой есть новое начало X и фиксируются C, D и E, при условии, что они хорошо сливаются с X.

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