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 разрешить эти конфликты так же, как они были разрешены изначально.

Другие вопросы по тегам