Почему Git Rebase Refusing to squa sh - это слияние - PullRequest
1 голос
/ 09 июля 2020

Я пытаюсь сквастать sh первые 14 коммитов вместе: git rebase -p -i HEAD~14. На следующем изображении показаны коммиты, которые я пытаюсь выполнить с помощью sh. Коммиты f101fff106d, 6a1cb904b73, 89001a588c3, 656d21e1bfa - это слияния, которые я сделал при разработке.

введите описание изображения здесь

Проблема в том, что после того, как я существую rebase, я получаю следующую ошибку:

Отказ от squa sh слияние: 656d21e1bfa84b866031e904c303662878370d14

Я не понимаю, почему я получаю эту ошибку. Как решить эту проблему?

    pick 290c32355fd Squash all commits
    s 4aa246bc4c5 Squash Commits
    s 656d21e1bfa merge with develop
    s a7448275954 tasks to do
    s 4c6198cd0f0 fix print
    pick f101fff106d Merge remote-tracking branch 'origin' into into TEST_ENGINE
    s 30f9adbe65a remove unused check
    s 7343e3565ad fix error
    s 1e3dc014f67 fix isokToupdate
    s c16412a7f83 fix isokToupdate
    pick 6a1cb904b73 Merge remote-tracking branch 'origin' into TEST_ENGINE
    pick 89001a588c3 Merge remote-tracking branch 'origin' into TEST_ENGINE
    s a32ce67d389 fix namespace
    s 2d0c8ee55e8 Refactor code and correct functional errors
    
    # Rebase a2c59ed4e21..2d0c8ee55e8 onto a2c59ed4e21 (14 commands)
    #
    # Commands:
    # p, pick = use commit
    # r, reword = use commit, but edit the commit message
    # e, edit = use commit, but stop for amending
    # s, squash = use commit, but meld into previous commit
    # f, fixup = like "squash", but discard this commit's log message
    # x, exec = run command (the rest of the line) using shell
    # d, drop = remove commit
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out

1 Ответ

1 голос
/ 09 июля 2020

Во-первых: старайтесь не сочетать git rebase -p с большинством интерактивных операций, включая squa sh, исправления или перестановки, поскольку это может привести к множеству плохих действий. Если у вас версия Git, то есть 2.18 или новее, используйте новую опцию --rebase-merges (git rebase -r для краткости), которая ведет себя гораздо лучше.

Что касается конкретной ошибки, которую вы видите: это технически невозможно перебазировать слияние вообще, и ни git rebase -p, ни новый улучшенный git rebase -r этого не делают. Вместо этого они повторно выполняют слияние. Когда они повторно выполняют слияние, именно это они и делают: повторно выполняют слияние, запустив git merge.

squa sh и операции исправления, которые выполняет git rebase, эквивалентны, более или меньше, чтобы использовать git commit --amend (а в старом интерактивном сценарии оболочки на самом деле запускал git commit --amend). Но git merge не имеет эквивалента --amend: Git просто не знает, как это сделать.

При использовании новой опции -r вы должны иметь возможность отбрасывать слияние, если вы хотите просто его опустить; или, если вы хотите превратить его в squa sh -not-really-a-merge, вы можете заменить команду merge соответствующей командой exec git merge --squash. По-прежнему потребуется вторая интерактивная -r перебазировка в squa sh итоговую фиксацию в более раннюю.

...