Интерактивная перебазировка Git не требует выбора

106

Я на хозяине, и я сделал rebase -i <my_branch>

Получил это:

noop

# Rebase c947bec..7e259d3 onto c947bec
#
# 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 <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Я бы хотел выбрать не все коммиты, так как некоторые из них не приветствуются. Также как вы работаете, если хотите, чтобы некоторые файлы или изменения всегда были «локальными» в какой-то ветке? Есть такой помощник .gitignore?

Лукаш
источник

Ответы:

86

Как и при неинтерактивном перебазировании, вам нужно перебазировать конкретный коммит.

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

Я не знаю подробностей вашей ситуации, но вам может понадобиться что-то вроде этого:

# Opportunity to edit or prune commits between origin/master and current branch
git rebase -i origin/master

или

# Edit some of the last ten commits
git rebase -i HEAD~10 # Note that ~10 uses a tilde("~") not a dash("-"_) !
CB Bailey
источник
Использование HEAD~*синтаксиса помогло мне, но первое - нет.
Дев Йего
25

rebase -iбез диапазона фиксации не будут отображаться никакие фиксации. чтобы перебазировать последние, скажем, 7 коммитов, используйте следующее:

git rebase -i HEAD~7

Но будьте осторожны, это переписывает историю. не делайте этого, если коммиты уже отправлены


для вашего второго вопроса: создайте ветку с вашими изменениями (в основном ветвь конфигурации) и регулярно объединяйте в нее другие ветки . таким образом изменения не переместятся в другие ветки

вязать
источник
9

Когда вы используете git rebase -i, вы обычно должны указать, с какого коммита вы хотите выполнить перебазирование. Итак, если, например, вы хотите удалить некоторые коммиты из последних 10 в текущую ветку, вы должны сделать:

git rebase -i HEAD~10
Свик
источник
6

Как уже упоминалось, вам необходимо указать диапазон фиксации.

git rebase -i <latest-commit-to-be-retained>

(Предполагая, что вы находитесь в той же ветке, что и коммит, который нужно отредактировать) -

Чтобы указать коммиты, вы можете использовать сокращение HEAD ~ 5 или использовать контрольную сумму sha (которую вы можете получить git log)

Фактически, подойдет любой коммит, если он является предшествующим / предком тех коммитов, которые вы хотите удалить / отредактировать / изменить в дереве. В нем будут перечислены все коммиты с момента <latest-commit-to-be-retained>в редакторе (определенном в вашей конфигурации git). Чтобы удалить фиксацию из списка, просто удалите эту конкретную строку, сохраните и выйдите (vi habbits :)) файл + редактор и выполнитеgit rebase --continue

Во втором ответе я согласен с knittl.

иметь ветку с вашими изменениями (в основном ветку конфигурации) и регулярно объединять в нее другие ветки. таким образом изменения не переместятся в другие ветки

0xc0de
источник