Git: задним числом ввести несколько слияний - PullRequest
4 голосов
/ 28 октября 2010

Я пытаюсь изучить git, применяя его (задним числом) к проекту, где я некоторое время отслеживал удаленную кодовую базу. Когда я помещал все в git, я просто создал ветку remote для всех внешних версий и поместил свои версии в master, поэтому в настоящее время мой репозиторий выглядит так:

master: A0---A1.0--A1.1--A2.0--A2.1-....
          \                
remote:    B1----------B2-----------....

Мой вопрос: как мне задним числом сообщить git о произошедших слияниях, чтобы хранилище выглядело так (код не должен быть изменен):

master: A0---A1.0--A1.1--A2.0--A2.1-....
          \ /           / 
remote:    B1----------B2-----------....

Стандартный git Disclaimer: вышеуказанные действия не повлияют на опубликованную историю :)

РЕДАКТИРОВАТЬ: Ниже, как я сделал это с использованием трансплантатов, как это было предложено Кевином:

Сначала я вручную создал .git / info / grafts следующим образом (все записи - sha1):

A1.0 A0 B1
A2.0 A1.1 B2

Затем, проверив, что все выглядит хорошо (gitx), я запустил git filter-branch без аргументов.

Filter-branch сделает трансплантаты постоянными и сохранит ссылки на исходные коммиты в refs/originals/..., чтобы вы могли вернуться через git reset --hard refs/originals/refs/heads/master. Поскольку все выглядело хорошо, я удалил все остатки следующим образом:

rm .git/info/grafts
rm .git/refs/originals

Если вы собрали мусор, вам нужно вместо этого сделать git update-ref -d refs/originals/refs/heads/master.

Ответы [ 3 ]

3 голосов
/ 28 октября 2010

Звучит так, как вы хотите трансплантат . Вы можете создавать трансплантаты для новых желаемых слияний (не забудьте включить в трансплантат исходного родителя!), А когда все выглядит хорошо, используйте git filter-branch (прочитайте man-страницу!), Чтобы запечь его в камне.

2 голосов
/ 10 июня 2016

Я знаю, что это старый вопрос, но есть обновленный способ сделать это (начиная с Git 1.6.5).

git replace --graft <commit> <parent1> <parent2>

Где <> хэши SHA

2 голосов
/ 28 октября 2010

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

git rebase -i A0 master
# change the lines for A1.0 and A2.0 to "edit"
# git stops at A1.0
git merge --no-commit --strategy=ours B1     # the SHA1 of B1, of course
git commit --amend
git rebase --continue
# git stops at A2.0
git merge --no-commit --strategy=ours B2
git commit --amend
git rebase --continue

Каждый раз, когда вы останавливаетесь, вы технически объединяетесь, но со стратегией ours, которая сохраняет все содержимое вашего текущего коммита.--no-commit говорит git остановиться перед фиксацией.Затем вы изменяете текущий коммит (что в основном означает замену) слиянием, вместо того чтобы делать слияние отдельным коммитом, как вы это обычно делаете.Тада!A1.0 был заменен новым коммитом с идентичным деревом, но с дополнительным родителем.commit --amend дает вам возможность редактировать сообщение;Вы можете сделать это, чтобы оставить запись того, что вы сделали.

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