Git rebase интерактивный - как перебазировать коммит только эта ветка? - PullRequest
1 голос
/ 07 июля 2019

У меня есть местное отделение, назовем его DEV. Ветка коммитов истории выглядит так:

module_A: добавить проверку CRC (9273467932)

module_B: изменить процедуру выключения (84705723)

Запрос на слияние # 918 из XXX (265424)

module_D: очистка (3859236)

Слияние ветки fix_for_drain_issue (38572693)

(...)

Теперь, мне не нравится четвертое сообщение коммита «очистка», оно нечеткое, поэтому я бы хотел его отредактировать. Итак, я иду:

git rebase -i 3859236

vim открывается, и я отмечаю 3859236 как edit . Затем я делаю git commit --ammend и изменяю сообщение коммита на более информативное. Все идет нормально. Так как это было единственное изменение, которое я хотел сделать, я наконец-то выпускаю git rebase --continue И тут сюрприз:

interactive rebase in progress: (...) both modified: tools/src/file.c Как это возможно? Все, что я сделал, это просто изменение сообщения коммита, верно? Так как же в мире Git поднимает конфликтующие файлы? Моя теория состоит в том, что git пытается перебазировать все коммиты из объединенных коммитов, которые у меня есть, и это может вызвать конфликты. Особенно, если тем временем я потянул эти ветви.

Я уже все перепробовал -p, чтобы сохранить сообщения коммита; -r воссоздание коммитов слияния - безуспешно, он всегда пытался перебазировать эти ветви. Я также вижу это, когда появляется rebase edit-todo list. Это список коммитов, которых нет в моей текущей ветке, но которые находятся в тех ветках, из которых я слил или выбрал вишню.

Так что мой вопрос сводится к следующему: как я могу ограничить ребаз, чтобы только реорганизовать коммиты из этой конкретной ветки. Или, в качестве альтернативы, как редактировать, иногда коммиты сквоша в этой ветке без перебазирования.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

Вы не хотите редактировать редакцию .... вы хотите перефразировать это.

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.

И в итоге вы получите сообщениетак, потому что вы делаете за спиной ребазе.Если вы хотите использовать редактирование, когда ревизия останавливается, вы добавляете свои изменения в индекс и затем запускаете git rebase --continue , вы не можете выполнить коммит самостоятельно ... если вывыберите использование reword , после сохранения содержимого файла в редакторе, при выходе из него, rebase будет автоматически продолжаться, нет необходимости просить его продолжить.

1 голос
/ 08 июля 2019

Попробуйте тот же процесс, но с rebase -i с использованием коммита перед тем, который вы хотите отредактировать.

Это воспроизведет вашу правку поверх существующего коммита (предыдущего)

...