Как перебазировать весь граф коммитов? - PullRequest
0 голосов
/ 07 ноября 2018

enter image description here

У нас есть хранилище проектов left.

Затем мы создали репозиторий клонов right из самого верхнего снимка left (и работали там несколько недель).

Как мы можем объединить два графика ?
(чтобы команда объединилась)


ПРИМЕЧАНИЕ: точка сшивания содержит те же изменения, никаких конфликтов не происходит.

1 Ответ

0 голосов
/ 07 ноября 2018

ПРИМЕЧАНИЕ. Точка сшивания содержит те же изменения, никаких конфликтов не происходит.

Итак, я думаю, вы должны использовать git replace .

Скорее всего, команда:

git replace --graft <commit> [<parent>…​] 

Если я правильно понимаю, вы хотите связать первый синий коммит с последним оранжевым, который является коммитом, который содержит точно такой же контент.

Команда немного сложнее, потому что последний оранжевый коммит является коммитом слияния, поэтому вы должны использовать sha1 из двух родителей в командной строке (от второго до последнего апельсина и последний зеленый).

Итак, команда должна быть:

git replace --graft <Sha1_of_first_blue_commit> <Sha1_of_second_to_last_orange_commit> <Sha1_of_last_green_commit>

Когда закончите, проверьте историю.

Если вас это не устраивает, удалите замененный коммит.

Если это вас устраивает, то вы должны использовать git filter-branch , чтобы сделать его постоянным (с git filter-branch -- --all), переписав всю историю после замены коммита.

Из документа:

ПРИМЕЧАНИЕ. Эта команда учитывает файл .git / info / grafts и ссылается на пространство имен refs / replace /. Если у вас есть какие-либо трансплантаты или заменяющие ссылки, выполнение этой команды сделает их постоянными.

Он изменит историю синего и последующих коммитов, поэтому, чтобы его подтолкнуть, вы должны будете сделать git push --force-with-lease для всех обновленных ссылок.

PS: Существует также возможность протолкнуть замененный объект (решение здесь ), но это не рекомендуемое решение.

...