git rebase
работает правильно. Он защищает ваш неотслеживаемый файл от уничтожения при посещении коммита, который хочет записать файл с тем же путем.
Похоже, что нет способа повторить только самый последний шаг перебазирования. Обычно, когда rebase делает паузу, это оставляет конфликты в индексе. Но в этом случае он не может пометить эту проблему в индексе, потому что при этом будет преобразован ваш неотслеживаемый файл в отслеживаемый файл. Это, вероятно, немного грубое место в пользовательском интерфейсе git rebase
. Вы можете покопаться в каталоге, который он использует для хранения своего внутреннего состояния (.git/rebase-apply
) и вручную применить «текущий» патч, но прерывание и перезапуск, вероятно, проще (но, возможно, не быстрее, если вы находитесь в процессе перебазирования очень долгого времени). серия).
Если добавление bar.txt
считается ошибкой, то вы можете рассмотреть возможность использования git rebase -i
, чтобы отделить и отбросить добавление и удаление bar.txt
, поскольку вы все равно переписываете историю.
Вы все равно столкнетесь с конфликтом, но методы, описанные ниже, также можно применить с git rebase -i
. Сценарий в конце должен быть разбит на две части («setup temp/
» и «включить результат перебазирования», поскольку для интерактивной перебазировки обычно требуется несколько команд между этими двумя секциями.
Временно отодвиньте конфликтующий файл и повторите восстановление.
mv bar.txt +bar.txt
git rebase --abort
git rebase master
Если вы ожидаете много таких конфликтующих файлов, то вы можете подумать о том, чтобы выполнить перебазирование в отдельном клоне, где вы можете быть уверены, что у вас не будет никаких неотслеживаемых файлов. Возможно, самая хитрая часть - это проверка того, что ваши неотслеживаемые файлы не конфликтуют с результатом перебазирования (git checkout rebased-topic
выполняет это; прерывается, если неотслеживаемые файлы конфликтуют с результатом перебазировки).
: "Note: will destroy
: * 'rebased-topic' branch
: * 'temp' directory"
( set -x &&
: '*** Clearing temp/' &&
rm -rf temp/ &&
: '*** Making sure we have topic checked out' &&
git checkout topic
: '*** Cloning into temp/' &&
git clone . temp &&
: '*** Rebasing topic onto master in temp/ clone' &&
( cd temp &&
git rebase origin/master
) &&
: '*** Fetching rebase result from topic/ into local rebased-topic branch' &&
git fetch -f temp topic:rebased-topic &&
: '*** Checking rebased-topic for conflicts with untracked files' &&
git checkout rebased-topic &&
: '*** Resetting topic to tip of rebased-topic' &&
git branch -f topic rebased-topic &&
: '*** Returning to topic branch' &&
git checkout topic &&
: '*** Deleting rebased-topic branch' &&
git branch -d rebased-topic &&
: '*** Deleting temp/' &&
rm -rf temp/
)