2015-04-27 4 views
7

Краткая версия:
Как перейти от левого графа вправо. Кроме того, мне нужно вручную очистить дубликаты (root2, a ', b'), или GC будет обрезать их в какой-то момент в будущем? before-afterИсправлена ​​история гитов с повторяющимися записями

Длинная версия:
Из-за плохой CVS мерзавца порта я закончил с двумя альтернативными историями в том же репо, когда я импортировал branch_1 из CVS, когда мастер уже был создан в мерзавце. Как можно видеть, существуют коммиты branch_1, которые являются уникальными, но есть и другие, которые являются дубликатами. Какой самый простой способ исправить это?

У меня есть некоторые идеи, но не знаю, как их исполнить. Можно было бы полностью удалить branch_1 и начать снова, но я не знаю, как заставить git распознавать, что root1 и root2 - это то же самое, что все патчи будут применены в той же строке. Другой идеей было бы перебазироваться F, G, H на б и каким-то образом удалить root2, а ' и Ь'. Но я думаю, что, так как нет общего предка, нормальные перебазироваться не будет работать

В действительности, дубликат совершает и уникальные фиксации филиала сотня так что-то очень ручное не является хорошим

ответ

1

Обратите внимание, что переформатирование, о котором вы просите, будет переписано хеширование фиксации все совершает на branch_1. Я использую b и b', чтобы указать хеши фиксации на вашей красивой фигуре.

git checkout branch_1 
git rebase --onto b b' 

Это соответствует следующей формы git rebase со страницы вручную:

git rebase --onto <newbase> <upstream> 

Основываясь на руководстве, следующий будет происходить.

  1. Все изменения, произведенные путем фиксации в текущей ветке, но не находящиеся в <upstream>, сохраняются во временную зону.
  2. Текущая ветка сбрасывается до <upstream>, или <newbase>, если была предоставлена ​​опция --onto.
  3. Записи, которые ранее были сохранены во временную область, затем по очереди заменяются на текущую ветку.
+0

IIUC, то, как перебабатывает работу, происходит переименование в текущей ветви с ** последнего общего предка ** между двумя ветвями. В моем случае нет общего предка. Таким образом, либо он потерпит неудачу, либо поместит * root2 * в качестве дочернего элемента * b *. В любом случае это неверно. Я что-то упускаю? – Hilikus

+1

@Hilikus, посмотрите на 'man git-rebase' и grep для опции' --onto'. – merlin2011

+0

@ Хиликус, я процитировал соответствующие части руководства. – merlin2011

2

Один из вариантов вы можете попробуйте первый, который является неразрушающим, является использование Graft Point:

# .git/info/grafts 
0000000f 0000000b 

Заменить те с SHA1s коммиттерских f и b на диаграмме.

Это изменение будет непостоянным, но должны быть в состоянии пересмотреть с:

git log --graph --all --decorate 

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

Обратите внимание, что до тех пор, пока вы не сделаете git filter-branch и нажмите, что никто больше не увидит эти изменения. Это можно рассматривать как «особенность», поскольку это не заставит кого-то еще делать беспорядочную переработку своей работы. В основном это добавляет дополнительную информацию, которая рассказывает о таких инструментах, как git-log, и поэтому, когда они смотрят на фиксацию «f», они должны притворяться, что у нее есть родительский элемент «b», без фактического обновления объекта фиксации, чтобы это отразить. Изменение родителя объекта фиксации изменяет его SHA1, поэтому это означает, что его дочерний элемент необходимо обновить, чтобы указать на новый SHA1, а затем на их детей и т. Д.

+0

Я рекомендую это по 'git rebase', потому что он сохраняет содержимое (деревья) обеих ветвей. «git rebase» сохраняет изменения (разности). –

+0

@ DietrichEpp вы имеете в виду, что я закончу левым графиком, но с дополнительным краем от 'b' до' f'? Если это то, что вы подразумеваете под «сохраняет деревья», я не хочу этого, так как оба эти дерева действительно дублируются. – Hilikus

+0

Нет, вы в основном получаете график справа, но он делает это, не переписывая ни одну вашу историю , – pioto

Смежные вопросы