2015-05-12 7 views
4

Моя история выглядит как это, но раз 10:Как я могу перебазироваться в один коммит с помощью Git

   i - j - e'- k - h'- l - m feature-branch 
      /
    a - b - c - d - e - f - g - h master 

(апострофов означающих вишни кирки) Я хочу, чтобы перебазировать к этому:

        i - j - k - l - m feature-branch 
           /
    a - b - c - d - e - f - g - h master 

Я не возражаю, если функция раздавлена ​​в 1 фиксацию. Основная проблема с регулярной перезагрузкой заключается в том, что она пытается переустановить один коммит за раз, и мне приходится исправлять и повторно устанавливать подобные конфликты снова и снова.

Все, что я хочу, - это занять разницу между кончиком моей ветви и кончиком мастера и применить их к вершине мастера.

+0

Это было бы намного проще с регулярным Объединять * вместо обычного перебазирования. Кроме того, при слиянии история будет точна и верна, а не содержит ложь. –

+0

Подождите ... Вы были вишневыми сборами от 'master' и помещали их в' feature-branch'? –

+0

Является ли 'e'' вишневым выбором' e' и 'h'' вишневым выбором' h'? –

ответ

5

Это на самом деле довольно просто.

  1. Merge master в feature-branch. Вы сразу же разрешите все конфликты слияния. (Я настоятельно рекомендую побудем.)

      i - j - e'- k - h'- l - m - n feature-branch 
         /      /
    a - b - c - d - e - f - g - h --------  master 
    
  2. Затем git reset --soft master. Это сделает так, что feature-branch указывает на master, но он сохранит все ваши изменения в индексе, готовые к совершению.

      i - j - e'- k - h'- l - m - n (orphaned) 
         /      /
    a - b - c - d - e - f - g - h --------  master, feature-branch 
               \ 
               (index) 
    
  3. git commit

      i - j - e'- k - h'- l - m - n (orphaned) 
         /      /
    a - b - c - d - e - f - g - h --------  master 
               \ 
               n'   feature-branch 
    

Единственная цель # 2 и # 3, чтобы уничтожить историю feature-branch. Если вы уверены, что вам никогда не понадобится эта история, все в порядке. Но кажется, что тратить все лишние неприятности, чтобы удалить точную запись того, что на самом деле произошло.

+0

Это не точное поведение, о котором я просил, но в итоге я сделал только один шаг. Это позволило сделать одну большую, но управляемую стадию разрешения конфликтов, а не тонны. мы надеемся, что тот факт, что его не переделал, чтобы выглядеть линейным, не вызывает никаких проблем в будущем. – ZMitton

2

Я принимаю e' и h' являются вишневыми кирками из e и h соответственно. Я также предполагаю, что конфликты возникают, когда Git пытается применить e' и h', но не любые другие коммиты. Пожалуйста, поправьте меня, если я ошибаюсь.

У вас есть несколько вариантов:

  • Когда git rebase капель на строке говорят, что он не может применить e' или h', запустить git rebase --skip сказать Git, чтобы пропустить совершить.

    После того, как перебазироваться будет сделано, если вы тогда хотите сквош коммиты вместе в одно:

    git reset --soft master 
    git commit 
    
  • ли интерактивный перебазироваться и сказать Git не применять e' и h':

    git checkout feature-branch 
    git rebase -i master 
    # Git will launch an editor containing an interactive rebase recipe: 
    # 1. Delete the e' and h' lines. 
    # 2. Optionally change the j through m lines to 'squash' if you 
    #  want to squash all of those commits into one. 
    # 3. Save the recipe and exit. 
    
  • git rebase - это более простой способ сделать серию команд git cherry-pick.Вы можете сделать эти команды вручную самостоятельно:

    git checkout -b temp-branch master 
    git cherry-pick i j k l m 
    # optionally, if you want to squash i through m into a single commit: 
    # git reset --soft master 
    # git commit 
    git checkout feature-branch 
    git reset --hard temp-branch 
    git branch -D temp-branch