2010-04-29 5 views
40

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

a-b-c-d-e-f-g (branchA) 
/
--o-x-x-x-x-x-x-x-x-x-x (master) 
    \ 
    x-x-x-x-x (branchB) 

(буквы обозначают зафиксируется, а «х» не имеют никаких отношение фиксации.)

Однако я заметил, что было бы неплохо объединить некоторые коммиты. Я хочу «конкатенировать» фиксацию a, d, e и g в один патч и передать его в мастер. Записывает b и f, чтобы они выполнялись как один фиксатор для ветви. Есть ли хороший способ «git'-ish» достичь этого?

+4

Два ответы уже даны Упоминание правильная команда, но я думаю, что с такой основной задачей, как эта, это стоит иметь настоящие инструкции здесь, в StackOverflow, поэтому я разместил некоторые. (Я удивлен, что не могу найти хороший предыдущий вопрос для ссылки.) – Cascabel

ответ

1

git rebase --interactive

Ссылки:

+0

Пожалуйста, добавьте соответствующие данные из вашей ссылки, чтобы предоставить полный и автономный ответ. ТАК хмурится «ответами только на связь». В частности, как можно использовать 'git rebase --interactive' для достижения цели OP? – SherylHohman

0

git rebase является то, что вы хотите. Проверьте параметр -interactive.

+0

Пожалуйста, добавьте соответствующие данные из вашей ссылки, чтобы предоставить полный и автономный ответ. ТАК хмурится «ответами только на связь». – SherylHohman

69

Команда, которую вы ищете, это git rebase, в частности параметр -i/--interactive.

Я собираюсь предположить, что вы хотите оставить commit c на ветке A, и что вы действительно имеете в виду, что хотите переместить другие коммиты в другие ветви, а не слияния, поскольку слияния просты. Давайте начнем манипулируя ветвь A.

git rebase -i <SHA1 of commit a>^ branchA 

^ означает, что предыдущий коммит, поэтому эта команда говорит перебазироваться ветвь А с использованием фиксации перед «а» в качестве базы. Git представит вам список коммитов в этом диапазоне. Reorder их и сказать ублюдка пережать подходящие из них:

pick c ... 
pick a ... 
squash d ... 
squash e ... 
squash g ... 
pick b 
squash f 

Теперь история должна выглядеть следующим образом:

c - [a+d+e+g] - [b+f] (branchA) 
/
--o-x-x-x-x-x-x-x-x-x-x (master) 

Теперь, давайте захватить вновь раздавленный совершить б + п для branchB.

git checkout branchB 
git cherry-pick branchA # cherry-pick one commit, the tip of branchA 

И то же самое для + D + E + G для мастера:

git checkout master 
git cherry-pick branchA^ 

Наконец, обновление branchA так указывает с:

git branch -f branchA branchA^^ 

Теперь мы должны иметь:

c (branch A) - [a+d+e+g] - [b+f] (dangling commits) 
/
--o-x-x-x-x-x-x-x-x-x-x-[a+d+e+g] (master) 
    \ 
    x-x-x-x-x-[b+f] (branchB) 

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

# create a temporary branch 
git branch fromAtoB branchA 
# move branchA back two commits 
git branch -f branchA branchA~2 
# rebase those two commits onto branchB 
git rebase --onto branchB branchA fromAtoB 
# merge (fast-forward) these into branchB 
git checkout branchB 
git merge fromAtoB 
# clean up 
git branch -d fromAtoB 

Наконец, отказ от ответственности: Это вполне возможно, чтобы изменить порядок коммитов таким образом, что некоторые уже не применяются чисто. Это может быть связано с тем, что вы выбрали плохой порядок (установив патч перед фиксацией, введя исправленную функцию); в этом случае вы хотите прервать переустановку (git rebase --abort).В противном случае вам придется разумно исправлять конфликты (как и при конфликтах слиянием), добавлять исправления, а затем запускать git rebase --continue для перехода. Эти инструкции также предоставляются сообщением об ошибке, напечатанным при возникновении конфликта.

+0

- это не диаграмма после 'git branch -f branchA branchA ^^' неправильно? А именно, не следует, чтобы ветвь A указывала на c в этой точке, так что первая строка диаграммы - 'c (branchA)', а не 'c - [a + d + e + g] - [b + f] (branchA) '? – ntc2

+0

@enoksrd: Да, есть ошибка, но у вашего редактирования были ошибки. Я исправлю это, когда у меня появится шанс. – Cascabel

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