2017-02-07 39 views
1

Предположим, что-то вроде следующего:Выяснить зависимостей фиксации мы пытаемся выбрать вишню

      HEAD/master  
          | 
A<--B<--C<--D<--E<--F<--G<--J 
     ^
     official 

Где official находится филиал.
Я хотел, чтобы вишневый выбор 2 зафиксировал official ветвь, например. E и J
Оба эти фиксации были исправлениями, влияющими на те же 3 файла.
Когда я сделал git cherry-pick E, все прошло нормально, но когда я сделал git cherry-pick J У меня были некоторые конфликты.
Глядя на разницу, я понял, что мне нужно было также сделать винт для фиксации F, который сделал изменение в двух из этих трех файлов, которые менялись в основном на изменение определения метода, и J было сделано поверх этого.
Так это было легко исправить, просто делая git cherry-pick F && git cherry-pick J
Вопроса:
Если бы я не знал об изменениях, сделанных в этих файлах и совершает F было большим коммит изменение много файлов: Есть еще один способ, чтобы выяснить, на которые совершают фиксацию, которую мы пытаемся выбрать, зависит от того, не вручную ли вручную записать файл в файл и совершить фиксацию по фиксации?

ответ

0

Я получил некоторые [объединить] конфликты ... Есть еще один способ, чтобы выяснить, на котором совершает коммят мы пытаемся вишневым выбор зависит от ...

Не совсем, нет.

... без ручного ведения журнала git в файле и последующего фиксации фиксацией?

Даже это не обязательно сделает это - по крайней мере, не задумываясь о проблеме. Рассмотрим следующий фрагмент кода C:

void f(int x) { 
    int i; 

    /* 
    * additional lines here, enough to mess with git context 
    * since that only looks at +/- 3 lines around each patch 
    * segment 
    */ 

    for (i = 0; i < x; i++) 
     do_something(i); 
} 

Предположим, что один промежуточный фиксации вводит дополнительную переменную j, а затем позже вносить изменения в do_something(i)do_something(j). Если вы вишнево-выбираете только, то позднее совершите, Git с радостью изменит строку без конфликтов, но код больше не будет компилироваться, так как нет int j в функции f.

При этом можно было бы написать инструмент, который анализирует вывод git show для каждого промежуточного коммита, определяет, какие строки изменены (относительно версии в дереве работы, а не использовать фактические числа в каждой разности , так как это может зависеть от предыдущего пропущенного diff), и указывает, что вы должны совершить изменения, которые изменяют конфликтующие регионов. Но я не знаю такого инструмента.

+0

Итак, каков ваш рабочий процесс в таких случаях? Что вы нашли наиболее эффективным? – Jim

+0

@ Jim: В общем, много проверок коммитов - в основном, что вы в итоге сделали. Комплексные вишневые подборки должны быть редкими, потому что инструменты не справляются с ними, и инструменты не справляются с чем-то частично, потому что они редки, что своего рода уловка-22. – torek