Перенести незафиксированные изменения из текущей ветки в другую ветвь, которая конфликтует с этими изменениями

Предположим, что я на ветке master, и я начинаю вносить некоторые изменения.

Я вношу изменения в файл, который уже открыт в Emacs (поэтому под капотом, когда происходят проверки, Emacs не знает, если я не вернусь-буфер постоянно).

Файл существовал в ветке other_branch, который позже должен был быть объединен с master. Но файл не существовал в master, пока я случайно не сохранил его из Emacs.

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

Я не хочу потерять текущую работу, но также не хочу передавать ее master.

Я попытался использовать git stash, за которым следует git checkout other_branch, но это дает мне ошибку, говоря, что из-за незафиксированных изменений мне не разрешено переключать ветки на other_branch:

[email protected]:~$ git checkout other_branch
error: The following untracked working tree files would be overwritten by checkout:
    some_file
Please move or remove them before you can switch branches.
Aborting

Файлы, которые я начал (случайно) изменяя в master, уже существуют в other_branch, поэтому просто проверка other_branch приведет к уничтожению моей копии рабочего каталога, с изменениями, правильно?

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

Резюме

  • проверить новую ветвь, other_branch отслеживание master.

  • создайте новый файл test.txt в other_branch и откройте его для редактирования в Emacs. Зафиксируйте other_branch.

  • обратно в терминал, мастер проверки.

  • Вернувшись в Emacs, вы забыли, что теперь находитесь на хозяине, внесите некоторые изменения в test.txt и сохраните файл. Это абсолютно новый файл, относящийся к master.

Как вы можете получить эти изменения в other_branch?

Ответ 1

Если во время проверки не обнаружены неиспользуемые файлы, возможно, вы можете попробовать:

git stash --include-untracked

На странице git stash:

Если используется опция --include-untracked, все незатребованные файлы также сбрасываются, а затем очищаются с помощью git clean, оставляя рабочий каталог в очень чистом состоянии


Так как это тоже не сработает (на приставке), вы можете указать:

  • Сделать сообщение (в главной ветке)
  • оформление заказа и вишня, которые фиксируют
  • для управления и reset до HEAD~

Ответ 2

Временно переименовать файл?

$ mv test.txt test.txt.tmp
$ git checkout other_branch
$ mv test.txt.tmp test.txt

Проверить изменения и зафиксировать

Ответ 3

Что сработало для меня, было следующее:

От master do git add для неперехваченного конфликтующего файла. Теперь, когда он отслеживается, выполните git stash и checkout other_branch. Теперь git stash pop попытается объединить версию tracked-in-stash с версией tracked-in other_branch. Вероятно, это создаст конфликт слияния, поэтому вы должны открыть файл и разрешить любые конфликты, и обязательно git add и commit их на other_branch. Затем вернитесь к master и просто убедитесь, что файлы не поставлены для фиксации и не присутствуют в этой ветке.

Это позволяет обрабатывать их так, как если бы их отслеживали в кошельке, но без фактического фиксации и слияния с мастером.