Git: включить ветвь и игнорировать любые изменения без фиксации

Я работал над ветвью git и был готов выполнить мои изменения, поэтому я сделал коммит с полезным сообщением о фиксации. Затем я рассеянно внес небольшие изменения в код, который не стоит хранить. Теперь я хочу изменить ветки, но git дает мне,

Ошибка: у вас есть локальные изменения в "X"; не может переключать ветки.

Я думал, что могу менять ветки, не совершая. Если да, то как я могу это настроить? Если нет, как мне избавиться от этой проблемы? Я хочу игнорировать незначительные изменения без фиксации и просто изменять ветки.

Ответ 1

Вам нужно чистое состояние, чтобы сменить ветки. Оформление ветки будет разрешено только в том случае, если это не повлияет на "грязные файлы" (как отмечают Чарльз Бейли в комментариях).

В противном случае вам следует:

  • спрятать ваше текущее изменение или
  • reset --hard HEAD (если вы не против потерять эти незначительные изменения) или
  • checkout -f (При переключении ветвей продолжайте работу, даже если индекс или рабочее дерево отличается от HEAD. Это используется для исключения локальных изменений.)

Или, совсем недавно:

Продолжайте, даже если индекс или рабочее дерево отличается от HEAD.
И индекс, и рабочее дерево восстанавливаются в соответствии с целью переключения.

Это отличается от git switch -m <branch-name>, который запускает трехстороннее слияние между текущей веткой, содержимым вашего рабочего дерева и новой веткой: готово: таким образом вы не потеряете свою работу в процессе.

Ответ 2

Если вы хотите отменить изменения,

git checkout -- <file>
git checkout branch

Если вы хотите сохранить изменения,

git stash save
git checkout branch
git stash pop

Ответ 3

ну, это должно быть

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

Ответ 4

Следуйте,

$: git checkout -f

$: git checkout next_branch

Ответ 5

Обратите внимание, что если вы объединили удаленные ветки или получили локальные коммиты и хотите вернуться к удаленной HEAD, вы должны сделать:

git reset --hard origin/HEAD

HEAD только будет ссылаться только на локальный commit/merge - несколько раз я забыл, что при перезагрузке и заканчивая тем, что "ваш репозиторий X совершает движение вперед", когда я полностью намерен уничтожить ВСЕ изменения/фиксации и вернитесь к удаленной ветке.

Ответ 6

Если вы внесли изменения в файлы, которые Git также необходимо изменить при переключении ветвей, это не позволит вам. Чтобы отказаться от рабочих изменений, используйте:

git reset --hard HEAD

Затем вы сможете переключать ветки.

Ответ 7

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

git reset --hard HEAD
git clean -d -f

Ответ 8

переход на новую ветку теряет изменения:

git checkout -b YOUR_NEW_BRANCH_NAME --force

переключение на существующую ветку с потерей изменений:

git checkout YOUR_BRANCH --force

Ответ 9

Закройте терминал, удалите папку, в которой находится ваш проект, затем снова клонируйте ваш проект и вуаля.

Ответ 10

Если вы хотите сохранить изменения и изменить ветку в одной строке

git stash && git checkout <branch_name> && git stash pop

Ответ 11

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

Я создал псевдоним .gitconfig для этого:

[alias]
spcosp = !"git stash push && git checkout \"[email protected]\" && git stash pop --index #"

Чтобы изменить на new-branch-name, используйте:

git spcosp new-branch-name

И любые не зафиксированные изменения файла и индекса будут сохранены.

Ответ 12

Простой ответ:

это заставить оформить ветку

git checkout -f <branch_name>

Принудительное извлечение ветки говорит git об отмене всех изменений, которые вы сделали в текущей ветке, и извлекает желаемое.

или в случае, если вы проверяете коммит

git checkout -f <commit-hash>


"Я думал, что могу сменить ветки без коммитов. Если так, как я могу это настроить? Если нет, как мне выйти из этой проблемы?"

Ответ на этот вопрос - нет, буквально философия Git заключается в том, что вы отслеживаете все изменения, и что каждый узел (т.е. Коммит) должен быть в курсе последних внесенных вами изменений, если только вы не сделал новый коммит конечно.


Вы решили сохранить изменения?

Затем спрятать их, используя

git stash

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

git stash apply

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

git stash pop

Это эквивалент apply а затем drop