git rebase через текущую ветку терпит неудачу
У меня есть проект, которым я управляю с помощью git.
Я ожидаю, что каждый коммит будет применен корректно по сравнению с предыдущей историей, так как патч для коммита генерируется самим git.
Если у меня есть
------tagA--commit_A1--commit_A2--commit_A3
\
\[branch A]
\
\-commit_A'1--commit_A'2--commit_A'3--commit_A'4
Я нахожусь на ветви A, которая произошла от tagA. Это подтверждается
git merge-base A tagA
который возвращает тэгА commit sha. Я пытался выдать
git rebase tagA
Поведение ребаз должно быть:
- перемотать назад на tagA
- применить все коммиты из tagA к кончику branchA, т.е. применить commit_A'1, commit_A'2, commit_A'3, commit_A'4
Процедура должна вернуть меня к кончику branch_A без каких-либо изменений.
Наоборот, я получаю конфликт на одном из коммитов.
пример
# git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git GIT_linux
# cd GIT_linux
# git remote add linux-at91 https://github.com/linux4sam/linux-at91.git
# git fetch linux-at91
# git checkout -b linux-3.10-at91 linux-at91/linux-3.10-at91
# git rebase v3.10
First, rewinding head to replay your work on top of it...
Applying: dmaengine: at_hdmac/trivial: correct typo in comment
Applying: dmaengine: at_hdmac: extend hardware handshaking interface identification
Applying: dmaengine: at_hdmac/trivial: rearrange CFG register bits assignment
Applying: DMA: AT91: Get transfer width
Applying: DMA: AT91: Get residual bytes in dma buffer
Applying: dma: use platform_{get,set}_drvdata()
Applying: dma: mxs-dma: Staticize mxs_dma_xlate
Applying: dma: at_hdmac: remove unnecessary platform_set_drvdata()
Applying: dma: timb_dma: remove unnecessary platform_set_drvdata()
Applying: dw_dmac: remove inline marking of EXPORT_SYMBOL functions
Applying: dma: tegra20-apbdma: err message correction
Applying: dma: tegra: avoid channel lock up after free
Applying: dmaengine: sirf: set dma residue based on the current dma transfer position
Applying: dma: of: Remove restriction that #dma-cells can't be 0
Applying: dma: of: Remove check on always true condition
Applying: dma: of: Remove restriction that #dma-cells can't be 0
Using index info to reconstruct a base tree...
M drivers/dma/of-dma.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/dma/of-dma.c
CONFLICT (content): Merge conflict in drivers/dma/of-dma.c
Failed to merge in the changes.
Есть ли причина для этого? Мой репозиторий как-то поврежден?
Rebase не работает, слияние делает...
Я попробовал наоборот, и я мог бы сделать это
git checkout -b my3.10.84 v3.10.84
git merge linux-at91/linux-3.10-at91
Это привело к появлению пары конфликтующих файлов, которые я исправил и зафиксировал.
1 ответ
Эта ошибка, кажется, указывает на то, что диапазон коммитов, которые вы пытаетесь перебазировать, содержит слияния. Я проверил вашу последовательность выше, но за исключением добавления -p
возможность git rebase
(чтобы сохранить коммиты слияния вместо их пропуска):
# git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git GIT_linux
# cd GIT_linux
# git remote add linux-at91 https://github.com/linux4sam/linux-at91.git
# git fetch linux-at91
# git checkout -b linux-3.10-at91 linux-at91/linux-3.10-at91
# git rebase -p v3.10
Это, кажется, избежало конфликта. Я думаю, что происходило то, что попытка перебазирования без включения слияний из ветви источника не включала какие-либо конфликты слияний, которые были разрешены этими слияниями, и поэтому вам пришлось бы заново разрешать каждый конфликт, который был разрешен в любом из слияния из исходной ветки. В том числе слияния в ребазе разрешены git
разрешить эти конфликты так же, как они были разрешены изначально.